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

如何基于MICE合并插补模型在R中生成预测值

解决mipo类模型无法使用margins::prediction()的问题

你的问题核心是margins包的prediction()函数不支持mice包生成的mipo类(合并插补模型)对象,导致变量名解析出错。下面针对你提出的两种思路给出具体实现方案:

思路a:构建兼容glm类的伪模型对象

我们可以手动创建一个结构简化的glm对象,将mipo模型的合并系数和原模型公式填入,让prediction()函数能够识别:

# 假设你已经得到合并后的mipo模型对象mipo_model
library(faraway)
library(mice)
library(margins)

# 1. 提取合并后的回归系数
merged_coefs <- coef(mipo_model)

# 2. 指定原逻辑回归的模型公式(替换为你实际使用的公式)
model_formula <- test ~ pregnant + glucose + pressure + triceps + insulin + mass + pedigree + age

# 3. 创建一个空的glm框架,替换关键组件
fake_glm <- glm(model_formula, data = pima, family = binomial)
fake_glm$coefficients <- merged_coefs
# 保留原模型的family信息,确保预测时使用正确的链接函数

# 4. 调用prediction函数
pred_result <- prediction(fake_glm, at = list(pregnant = 3))

注意:这个伪glm对象没有原始模型的残差、拟合值等附属信息,但对于预测和边际效应计算来说,只要系数和公式准确,完全可以满足需求。

思路b:手动提取参数计算预测值

跳过模型类的适配,直接用合并后的系数手动计算预测概率,步骤更直接:

# 1. 提取合并后的系数
merged_coefs <- coef(mipo_model)

# 2. 构建预测数据集:以原数据集的变量均值为基准,设置pregnant=3
# 提取模型中的自变量(排除截距项)
vars <- names(merged_coefs)[-which(names(merged_coefs) == "(Intercept)")]
pred_data <- as.data.frame(lapply(pima[, vars], function(x) if(is.numeric(x)) mean(x, na.rm = TRUE) else x[1]))
pred_data$pregnant <- 3

# 3. 添加截距项列,用于矩阵计算
pred_data$`(Intercept)` <- 1

# 4. 计算线性预测值并转换为概率
linear_pred <- as.matrix(pred_data[, names(merged_coefs)]) %*% merged_coefs
pred_prob <- plogis(linear_pred)

# 若需要和prediction函数输出类似的结构,可自行整理
pred_output <- data.frame(fitted_prob = pred_prob, pregnant = rep(3, nrow(pred_data)))

额外提示:如果需要更严谨的插补后预测,也可以考虑在每个插补数据集上分别预测,再合并预测结果(即「预测再合并」),但这和你要的「合并再预测」思路不同。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:10:30