R中subset()删列与公式内直接删变量的差异及结果不同原因
两种移除变量的lm回归方法差异解析
在分析airquality数据集时,以下两段看似都是移除Solar.R变量的代码,却得到不同的回归结果:
data(airquality) # using subset() summary(lm(Ozone ~., data = subset(airquality, select = -Solar.R))) # direct manipulation summary(lm(Ozone ~. -Solar.R, data = airquality))
核心差异:缺失值处理顺序不同
subset()前置移除列:subset(airquality, select = -Solar.R)会先从数据集中删除Solar.R列,再将剩余数据(Ozone、Wind、Temp、Month、Day)传入lm()。lm()默认执行na.action = na.omit,此时仅会删除剩余列中存在缺失值的行——也就是只剔除Ozone有缺失的行。- 公式内移除变量:
Ozone ~. -Solar.R是在模型公式层面排除Solar.R,但lm()会先基于完整原始数据集处理缺失值:只要原始数据中任意一列(包括Solar.R)存在缺失值,该行就会被剔除,之后再在剩余的无缺失值样本中拟合去掉Solar.R的模型。
结果不同的具体原因
airquality数据集中,Solar.R存在7行缺失值,Ozone存在37行缺失值:
- 使用
subset()方法时,最终参与回归的样本量为116行(仅剔除Ozone缺失的行); - 使用公式移除方法时,最终参与回归的样本量为111行(剔除所有含
Solar.R或Ozone缺失的行)。
由于参与回归的样本集合不同,最终得到的回归系数、拟合优度等结果自然存在差异。
内容的提问来源于stack exchange,提问作者nightstand
相关产品推荐
相关产品推荐

