使用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
相关产品推荐
相关产品推荐

