You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键改动说明

  1. 去掉type.predict='response':让augment返回默认的对数尺度预测值(.fitted代表log-odds),同时指定se_fit=TRUE获取该尺度下的标准误。
  2. 在log-odds尺度计算区间:先在正态分布假设下计算对数几率的置信上下限,再用plogis()(logit函数的逆函数)把所有值转换回0-1的概率尺度。
  3. 用转换后的概率值绘图:此时的置信区间会在概率接近0或1的区域(比如age较大、高收入概率高的区间)明显发散,完全匹配书中图7.1右侧的形态。

额外提醒

如果你坚持在概率尺度计算区间,不仅会出现形态错误,还可能得到lower<0或upper>1的不合理值——而通过log-odds转换的方法能完美避免这个问题,同时保证置信区间的统计合理性。

内容的提问来源于stack exchange,提问作者Louis Maiden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:47:43