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
相关产品推荐
相关产品推荐

