如何从原数据集移除fixest::feols丢弃的观测值?
解决fixest::feols中用obs_selection清理数据并合并残差的问题
问题原因
你之前的错误是因为obs_selection返回的是逻辑向量(TRUE/FALSE),而非整数行号,所以不能用-运算符取反。逻辑向量的取反需要用!,但更直接的方式是直接用该向量筛选模型保留的观测。
解决方案
1. 筛选清理后的数据集
直接用obs_selection作为索引,提取模型实际使用的观测:
clean_data <- fake_data[fake_lm$obs_selection, ]
这里fake_lm$obs_selection中TRUE的位置就是模型保留的行,直接索引即可得到无缺失值、和模型匹配的数据集。
2. 合并残差
模型的$residuals顺序和clean_data的行顺序完全对应,直接添加为新列即可:
clean_data$residuals <- fake_lm$residuals
完整示例
library(fixest) set.seed(123) # 生成带缺失值的示例数据 fake_data <- data.frame( y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100) ) fake_data$x1[sample(1:100, 5)] <- NA # 插入5个缺失值 # 运行线性模型 fake_lm <- feols(y ~ x1 + x2, data = fake_data) # 筛选清理后的数据 clean_data <- fake_data[fake_lm$obs_selection, ] # 合并残差 clean_data$residuals <- fake_lm$residuals # 验证:清理后的数据行数等于模型观测数 nrow(clean_data) == fake_lm$nobs # 返回TRUE
额外提示
- 对于百万级数据集,逻辑索引比转换为行号(如
which(fake_lm$obs_selection))更高效,避免不必要的性能损耗。 - 如果需要查看被丢弃的观测行号,可以用
which(!fake_lm$obs_selection),但一般不需要,直接用逻辑向量筛选即可。
内容的提问来源于stack exchange,提问作者KLB
相关产品推荐
相关产品推荐

