23

我有一个数据集,里面有一些点,想在上面画一条线。我用这个loess功能试了一下。不幸的是,我得到了非常奇怪的结果。见下图。我希望一条线更多地通过点和整个情节。我怎样才能做到这一点? 阴谋

如何重现它:

从https://www.dropbox.com/s/ud32tbptyvjsnp4/data.R?dl=1下载数据集(只有 2 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)

任何帮助是极大的赞赏。谢谢!

4

3 回答 3

64

您已经绘制了拟合值反对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)

在此处输入图像描述

于 2013-03-11T10:00:37.493 回答
3

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

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

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

于 2017-04-26T20:04:17.903 回答
2

可能为时已晚,但您可以选择 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)

<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))

<code>predict()</code> 和 <code>geom_line()</code> 的黄土线

更新:添加了代码行以加载提供的示例数据 更新2 :更正函数名称与@phi注释geom_smoot()

于 2017-09-07T20:58:58.347 回答