R语言ggplot绘制四次多项式误差条异常:复现《统计学习导论(R语言版)》图7.1右侧图形失败求助
问题原因与修正方案
嘿,我一眼就看出问题所在啦!你现在是直接在概率尺度上计算置信区间,但逻辑回归的核心线性结构是在**对数几率(log-odds)**尺度上的——概率尺度是非线性的,直接加减标准误会完全扭曲置信区间的形态,这就是为什么你看到高值区间误差条反而变窄的原因。
核心问题拆解
逻辑回归的glm模型输出的线性预测值(log-odds)是服从正态分布的,所以我们应该先在这个尺度上计算置信区间,再通过logit逆变换(plogis()函数)转换回概率尺度。直接在概率尺度上操作会忽略logistic变换的非线性特性,导致置信区间的形态完全不符合理论预期,甚至可能出现概率<0或>1的不合理结果。
修正后的代码
library(tidyverse) library(ISLR2) library(broom) wage <- Wage %>% as_tibble() %>% select(age, wage) %>% mutate(high_inc = wage > 250) # 修正后的绘图代码 glm(high_inc ~ poly(age, 4), data = wage, family = binomial) %>% # 保留默认的线性预测(log-odds尺度),同时获取标准误 broom::augment(se_fit = TRUE) %>% # 在log-odds尺度计算置信区间 mutate( logit_lower = .fitted - 1.96 * .se.fit, logit_upper = .fitted + 1.96 * .se.fit, # 转换回概率尺度 prob_fitted = plogis(.fitted), prob_lower = plogis(logit_lower), prob_upper = plogis(logit_upper) ) %>% ggplot(aes(age, prob_fitted)) + geom_line() + geom_ribbon(aes(ymin = prob_lower, ymax = prob_upper), color = "grey", alpha = .2)
关键改动说明
- 去掉
type.predict='response':让augment返回默认的对数尺度预测值(.fitted代表log-odds),同时指定se_fit=TRUE获取该尺度下的标准误。 - 在log-odds尺度计算区间:先在正态分布假设下计算对数几率的置信上下限,再用
plogis()(logit函数的逆函数)把所有值转换回0-1的概率尺度。 - 用转换后的概率值绘图:此时的置信区间会在概率接近0或1的区域(比如age较大、高收入概率高的区间)明显发散,完全匹配书中图7.1右侧的形态。
额外提醒
如果你坚持在概率尺度计算区间,不仅会出现形态错误,还可能得到lower<0或upper>1的不合理值——而通过log-odds转换的方法能完美避免这个问题,同时保证置信区间的统计合理性。
内容的提问来源于stack exchange,提问作者Louis Maiden
相关产品推荐
相关产品推荐

