R语言线性回归模型中na.rm参数的使用方法及替代方案咨询
R线性回归处理缺失值的正确方式
首先明确:lm()函数本身没有na.rm参数,直接在lm里加这个参数是无效的。但你在scale()里用na.rm=TRUE是有作用的,不过它的效果和你想要的"移除所有缺失值"不是一回事,下面详细说明:
1. scale()中na.rm=TRUE的作用
scale()的na.rm参数是用来计算标准化所需的均值、标准差时忽略缺失值,但原始数据中的NA会保留下来。也就是说,某行如果DDF1是NA,scale(DDF1, na.rm=TRUE)后这一行还是NA,最终lm依然会默认把整行含NA的观测删掉(因为lm默认的na.action=na.omit)。
另外你的示例代码存在语法错误:比如dta$CTSO(dta$Year == 1997)这种写法不对,筛选子集应该用方括号[],不是圆括号()。
2. 移除所有缺失值的正确方法
如果你想移除所有含缺失值的样本行,有两种更清晰的做法:
方法一:先清理数据,再做回归
先筛选出1997年的子集,再移除含缺失值的行,最后跑回归:
# 筛选1997年的数据 dta_1997 <- dta[dta$Year == 1997, ] # 移除所有含缺失值的行 dta_clean <- na.omit(dta_1997) # 运行线性回归(变量已标准化的话可以直接用,或者在公式里scale) Model1 <- lm(CTSO ~ scale(VM) + scale(AVMT) + scale(DDF1), data = dta_clean)
方法二:在lm中指定na.action
lm默认的na.action就是na.omit,会自动删除所有含缺失值的观测行。你可以直接在lm里用data参数指定子集,不用手动写向量索引:
Model1 <- lm(CTSO ~ scale(VM) + scale(AVMT) + scale(DDF1), data = dta[dta$Year == 1997, ], na.action = na.omit)
(因为na.omit是默认值,所以na.action参数可以省略不写)
3. 总结
- 不要在
lm()函数里加na.rm,这个函数不支持该参数; scale()里的na.rm=TRUE仅用于计算标准化统计量时忽略NA,不会移除整行观测;- 移除所有缺失值的核心是用
na.omit()处理数据,或者依赖lm默认的na.action=na.omit行为; - 写代码时尽量用
data参数指定数据集,避免dta$变量名[子集]这种冗长且易出错的写法。
内容的提问来源于stack exchange,提问作者Lexi Kurszewski
相关产品推荐
相关产品推荐

