使用mice完成多重插补后合并结果遇“No tidy method for class qr”错误
解决mice多重插补后pool()报错"No tidy method for objects of class qr"的问题
错误原因
你的代码核心问题是违背了mice的标准工作流程:
- 你将
mids插补对象(imp)转成长格式数据框后手动计算总分,再用with()跑回归——这会让with()返回普通的线性回归结果(或分组结果),而非mice需要的mira对象(多个插补数据集的模型集合)。 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
相关产品推荐
相关产品推荐

