固定随机效应标准差时glmmTMB模型预测栅格异常问题求助
解决glmmTMB固定随机效应标准差后预测栅格全为0的问题
问题原因
通过doFit=FALSE手动固定随机效应标准差(theta参数)后,fitTMB返回的模型对象缺少glmmTMB直接拟合模型的关键元数据,导致predict.terra调用predict.glmmTMB时错误处理了边际预测逻辑,最终输出全0结果。
解决方案
以下两种方法均可解决该问题:
方法1:手动计算边际预测值
若目标是边际预测(不纳入随机效应),可直接提取固定效应参数,结合栅格数据计算预测值:
library(terra) library(glmmTMB) # 数据准备 logo <- rast(system.file("ex/logo.tif", package="terra")) names(logo) <- c("red", "green", "blue") logo$blue <- as.factor(logo$blue) # 固定theta的模型拟合 m2 <- glmmTMB(red ~ green + (1|blue), family=poisson, data = as.data.frame(logo), doFit=FALSE) m2$parameters$theta[1] <- log(1e3) m2$mapArg <- list(theta=factor(NA)) m2.f <- glmmTMB:::fitTMB(m2) # 提取固定效应系数并计算预测值 fixef_coef <- fixef(m2.f)$cond lin_pred <- logo$green * fixef_coef["green"] + fixef_coef["(Intercept)"] r2 <- exp(lin_pred) # 泊松模型的逆链接函数 plot(r2)
方法2:补全模型对象的元数据
手动拟合的模型缺少glmmTMB原生模型的元数据,可从正常拟合的模型中复制相关属性:
library(terra) library(glmmTMB) # 数据准备 logo <- rast(system.file("ex/logo.tif", package="terra")) names(logo) <- c("red", "green", "blue") logo$blue <- as.factor(logo$blue) logo.df <- as.data.frame(logo) # 先拟合正常模型获取元数据 m1 <- glmmTMB(red ~ green + (1|blue), family=poisson, data = logo.df) # 固定theta的模型拟合 m2 <- glmmTMB(red ~ green + (1|blue), family=poisson, data = logo.df, doFit=FALSE) m2$parameters$theta[1] <- log(1e3) m2$mapArg <- list(theta=factor(NA)) m2.f <- glmmTMB:::fitTMB(m2) # 复制关键元数据到固定参数后的模型 m2.f$modelInfo <- m1$modelInfo m2.f$call <- m1$call # 正常生成预测栅格 r2 <- predict(logo, m2.f, const=data.frame(blue=NA)) plot(r2)
说明
两种方法均能得到符合预期的预测结果——由于边际预测不考虑随机效应,最终预测值仅由固定效应(green变量的系数和截距)决定,与随机效应标准差的固定值无关。
内容的提问来源于stack exchange,提问作者Marie Auger-Methe
相关产品推荐
相关产品推荐

