在R中使用LOESS拟合一条直线

26

我有一组数据,其中包含一些点,想在上面拟合一条线。我尝试使用loess函数,但不幸的是我得到了非常奇怪的结果,如下图所示。我期望得到一条更贴近这些点并覆盖整个图的直线。我该如何实现? plot

重现方法:

https://www.dropbox.com/s/ud32tbptyvjsnp4/data.R?dl=1下载数据集(仅两KB),并使用以下代码:

load(url('https://www.dropbox.com/s/ud32tbptyvjsnp4/data.R?dl=1'))
lw1 = loess(y ~ x,data=data)
plot(y ~ x, data=data,pch=19,cex=0.1)
lines(data$y,lw1$fitted,col="blue",lwd=3)

非常感谢任何帮助。谢谢!


我尝试下载数据文件。它确实下载了,但是我无法读取它。它是什么格式的?你能上传一个ASCII DOS文本文件吗?也许是我做错了什么。也许我需要在我的机器上安装DropBox才能读取下载的文件?谢谢。 - Mark Miller
3个回答

67

你已经将拟合值绘制在y轴上,而不是x轴上。此外,在绘制线之前,需要对x轴的值进行排序。试试这个:

lw1 <- loess(y ~ x,data=data)
plot(y ~ x, data=data,pch=19,cex=0.1)
j <- order(data$x)
lines(data$x[j],lw1$fitted[j],col="red",lwd=3)

输入图片说明


4

也许现在有点晚了,但是你可以使用ggplot(和dplyr)来进行操作。如果你只想在数据点上绘制一个loess曲线,可以尝试以下方法:

library(ggplot2)
load(url("https://www.dropbox.com/s/ud32tbptyvjsnp4/data.R?dl=1"))
ggplot(data, aes(x, y)) + 
geom_point() +
geom_smooth(method = "loess", se = FALSE)

使用<code>ggplot::geom_smooth()</code>绘制的黄土线

另一种方法是通过使用loess拟合的predict()函数。例如,我使用了dplyr函数将预测添加到名为"loess"的新列中:

  library(dplyr)
  data %>%
  mutate(loess = predict(loess(y ~ x, data = data))) %>%
  ggplot(aes(x, y)) +
  geom_point(color = "grey50") +
  geom_line(aes(y = loess))

使用predict()和geom_line()绘制的黄土线

更新: 添加了一个用于加载提供的示例数据的代码行 更新2: 根据 @phi 评论更正了 geom_smoot() 函数名称


2
评论一下旧帖,但我想指出代码中有一个拼写错误。 "geom_smoth" 应该是 "geom_smooth"。由于代码中的拼写错误会导致代码无法运行,因此值得指出。 - Phil
为什么ggplotloess之间的曲线不一样? - Julien
geom_smooth() 预测整个 x 范围内生成的内部序列,而在示例中的 loess 仅预测数据集中存在的唯一 x 值。 - gavg712

4

很不幸,数据已不再可用,但是拟合非参数线条(局部加权散点平滑或简称为LOESS)的更简单方法是使用以下代码:

scatter.smooth(y ~ x, span = 2/3, degree = 2)

请注意,您可以通过调整参数spandegree来获得任意平滑度。

1
数据已经回来了,感谢提示。也许您可以相应地更改您的答案。 - leo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接