R语言中广义线性混合模型(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);二是混淆了lme4的glmer模型对象和glmmADMB包的模型对象——你的模型是用lme4::glmer()构建的,对象类是glmerMod,并非glmmadmb,修正对象名就能解决这个问题。
另外补充下re.form参数的正确用法:
- 如果你想针对特定分组(如School)做条件预测(包含随机效应),直接用
predict(mm2, n11, type="response")即可(前提是已经同步了因子水平) - 如果你想做总体平均的边际预测(不考虑随机效应),需要设置
re.form=~0或re.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




