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

使用metafor的predict.rma为三次多项式rma.mv对象生成预测区间报错求助

问题解决:rma.mv三次多项式模型预测区间生成报错

错误原因

你的三次模型通过poly(c_treattemp, degree=3, raw=TRUE)生成了原始多项式的一次、二次、三次项(模型内变量名类似poly(c_treattemp, degree=3, raw=TRUE)1/2/3),但传入predict.rma的newmods仅包含原始c_treattemp值,函数无法自动匹配模型所需的多项式特征,因此报变量匹配错误。

两种解决方法

方法一:与建模逻辑一致,用poly生成多项式特征

直接对采样数据的c_treattemp执行相同的poly转换,生成模型需要的三次项特征:

# 生成采样数据(保留数据框格式,不要转矩阵)
sampledata <- data.frame(c_treattemp = seq(min(rdata$c_treattemp), max(rdata$c_treattemp), length.out = 100))

# 生成与建模时一致的三次多项式特征
sampledata_poly <- poly(sampledata$c_treattemp, degree=3, raw=TRUE)

# 传入多项式特征执行预测
preds_3 <- data.frame(predict.rma(meta_3, newmods = sampledata_poly, digits = 2, addx=TRUE))

# 可选:合并原始温度值与预测结果
preds_3 <- cbind(sampledata, preds_3)

方法二:手动构造多项式项,避免poly自动命名问题

建模时放弃poly,手动计算一次、二次、三次项,让变量名更直观,也便于构造预测用的特征:

# 1. 给原始数据集添加多项式项
rdata$temp_1 <- rdata$c_treattemp
rdata$temp_2 <- rdata$c_treattemp^2
rdata$temp_3 <- rdata$c_treattemp^3

# 2. 重新构建三次模型
meta_3 <- rma.mv(es, VCV, mod= ~temp_1 + temp_2 + temp_3, 
                 random= list(~ 1|study_code, ~1|obs), data= rdata, method= "REML")

# 3. 给采样数据添加对应多项式项
sampledata <- data.frame(c_treattemp = seq(min(rdata$c_treattemp), max(rdata$c_treattemp), length.out = 100))
sampledata$temp_1 <- sampledata$c_treattemp
sampledata$temp_2 <- sampledata$c_treattemp^2
sampledata$temp_3 <- sampledata$c_treattemp^3

# 4. 传入匹配的特征执行预测(注意列顺序要和模型自变量顺序一致)
preds_3 <- data.frame(predict.rma(meta_3, newmods = sampledata[, c("temp_1", "temp_2", "temp_3")], 
                                  digits = 2, addx=TRUE))
preds_3 <- cbind(sampledata, preds_3)

注意事项

  • 若建模时未用raw=TRUE(即使用正交多项式),则必须用相同的poly逻辑生成预测特征,不能手动计算x²/x³,否则特征不匹配。
  • newmods的列数、顺序必须与模型中除截距外的自变量完全一致,函数按位置匹配特征。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:47:25