ggplot中lm方法未显示置信区间,求助添加置信区间的解决办法
解决ggplot geom_smooth不显示置信区间的问题
核心原因
你用geom_smooth(data = newDRdata, ...)时,如果newDRdata只是包含预测拟合值的数据集(比如仅通过predict()生成的拟合列),它没有原始模型的方差、残差等信息,ggplot无法计算置信区间——哪怕设置se=TRUE也没用,因为缺少必要的统计量。
两种解决办法
办法1:直接用原始数据拟合(最简便)
不需要单独生成newDRdata,让geom_smooth直接基于原始的clawregression_data拟合模型并计算置信区间:
ggplot(clawregression_data, aes(x = logDR, y = Deut)) + geom_point(shape=1) + geom_smooth(method = lm, se = TRUE) + expand_limits(y=c(-100,0))
办法2:用带置信区间的预测数据手动绘制
如果必须使用newDRdata,需要先让预测结果包含置信区间的上下限,再用geom_line画拟合线、geom_ribbon画置信区间:
- 先拟合原始模型并生成带置信区间的预测数据:
# 拟合线性模型 lm_fit <- lm(Deut ~ logDR, data = clawregression_data) # 生成包含置信区间的预测结果(用seq生成连续x值保证拟合线平滑) pred_data <- predict(lm_fit, newdata = data.frame(logDR = seq(min(clawregression_data$logDR), max(clawregression_data$logDR), length.out = 100)), interval = "confidence") # 整理成ggplot可用的数据框 newDRdata_df <- cbind(data.frame(logDR = seq(min(clawregression_data$logDR), max(clawregression_data$logDR), length.out = 100)), as.data.frame(pred_data))
- 绘图:
ggplot() + geom_point(data = clawregression_data, aes(x = logDR, y = Deut), shape=1) + geom_line(data = newDRdata_df, aes(x = logDR, y = fit)) + geom_ribbon(data = newDRdata_df, aes(x = logDR, ymin = lwr, ymax = upr), alpha = 0.2) + expand_limits(y=c(-100,0))
补充说明
geom_smooth(method=lm)的se=TRUE生效的前提是,它能拿到用于拟合模型的原始数据(或包含标准误的预测数据),仅靠单一的拟合值列无法计算置信区间。- 如果你的
newDRdata是从其他渠道生成的,检查数据中是否有se.fit(标准误)或置信区间上下限列,若有也可以直接用这些列配合geom_ribbon绘制。
内容的提问来源于stack exchange,提问作者ksh530
相关产品推荐
相关产品推荐

