glmmTMB设置re.form=NA预测时报找不到animal_ID对象错误
glmmTMB设置re.form=NA预测时提示找不到随机效应变量的解决方法
问题复现
操作场景为基于已拟合的glmmTMB二项混合效应模型,结合RasterStack生成空间预测栅格。由于predict.glmmTMB要求输入数据为数据框格式,提前将待预测的RasterStack转换为数据框作为预测输入。
- 模型拟合代码:
model6 <- glmmTMB(Used~scale(Road_density)+scale(nonforprop)+scale(devprop)+ scale(forprop)+scale(nonfordist_cap3000)+scale(fordist_cap3000)+ scale(agridist_cap3000)+scale(devdist_cap3000)+(1|animal_ID), data=rasterpoints3,na.action=na.omit,family=binomial(link="logit"))
- 待预测数据框生成代码:
predstack <- as.data.frame(stack2)
- 预测执行代码:
glmmTMB:::predict.glmmTMB(model6,predstack,re.form=NA)
运行后返回报错:
Error in eval(predvars, data, env) : object 'animal_ID' not found
报错原因
re.form=NA参数的作用是预测阶段不计算随机效应的贡献、仅输出固定效应的预测结果,但该参数不会跳过模型公式的初始变量存在性校验——只要原始模型公式里出现过的变量(哪怕是被设置为不参与预测的随机效应分组变量),predict函数都会先检查输入数据里是否存在对应列,不会因为不使用随机效应就忽略该变量的存在检查。
解决方案
直接给预测用的predstack数据框添加一列名为animal_ID的占位列即可。由于设置了re.form=NA,该列的取值不会参与任何预测计算,填充任意值都不会影响最终固定效应的预测结果,示例代码如下:
# 添加占位列,取训练集中任意一个animal_ID值填充即可 predstack$animal_ID <- rasterpoints3$animal_ID[1] # 重新执行预测,如需输出0-1范围的概率结果可加上type="response"参数 pred_val <- predict(model6, predstack, re.form=NA, type="response")
额外注意事项
不建议直接在模型公式内嵌套scale()函数做变量标准化:这种写法下,模型不会存储训练集变量的均值、标准差,预测阶段会用预测集自身的均值和标准差对变量做标准化,会导致预测结果出现系统性偏差。正确做法是提前基于训练集计算各变量的均值、标准差,手动对训练集和预测集的对应变量做标准化后,再代入模型拟合和预测流程。
内容的提问来源于stack exchange,提问作者Beardedant
相关产品推荐
相关产品推荐

