如何编写函数从mice的mids对象正确提取缺失信息占比(FMI)?
问题根源
你的函数错误在于:
- 直接提取了原始未插补数据
dsn$data[, as.character(pars$varname)],而非每个插补后的数据集; - 在
with(dsn, lm(var2use ~1))中,var2use是外部环境的变量,没有在每个插补数据集的环境内解析,导致所有插补模型都用了同一组原始数据,插补间变异b为0,最终FMI等统计量完全错误。
正确实现方法
需要让lm表达式在每个插补数据集的环境中正确解析目标变量,以下两种方法都可以实现:
方法1:动态构建公式字符串
get_fmi <- function(dsn, varname) { # 将变量名转为字符串 var_str <- as.character(substitute(varname)) # 动态构建公式并在每个插补数据集上拟合 fit <- with(dsn, lm(formula(paste(var_str, "~ 1")))) # 合并结果 pool(fit) }
方法2:使用substitute传递表达式
get_fmi <- function(dsn, varname) { # 构建针对目标变量的lm表达式 fit_expr <- substitute(lm(y ~ 1), list(y = substitute(varname))) # 在每个插补数据集上执行表达式 fit <- with(dsn, eval(fit_expr)) # 合并结果 pool(fit) }
验证结果
调用函数:
get_fmi(imp, chl)
输出与手动计算完全一致:
Class: mipo m = 5 term m estimate ubar b t dfcom df riv lambda fmi 1 (Intercept) 5 192.944 65.01424 5.91888 72.1169 24 19.10544 0.1092477 0.0984881 0.1800528
内容的提问来源于stack exchange,提问作者rmbaskin
相关产品推荐
相关产品推荐

