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

R语言导出LOESS拟合曲线底层数据与绘图结果不匹配问题求助

问题核心原因

你导出的拟合值和ggplot画出的LOESS曲线不匹配,是两个核心原因导致的:

  • 你手动调用predict()时是在原始数据集的TS_LightOn取值上做预测,而ggplot的stat_smooth(method="loess")默认会在x轴范围内生成80个等间距的网格点,在这些点上做预测来绘制平滑曲线
  • 你绘图时用xlim(0,400)做了范围截断,手动拟合loess时用的是全量数据,且loess的平滑参数可能和ggplot默认调用的参数不一致

正确导出方案

直接提取ggplot内部计算好的LOESS拟合数据是最稳妥的零出错方案,不需要手动复现ggplot的计算逻辑,也不需要核对参数设置,操作代码如下:

# 先将你原本的绘图代码赋值为一个ggplot对象
p <- ggplot(data = CL111) + 
  geom_smooth(mapping = aes(x = TS_LightOn, y = dur_cleaned), method = "lm", se = FALSE, colour = "Green") +
  labs(x = "TS Light On (秒)", y = "TS响应时间 (秒)", title = "Layout 1, Condition AO, INS High") +
  theme(plot.title = element_text(hjust = 0.5)) +
  stat_smooth(mapping = aes(x = TS_LightOn, y = dur_cleaned), method = "loess", se = TRUE) + 
  xlim(0, 400) + 
  ylim (0, 1.0) 

# 提取LOESS拟合层的计算结果,第二个图层为LOESS平滑层,对应索引为2
loess_cal_data <- ggplot_build(p)$data[[2]]

# 整理需要导出的字段
loess_output <- data.frame(
  TS_LightOn = loess_cal_data$x,
  fitted_value = loess_cal_data$y,
  standard_error = loess_cal_data$se,
  conf_interval_low = loess_cal_data$ymin,
  conf_interval_high = loess_cal_data$ymax
)

# 导出为csv文件
write.csv(loess_output, "CL111_loess_correct.csv", row.names = FALSE)

如果需要调整拟合点的数量,可以在stat_smooth中添加n参数,例如设置stat_smooth(..., n=200)就会生成200个等间距点的拟合结果,导出的数据也会对应200行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:27:05