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

如何在R中提取回归曲线及不确定带的x、y值并实现样条回归可视化

问题1:提取蓝色回归曲线对应的x、y数值

有两种常用实现方式:

  • 直接提取ggplot内置计算结果:先将绘图结果保存为变量,再用ggplot_build读取拟合数据
# 先保存绘图对象
p <- ggplot(train.data, aes(y, x) ) +
  geom_point() +
  stat_smooth(method = lm, formula = y ~ splines::bs(x, df =3))
# 提取曲线数据,第二组数据就是stat_smooth的计算结果
curve_data <- ggplot_build(p)$data[[2]]
# 其中curve_data$x为原数据y列(绘图x轴)取值,curve_data$y为拟合的回归值,即曲线坐标
  • 手动基于模型预测:生成均匀的自变量序列,用已训练的model直接预测
# 生成覆盖自变量范围的均匀序列
seq_y <- seq(min(train.data$y), max(train.data$y), length.out = 100)
# 预测拟合值
fit_value <- predict(model, newdata = data.frame(y = seq_y))
# 得到的seq_y和fit_value就是回归曲线的横、纵坐标点

问题2:base R的样条回归可视化方案

直接用base R的plot和lines函数即可实现,示例代码如下:

# 先绘制原始散点
plot(train.data$y, train.data$x, pch = 16, xlab = "y", ylab = "x")
# 生成预测序列
seq_y <- seq(min(train.data$y), max(train.data$y), length.out = 100)
fit_value <- predict(model, newdata = data.frame(y = seq_y))
# 绘制样条回归曲线
lines(seq_y, fit_value, col = "blue", lwd = 2)

如果需要绘制置信区间,补充如下代码即可:

# 计算置信区间上下限
ci_value <- predict(model, newdata = data.frame(y = seq_y), interval = "confidence")
# 绘制灰色半透明置信带
polygon(c(seq_y, rev(seq_y)), c(ci_value[,"lwr"], rev(ci_value[,"upr"])), col = adjustcolor("gray", alpha.f = 0.3), border = NA)

问题3:灰色区间的类型与参数设置

你看到的灰色区间是拟合值的95%置信区间,是对回归曲线均值的不确定性估计,不是针对单个观测的预测区间。
参数调整可以直接在stat_smooth中配置:

  • 调整置信水平:加level参数,比如level = 0.99就会生成99%置信区间
  • 切换为预测区间:加method.args = list(interval = "prediction")即可切换为单个观测的预测区间
  • 关闭置信区间:加se = FALSE就会隐藏灰色区间

问题4:提取灰色不确定带的x、y数值

和提取曲线数据逻辑一致,两种实现方式:

  • 从ggplot对象中提取:刚才拿到的curve_data中,curve_data$ymin和curve_data$ymax分别是置信带的下、上限,对应横坐标还是curve_data$x
  • 手动预测得到:
seq_y <- seq(min(train.data$y), max(train.data$y), length.out = 100)
ci_value <- predict(model, newdata = data.frame(y = seq_y), interval = "confidence")
# seq_y是横坐标,ci_value[,"lwr"]是下限,ci_value[,"upr"]是上限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:15:08