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

使用mice完成多重插补后合并结果遇“No tidy method for class qr”错误

解决mice多重插补后pool()报错"No tidy method for objects of class qr"的问题

错误原因

你的代码核心问题是违背了mice的标准工作流程:

  1. 你将mids插补对象(imp)转成长格式数据框后手动计算总分,再用with()跑回归——这会让with()返回普通的线性回归结果(或分组结果),而非mice需要的mira对象(多个插补数据集的模型集合)。
  2. pool()函数仅能处理mira对象,当传入普通lm对象时,会试图解析其内部的qr组件,从而触发"No tidy method for objects of class qr"错误。

另外,你的IBQ_surgency计算写法有隐患:sum(IBQ_1 + IBQ_2+ IBQ_7 + IBQ_8, IBQ_13 + ...)的sum()参数格式不规范,虽然结果可能正确,但更稳妥的方式是用rowSums()指定变量列表。

解决方案

方案一:直接在模型公式中计算总分(推荐,符合mice原生流程)

无需提前处理数据集,直接在with(imp, ...)的模型公式里计算总分,让mice自动在每个插补数据集上执行计算与回归:

# 执行多重插补,得到mids对象
imp <- mice(df_2, m = 5, seed = 2023)

# 直接在with中对mids对象操作,公式内计算总分
fit_imp <- with(imp, 
                lm(DS_score ~ 
                     # DASS总分:21项求和
                     (DASS_1 + DASS_6 + DASS_8 + DASS_11 + DASS_12 + DASS_14 + DASS_18 +
                      DASS_2 + DASS_4 + DASS_7 + DASS_9 + DASS_15 + DASS_19 + DASS_20 +
                      DASS_3 + DASS_5 + DASS_10 + DASS_13 + DASS_16 + DASS_17 + DASS_21) +
                     # IBQ_surgency:指定项求和
                     (IBQ_1 + IBQ_2 + IBQ_7 + IBQ_8 + IBQ_13 + IBQ_14 + IBQ_15 + 
                      IBQ_20 + IBQ_21 + IBQ_26 + IBQ_27 + IBQ_36 + IBQ_37) +
                     # COPE总分:所有COPE项求和
                     (COPE_1 + COPE_2 + COPE_3 + COPE_4 + COPE_5 + COPE_6 + COPE_7 + 
                      COPE_8 + COPE_9 + COPE_10 + COPE_11 + COPE_12 + COPE_13 + COPE_14 + 
                      COPE_15 + COPE_16 + COPE_17 + COPE_18 + COPE_19 + COPE_20 + COPE_21 + 
                      COPE_22 + COPE_23 + COPE_24 + COPE_25 + COPE_26 + COPE_27 + COPE_28) +
                     # ISEL_appraisal:指定项求和
                     (ISEL_2 + ISEL_4 + ISEL_6 + ISEL_11) +
                     # TIPS总分:所有TIPS项求和
                     (TIPS_1 + TIPS_2 + TIPS_3 + TIPS_4 + TIPS_5 + TIPS_6 + TIPS_7 + 
                      TIPS_8 + TIPS_9 + TIPS_10 + TIPS_11 + TIPS_12 + TIPS_13 + TIPS_14)
                ))

# 合并插补模型结果
pool_imp <- pool(fit_imp)
# 查看合并后的结果
summary(pool_imp)

方案二:提前在每个插补数据集上计算总分(适合需复用总分的场景)

如果需要将总分变量保留在数据集中,可以对每个插补数据集单独计算总分,再转回mids对象后执行回归:

imp <- mice(df_2, m = 5, seed = 2023)

# 对每个插补数据集计算总分,生成带总分的mids对象
imp_with_scores <- lapply(1:imp$m, function(i) {
  # 提取第i个插补数据集
  df <- complete(imp, i)
  # 计算各类总分
  df %>% mutate(
    DASS_total = rowSums(select(df, starts_with("DASS_"))), # 自动匹配所有DASS开头的变量
    IBQ_surgency = rowSums(select(df, IBQ_1, IBQ_2, IBQ_7, IBQ_8, 
                                  IBQ_13, IBQ_14, IBQ_15, IBQ_20, 
                                  IBQ_21, IBQ_26, IBQ_27, IBQ_36, IBQ_37)),
    COPE_total = rowSums(select(df, starts_with("COPE_"))),
    ISEL_appraisal = rowSums(select(df, ISEL_2, ISEL_4, ISEL_6, ISEL_11)),
    TIPS_total = rowSums(select(df, starts_with("TIPS_")))
  )
}) %>% 
  # 将列表转回mids对象
  mice::as.mids()

# 基于带总分的mids对象跑回归
fit_imp <- with(imp_with_scores, 
                lm(DS_score ~ DASS_total + IBQ_surgency + COPE_total + ISEL_appraisal + TIPS_total))

# 合并结果
pool_imp <- pool(fit_imp)
summary(pool_imp)

注意事项

  • 计算总分时优先使用rowSums(),避免手动相加时遗漏变量或写错符号。
  • 确保所有用于计算总分的变量在插补阶段被正确处理(即mice为这些变量指定了合适的插补方法)。

内容的提问来源于stack exchange,提问作者Lisa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:53:14