You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:45:05