我有一个数据集,其中包含一些点,并希望在其上插入一条线。我用loess
函数试了一下。不幸的是我的结果非常奇怪。见下图。我期待一条线越过整点和整个情节。我怎样才能做到这一点?
如何重现它:
从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)
非常感谢任何帮助。谢谢!
答案 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)
答案 1 :(得分:1)
不幸的是,数据不再可用,但更简单的方法是如何拟合非参数线(局部加权散点图平滑或只是你想要的LOESS)是使用以下代码:
scatter.smooth(y ~ x, span = 2/3, degree = 2)
请注意,您可以使用参数span
和degree
来获得任意平滑度。
答案 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)
其他方式,是通过使用黄土拟合的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))
更新:添加了一行代码以加载提供的示例数据
Update2 :根据@phi评论更正geom_smoot()
函数名称