如何在lm函数中按条件使用多列子集并动态添加控制变量?
问题解决方案
1. 修复subset参数失效问题
你的subset写法存在两个核心错误,导致筛选规则不生效:
- 变量名不需要加引号,加引号后变成了字符串字面量比较,而非调用数据集中的变量
- 用
!=和向量对比会触发循环匹配,逻辑错误,应该用%in%取反来排除多个值
修正后的代码:
mod1 <- lm(dc20_pos_jobs ~ dc20_party_id + dc20_education, data, subset = (dc20_pos_jobs != 5 & !dc20_party_id %in% c(6,7,8)) )
dc20_pos_jobs != 5:直接排除该变量取值为5的观测!dc20_party_id %in% c(6,7,8):精准排除政党ID为6、7、8的观测,%in%是R中判断值是否在向量里的标准用法
2. 添加条件控制变量
要实现根据dc20_party_id的不同取值加入对应控制变量,有两种简洁的实现方式:
方法一:生成条件变量后加入模型
先构造两个新变量,仅在对应政党ID组赋值,其余组设为NA(lm会自动忽略NA,不干扰回归):
# 政党ID=1时赋值dc20_party_rating_23,其余为NA data$rating_23 <- ifelse(data$dc20_party_id == 1, data$dc20_party_rating_23, NA) # 政党ID=2-5时赋值dc20_party_rating_24,其余为NA data$rating_24 <- ifelse(data$dc20_party_id %in% 2:5, data$dc20_party_rating_24, NA) # 代入回归模型 mod2 <- lm(dc20_pos_jobs ~ dc20_party_id + dc20_education + rating_23 + rating_24, data, subset = (dc20_pos_jobs != 5 & !dc20_party_id %in% c(6,7,8)) )
方法二:直接在公式中用条件表达式
不需要生成新变量,用I()函数包裹条件表达式,避免被公式解析规则拆分:
mod3 <- lm(dc20_pos_jobs ~ dc20_party_id + dc20_education + I(ifelse(dc20_party_id == 1, dc20_party_rating_23, 0)) + I(ifelse(dc20_party_id %in% 2:5, dc20_party_rating_24, 0)), data, subset = (dc20_pos_jobs != 5 & !dc20_party_id %in% c(6,7,8)) )
非对应组的观测赋值为0,不会对该组的回归系数产生影响,实现了分条件加入控制变量的需求。
内容的提问来源于stack exchange,提问作者François Verreault Girard
相关产品推荐
相关产品推荐

