线性混合模型下ggplot置信区间未覆盖完整数据集问题求助
问题原因分析
你的置信区间看起来在0.1处停止,核心原因有两个:
- 首先,
ggpredict默认仅在原始数据的x变量范围内生成预测点(你的原始x最大是0.12),但你设置了xlim(0.01, 0.2),所以超出0.12的部分本来就没有预测数据; - 其次,对于x≥0.1的部分,
predicted - std.error计算结果会变成负数,而你设置了ylim(0, 30),y轴下限被限制在0,导致geom_ribbon中低于0的部分被裁剪,看起来像是置信区间提前终止了。
解决方案
下面是两种针对性的修复方法,你可以根据需求选择:
方法1:修复置信区间的下限显示
修改geom_ribbon的ymin参数,确保它不会低于0,这样即使计算出的标准误下限为负,也会被截断到0,和y轴范围匹配:
(ggplot(pred.mmhighW) + geom_line(aes(x = x, y = predicted)) + # 用pmax把ymin限制在0以上 geom_ribbon(aes(x = x, ymin = pmax(predicted - std.error, 0), ymax = predicted + std.error), fill = "lightgrey", alpha = 0.5) + geom_point(data = dfhighW, aes(x = x, y = y, shape = b)) + xlim(0.01,0.2) + ylim(0,30) + labs(title = "") + ylab(bquote('Specific Surface Energy ' (mJ/m^2))) + xlab(bquote('Surface Coverage ' (n/n[m]) )) + theme_minimal() )
方法2:让预测延伸到x=0.2的范围
如果你希望线条和置信区间真的延伸到xlim设置的0.2,需要告诉ggpredict生成0.01到0.2范围内的预测点,而不是默认的原始数据范围:
# 修改ggpredict的terms参数,指定x的范围 pred.mmhighW <- ggpredict(mixed.lme, terms = c("x [0.01,0.2]")) # 然后再用同样的ggplot代码,同时保留方法1的ymin修复 (ggplot(pred.mmhighW) + geom_line(aes(x = x, y = predicted)) + geom_ribbon(aes(x = x, ymin = pmax(predicted - std.error, 0), ymax = predicted + std.error), fill = "lightgrey", alpha = 0.5) + geom_point(data = dfhighW, aes(x = x, y = y, shape = b)) + xlim(0.01,0.2) + ylim(0,30) + labs(title = "") + ylab(bquote('Specific Surface Energy ' (mJ/m^2))) + xlab(bquote('Surface Coverage ' (n/n[m]) )) + theme_minimal() )
额外建议
另外,你的响应变量(表面能)是非负值,当前使用的线性混合模型可能不太适合,因为它允许预测值为负。如果你的数据特性允许,可以考虑使用适合非负响应的模型,比如Gamma分布的广义线性混合模型(glmer或lme4中的相关函数),这样预测值和置信区间都会自然保持非负,从根源上避免这个问题。
内容的提问来源于stack exchange,提问作者Catalyst
相关产品推荐
相关产品推荐

