You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

R语言中广义线性混合模型(GLMM)的正确预测方法问询

正确使用lme4中GLMM模型进行预测的方法

你在使用lme4包的glmer()构建广义线性混合模型后遇到的预测问题,都是GLMM预测时的典型场景,我来一步步帮你梳理解决:

第一个错误的原因与修复

你遇到的第一个报错:

Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]]) : contrasts can be applied only to factors with 2 or more levels

这是因为新数据框n11里的School变量只有单个水平("e3"),但原模型mm2训练数据中的School是包含多个水平的因子。R在处理因子对比时,单水平因子无法生成有效的对比矩阵,因此抛出这个错误。

解决方法很直接,确保新数据的因子水平和原训练数据完全对齐:

# 将n11的School因子水平同步为df1中的水平
n11$School <- factor(n11$School, levels = levels(df1$School))
# 同理也建议同步Rank的水平,避免潜在问题
n11$Rank <- factor(n11$Rank, levels = levels(df1$Rank))

这样处理后,即使新数据只包含一个水平,R也能识别它是原因子集合的一部分,不会再触发对比矩阵的错误。

第二个错误的原因与修复

第二个报错:

Error in UseMethod("predict") : no applicable method for 'predict' applied to an object of class "glmmadmb"

这是两个低级问题导致的:一是你写错了模型对象名(代码里用了m2,但实际模型是mm2);二是混淆了lme4glmer模型对象和glmmADMB包的模型对象——你的模型是用lme4::glmer()构建的,对象类是glmerMod,并非glmmadmb,修正对象名就能解决这个问题。

另外补充下re.form参数的正确用法:

  • 如果你想针对特定分组(如School)做条件预测(包含随机效应),直接用predict(mm2, n11, type="response")即可(前提是已经同步了因子水平)
  • 如果你想做总体平均的边际预测(不考虑随机效应),需要设置re.form=~0re.form=NA
# 边际预测(忽略随机效应,基于固定效应的总体平均)
predict(mm2, n11, type="response", re.form=~0)

注意:re.form=(~Rank|School)这种写法是用来指定自定义的随机效应保留结构,如果你只是想用原模型的随机效应结构,完全不需要额外指定,默认就是包含所有随机效应的。

完整可运行的预测流程

把上述步骤整合后,完整的代码如下:

# 加载所需包
library(dplyr)
library(lme4)

# 生成训练数据
n = 300
xx<-c("r1","r2","r3","r4","r5")
xxx<-c("e1","e2","e3")
p=0.3
df1 <- data_frame(
 xx1 = runif(n, min = 0, max = 10),
 xx2 = runif(n, min = 0, max = 10),
 xx3 = runif(n, min = 0, max = 10),
 School = factor(sample(xxx, n,re=TRUE)),
 Rank = factor(sample(xx, n,re=TRUE)),
 yx = as.factor(rbinom(n, size = 1, prob = p))
)

# 构建GLMM模型
mm2 <- glmer(yx ~ xx1 + xx2 + xx3 + Rank + (Rank | School), data = df1, family = "binomial",control = glmerControl(calc.derivs = FALSE))

# 准备新数据并同步因子水平
n11 = data.frame(School="e3",Rank="r2",xx1=8.58,xx2=8.75,xx3=7.92)
n11$School <- factor(n11$School, levels = levels(df1$School))
n11$Rank <- factor(n11$Rank, levels = levels(df1$Rank))

# 条件预测(包含随机效应)
predict(mm2, n11, type="response")

# 边际预测(不包含随机效应)
predict(mm2, n11, type="response", re.form=~0)

这样就能顺利完成GLMM模型的预测了。

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

火山引擎 最新活动