R语言glmer拟合二项分布GLMM报y值需0<=y<=1错误的修复求助
问题根因
你收到的报错Error in eval(family$initialize, rho) : y values must be 0 <= y <= 1是二项分布GLMM的典型参数传入错误:
family = binomial要求传入的响应变量只能是两种格式:- 个体水平的0/1二分类变量(1代表事件发生,0代表未发生)
- 分组水平的
cbind(事件发生数, 事件未发生数)矩阵,或者取值范围在0-1之间的比例+总样本量作为权重
- 从你提供的样本数据来看,你指定为响应变量的
Survival(对应列名S*)是每组的存活个体计数,数值多为大于1的整数,不符合二项分布的响应变量要求,因此触发报错。
修复方案
修正后的模型代码如下:
# 生成观测水平随机效应 datheat$replicateID = factor(1:nrow(datheat)) # 拟合模型,用cbind(存活数, 死亡数)作为响应变量 mod = glmer(cbind(`S*`, n - `S*`) ~ sex + region + treatment + treatment:region + treatment:sex + sex:region + (1|iso) + (1|pop) + (1|replicateID), data = datheat, family = binomial) summary(mod)
如果你想用存活比例作为响应变量,也可以写成如下格式,拟合结果完全一致:
mod = glmer(proportion ~ sex + region + treatment + treatment:region + treatment:sex + sex:region + (1|iso) + (1|pop) + (1|replicateID), data = datheat, family = binomial, weights = n)
注意事项
- 列名
S*包含特殊字符,需要用反引号包裹才能被R正确识别 - 你的数据集里等雌系、种群对应的列名是
iso和pop,要和模型随机效应部分的变量名对应,否则会出现变量找不到的报错 - 观测水平随机效应
(1|replicateID)用于校正二项分布的过度离散问题,这个设置是合理的 - 如果拟合后出现收敛警告,可以尝试调整优化器参数:在
glmer参数中加入control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 10000))
内容的提问来源于stack exchange,提问作者Alison Meeth
相关产品推荐
相关产品推荐

