为何emmeans输出存在nonEst值?昼间线性混合模型异常问询
问题背景
构建昼间数据的线性混合模型后,使用emmeans提取3水平因子intonidhrtime的估计均值时,仅一个水平有结果,另外两个水平显示nonEst;但每个时间水平样本量均≥50,且夜间相同模型结构的输出完全正常。
核心代码与输出:
模型拟合代码:
countsleepdataon25WAKEANGLMM2<-lmer(unlist(propnssANGon)~as.factor(intonidhrtime)+Daysincedisturb/Stressor+as.factor(intonidhrtime)*Daysincedisturb/Stressor+(1|Batch)+(1|Batch_Bird_ID)+(1|fdfsrtoff)+(1|fdfsrtoff_intonidhrtimertoff),data=countsleepdataon25WAKE)
emmeans调用代码:
emmeans(countsleepdataon25WAKEANGLMM2,specs='intonidhrtime')
异常输出:
> emmeans(countsleepdataon25WAKEANGLMM2,specs='intonidhrtime') NOTE: A nesting structure was detected in the fitted model: Stressor %in% Daysincedisturb NOTE: Results may be misleading due to involvement in interactions intonidhrtime emmean SE df lower.CL upper.CL 12-15.5 nonEst NA NA NA NA 15.5-19 nonEst NA NA NA NA 5-8.5 65.4 2.01 8.11 60.8 70 Results are averaged over the levels of: Stressor, Daysincedisturb Degrees-of-freedom method: kenward-roger Results are given on the unlist (not the response) scale. Confidence level used: 0.95
排查方向与解决方案
1. 检查交互项对应的单元格样本缺失
模型包含intonidhrtime * Daysincedisturb/Stressor交互项(等价于intonidhrtime与Daysincedisturb、Daysincedisturb:Stressor的交叉交互),如果昼间数据中某些intonidhrtime与Daysincedisturb/Stressor的组合完全无样本,会导致对应系数不可估计,进而emmeans无法计算均值。
执行以下代码验证:
# 检查intonidhrtime与Daysincedisturb的交叉样本量 table(countsleepdataon25WAKE$intonidhrtime, countsleepdataon25WAKE$Daysincedisturb) # 检查嵌套结构下Stressor的交叉样本分布 with(countsleepdataon25WAKE, table(intonidhrtime, Daysincedisturb, Stressor))
如果发现存在全0的单元格,可考虑移除缺失的组合、简化交互项,或使用emmeans的at参数指定仅存在样本的组合进行计算。
2. 排查随机效应结构的冗余/共线性
昼间模型的随机效应包含(1|fdfsrtoff_intonidhrtimertoff),该交互随机效应可能与固定效应intonidhrtime或其他随机效应存在完全共线性,导致部分固定效应自由度为0。
尝试简化随机效应结构后重新拟合模型:
temp_model <- lmer( unlist(propnssANGon)~as.factor(intonidhrtime)+Daysincedisturb/Stressor+as.factor(intonidhrtime)*Daysincedisturb/Stressor+ (1|Batch)+(1|Batch_Bird_ID)+(1|fdfsrtoff), data=countsleepdataon25WAKE ) emmeans(temp_model, specs='intonidhrtime')
若简化后能正常输出,说明原随机效应结构存在冗余,需调整随机效应项。
3. 更换自由度计算方法
模型使用Kenward-Roger方法计算自由度,当信息矩阵奇异时可能触发nonEst。尝试换用Satterthwaite或渐近自由度:
# 使用Satterthwaite自由度 emmeans(countsleepdataon25WAKEANGLMM2, specs='intonidhrtime', df="satterthwaite") # 使用渐近自由度 emmeans(countsleepdataon25WAKEANGLMM2, specs='intonidhrtime', df="asymptotic")
4. 验证响应变量的完整性
确认unlist(propnssANGon)处理后,各intonidhrtime水平的响应变量无异常(如全NA、方差为0):
aggregate( unlist(propnssANGon) ~ intonidhrtime, data=countsleepdataon25WAKE, function(x) c(样本量=length(x), NA数量=sum(is.na(x)), 方差=var(x, na.rm=T)) )
内容的提问来源于stack exchange,提问作者e_putyora

