mice多重插补后feols固定效应回归遇data缺失错误的解决咨询
解决mice插补后调用feols/feglm的data参数错误问题
核心原因
with.mids(mice包处理插补数据集的with方法)是为传统线性模型(如lm)设计的,而fixest包的feols/feglm要求必须显式指定data参数,with()的调用逻辑没法满足这个要求,所以报错。
直接解决方案:手动循环插补数据集
放弃用with(),直接取出每个插补后的数据集跑回归,代码示例:
# 加载必要包 library(mice) library(fixest) # 假设你的插补结果对象是imp(mids类) # 初始化列表存储每个插补数据集的回归结果 reg_list <- list() # 循环遍历所有插补数据集 for (i in 1:imp$m) { # 取出第i个插补完成的数据集 imp_data <- complete(imp, action = i) # 显式指定data参数跑feols回归 reg_list[[i]] <- feols( 你的公式, # 比如 y ~ var1 + var2 | fe_group + fe_year data = imp_data ) }
更简洁的写法(用purrr)
如果习惯用tidyverse风格,可以用purrr::map替代循环:
library(purrr) reg_list <- map(1:imp$m, ~feols(你的公式, data = complete(imp, .x)))
后续:合并插补回归结果
因为fixest的回归对象不是标准lm类,默认的pool()函数没法直接用,你可以手动按照mice的合并规则处理:
# 提取所有回归的系数和方差协方差矩阵 coefs <- map_dfr(reg_list, ~as.data.frame(t(coef(.x))), .id = "imputation") vcovs <- map(reg_list, vcov) # 计算合并后的系数(均值) pooled_coef <- colMeans(coefs[, -1]) # 计算合并后的标准误(mice的规则:内插补方差 + 插补间方差*(1+1/m)) within_var <- colMeans(do.call(rbind, lapply(vcovs, diag))) between_var <- apply(coefs[, -1], 2, var) pooled_se <- sqrt(within_var + (1 + 1/imp$m)*between_var) # 输出合并结果 cbind(系数 = pooled_coef, 标准误 = pooled_se)
内容的提问来源于stack exchange,提问作者lam
相关产品推荐
相关产品推荐

