在R中与LOESS匹配一条线

时间:2013-03-11 09:39:51

标签: r loess

我有一个数据集,其中包含一些点,并希望在其上插入一条线。我用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)

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

3 个答案:

答案 0 :(得分:53)

您已根据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)

enter image description here

答案 1 :(得分:1)

不幸的是,数据不再可用,但更简单的方法是如何拟合非参数线(局部加权散点图平滑或只是你想要的LOESS)是使用以下代码:

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

请注意,您可以使用参数spandegree来获得任意平滑度。

答案 2 :(得分:1)

可能是迟到了,但你有ggplot(和dplyr)的选项。首先,如果您只想在点上绘制黄土线,您可以尝试:

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)

Loess line with <code>ggplot::geom_smooth()</code>

其他方式,是通过使用黄土拟合的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))

Loess line with <code>predict()</code> and <code>geom_line()</code>

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