R语言lm回归使用~.排除指定变量运行异常问题咨询
问题原因
- 核心原因是
lm()的缺失值处理逻辑和公式中.的解析规则差异:lm()默认对所有公式中涉及的变量执行行删除(只要某变量有缺失值,对应整行观测都会被丢弃)。当你使用Life.expectancy ~ . - Alcohol - Total.expenditure简写时,R解析公式时会先将数据框所有列(包括你要排除的Alcohol、Total.expenditure)纳入缺失值检查范围,只要这两个变量存在缺失值,对应行就会被删除。你提供的输出里简写写法共删除了181个观测,仅剩2个有效观测,自然会出现自由度为0、系数大量为NA的异常结果。
而你手动输入自变量时,公式里完全没有出现Alcohol和Total.expenditure,lm()只会检查你手动列出的变量的缺失值,仅删除了53个观测,样本量足够得出正常结果。 - 额外笔误提醒:你最初贴的错误长公式里将因变量
Life.expectancy也放入了自变量列表,不过你实际运行的长公式已修正该问题,不影响结果。
解决方法
两种方案都可以实现简写需求,同时避开上述问题:
- 提前从数据框中删除不需要的变量,再用
.简写建模
# 先移除Alcohol、Total.expenditure两列 life_2015_clean_v2 <- subset(life_2015_clean, select = -c(Alcohol, Total.expenditure)) # 直接用.代表所有剩余自变量 modreg_trein <- lm(Life.expectancy ~ ., data = life_2015_clean_v2)
- 动态构造回归公式,不用
.简写
# 提取所有自变量,排除因变量和不需要的两个变量 predictors <- setdiff(colnames(life_2015_clean), c("Life.expectancy", "Alcohol", "Total.expenditure")) # 生成公式 reg_formula <- reformulate(predictors, response = "Life.expectancy") # 建模 modreg_trein <- lm(reg_formula, data = life_2015_clean)
内容的提问来源于stack exchange,提问作者BuddhiLW
相关产品推荐
相关产品推荐

