基于mice包多重插补数据集的IRT参数合并估计问题求助
解决多重插补后IRT项目参数合并的问题
问题核心是pool()函数依赖tidy()方法提取模型参数,但TAM包的tam.mml对象没有内置该方法,导致报错。以下是两种可行的解决方案:
方法一:手动按Rubin规则合并参数
这是最稳妥的方案,直接基于Rubin多重插补合并规则计算,无需依赖额外方法适配。
示例代码:
library(mice) library(TAM) library(dplyr) # 假设已生成多重插补对象imp,问卷数据矩阵为resp_data # 运行每个插补数据集的IRT模型(替换为你的模型类型:1PL/2PL/3PL) mi_fit <- with(imp, tam.mml(resp = resp_data, irtmodel = "2PL")) # 定义参数提取函数,根据模型调整提取的参数项 extract_irt_params <- function(fit) { item_params <- fit$item$x item_se <- fit$item$se # 整理为数据框,3PL需添加猜测参数c及对应标准误 params_df <- data.frame( item = rownames(item_params), a = item_params[, "a"], se_a = item_se[, "a"], b = item_params[, "b"], se_b = item_se[, "b"], stringsAsFactors = FALSE ) return(params_df) } # 提取所有插补模型的参数 params_list <- lapply(mi_fit$analyses, extract_irt_params) params_all <- bind_rows(params_list, .id = "imputation") # 按项目分组应用Rubin规则计算合并参数 pooled_params <- params_all %>% group_by(item) %>% summarise( # 合并估计值:各插补参数的均值 a_pooled = mean(a), b_pooled = mean(b), # 内插补方差:各插补标准误平方的均值 var_a_within = mean(se_a^2), var_b_within = mean(se_b^2), # 插补间方差:参数估计的方差 var_a_between = var(a), var_b_between = var(b), # 合并标准误 se_a_pooled = sqrt(var_a_within + (1 + 1/nrow(imp$imp)) * var_a_between), se_b_pooled = sqrt(var_b_within + (1 + 1/nrow(imp$imp)) * var_b_between), # Rubin规则的自由度(可选) df_a = (nrow(imp$imp)-1) * (1 + var_a_within/((1+1/nrow(imp$imp))*var_a_between))^2, df_b = (nrow(imp$imp)-1) * (1 + var_b_within/((1+1/nrow(imp$imp))*var_b_between))^2 ) # 查看合并结果 print(pooled_params)
方法二:自定义tidy方法适配pool()
为tam.mml对象编写tidy()方法,让pool()能自动识别并提取参数。
示例代码:
# 为tam.mml对象自定义tidy方法(以2PL为例,3PL需调整参数列) tidy.tam.mml <- function(x, ...) { item_params <- x$item$x item_se <- x$item$se # 转换为长格式,每行对应一个项目的一个参数 params_tidy <- data.frame( term = rep(rownames(item_params), ncol(item_params)), parameter = rep(colnames(item_params), each = nrow(item_params)), estimate = as.vector(item_params), std.error = as.vector(item_se), stringsAsFactors = FALSE ) return(params_tidy) } # 直接调用pool()合并模型结果 pooled_fit <- pool(mi_fit) # 查看合并后的参数估计及标准误 summary(pooled_fit)
注意事项:
- 若使用3PL模型,需在参数提取逻辑中添加猜测参数
c的提取 - "Infinite sample size assumed"警告是
pool()默认大样本假设导致的,若需有限样本自由度,可使用方法一中的自由度计算逻辑,或在pool()中指定rule="rubin1987"(需对应mice版本支持)
内容的提问来源于stack exchange,提问作者Enes Bayrakoglu
相关产品推荐
相关产品推荐

