You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:02:31