如何解决glmm报错‘data must be nonnegative integers’及相关问题?
南非Blesbok种群GLMM分析报错解析与解决方法
原始代码与数据集
分析代码
library(glmm) glmm1<-glmm(Number~Location, random= list(~0+Nitrogen,~0+Dist_water), varcomps.names=c("Nit","Dist"), data = bles, m=100, family.glmm = poisson.glmm)
数据集定义
Number <- c(25,16,16,13,12,9,15,5,4,5,1,259,224,259,588,604,483,576,599,664) Location <- c("Borakolalo","Borakolalo","Borakolalo","Borakolalo","Bloemhof","Bloemhof","Bloemhof", "Bloemhof","Boskop","Boskop","Boskop","Boskop","Kgaswane","Kgaswane","Kgaswane", "Kgaswane","Mafikeng","Mafikeng","Mafikeng","Mafikeng") Nitrogen<-c(1.0889,1.1406,0.9835,1.0737,1.0578,1.0806,0.9914,0.9630,1.1718,0.8955,1.0211,0.9489, 0.9808,1.0053,0.9682,0.9794,1.0959,1.0028,0.9281,0.9887) Dist_water<- c(2156.0,3783.8,3285.8,2574.7,2242.3,1729.5,1018.1,1174.9,869.0,563.0,257.1,660.4, 840.4,717.7,762.6,528.5,626.5,691.2,635.9,606.5) bles<-data.frame(Number,Location,Nitrogen,Dist_water)
错误原因与解决方法
1. 错误:data must be nonnegative integers
原因:glmm包的泊松族(poisson.glmm)要求响应变量必须是整数类型,而非数值型。尽管Number向量的数值都是整数,但c()创建的向量默认是numeric类型,触发了包的类型检查机制。
解决方法:将响应变量转换为整数类型:
bles$Number <- as.integer(bles$Number)
2. 优化类错误(invalid 'xmax' value、parinit not feasible、leading minor of order 2 is not positive definite)
这类错误均源于模型结构不合理和数值稳定性问题,具体原因如下:
- 随机效应设定错误:GLMM的随机效应针对分组/聚类结构(如站点、个体),你将连续协变量(
Nitrogen、Dist_water)直接作为随机效应项,完全不符合GLMM的建模逻辑,导致模型无法识别。 - 变量尺度差异过大:
Dist_water数值范围为257~3783,而Nitrogen数值接近1,尺度差异极大,引发协方差矩阵估计时的数值不稳定。 - 响应变量过度离散:部分站点(如Mafikeng)的
Number值远高于其他站点,泊松分布(方差=均值)无法拟合这种过度离散的数据,进一步加剧拟合失败。
解决方法:
步骤1:修正随机效应结构
将随机效应改为对应分组结构(如Location作为随机截距),将Nitrogen、Dist_water作为固定效应加入模型(可根据研究目的调整变量):
# 标准化Dist_water以解决尺度问题 bles$Dist_water_scaled <- scale(bles$Dist_water) # 修正后的模型:Location为固定效应,站点随机截距,加入协变量 glmm1 <- glmm(Number ~ Location + Nitrogen + Dist_water_scaled, random = list(~1 | Location), varcomps.names = c("Site"), data = bles, m=100, family.glmm = poisson.glmm)
步骤2:改用负二项分布处理过度离散
若泊松模型仍报错,改用负二项分布(适配过度离散计数数据):
glmm1 <- glmm(Number ~ Location + Nitrogen + Dist_water_scaled, random = list(~1 | Location), varcomps.names = c("Site"), data = bles, m=100, family.glmm = negbin.glmm)
步骤3:简化模型逐步调试
如果仍有数值问题,先从简单模型开始拟合,逐步添加变量:
- 先拟合仅含固定效应的模型:
glmm(Number ~ Location, data=bles, family=poisson.glmm) - 再加入随机截距:
glmm(Number ~ Location, random=list(~1|Location), data=bles, family=poisson.glmm) - 最后加入协变量,确保每一步都能成功拟合。
内容的提问来源于stack exchange,提问作者Zaara Kidwai
相关产品推荐
相关产品推荐

