我正在尝试将平滑曲线拟合到我的数据集中;是否有比使用以下代码生成的更好的平滑曲线:
x <- seq(1, 10, 0.5)
y <- c(1, 1.5, 1.6, 1.7, 2.1,
2.2, 2.2, 2.4, 3.1, 3.3,
3.7, 3.4, 3.2, 3.1, 2.4,
1.8, 1.7, 1.6, 1.4)
lo <- loess(y~x)
plot(x,y)
xv <- seq(min(x),max(x), (max(x) - min(x))/1000000)
lines(xv, predict(lo,xv), col='blue', lwd=1)
编辑:
我不打算产生好看(不必要) 我希望展示一个平滑的趋势.... 我不关心相关的模型公式......我确实需要恢复公式
答案 0 :(得分:5)
正如所提出的,这个问题几乎毫无意义。没有“最佳”合适的东西,因为“最好”取决于你的研究目标。生成平滑线以适应每个单点数据是非常简单的(例如,18阶多项式将完美地拟合您的数据,但很可能毫无意义)。
也就是说,您可以通过更改loess
参数来指定span
模型的平滑度的数量。跨度值越大,曲线越平滑,跨度值越小,每个点的拟合程度越大:
这是一个值为span=0.25
的图:
x <- seq(1, 10, 0.5)
y <- c(1, 1.5, 1.6, 1.7, 2.1,
2.2, 2.2, 2.4, 3.1, 3.3,
3.7, 3.4, 3.2, 3.1, 2.4,
1.8, 1.7, 1.6, 1.4)
xl <- seq(1, 10, 0.125)
plot(x, y)
lines(xl, predict(loess(y~x, span=0.25), newdata=xl))
另一种方法是通过数据拟合样条曲线。样条曲线被约束为通过每个点(而lowess
等更平滑的可能不会。)
spl <- smooth.spline(x, y)
plot(x, y)
lines(predict(spl, xl))
答案 1 :(得分:4)
你得到了19分,所以一个多达X ^ 18的多项式会使你的每个点都显眼:
> xl=seq(0,10,len=100)
> p=lm(y~poly(x,18))
> plot(x,y)
> lines(xl,predict(p,newdata=data.frame(x=xl)))
但这忽略了统计数据的全部内容。它承认曲线不适合通过点。它是关于找到一个具有少量参数的模型,该模型尽可能地解释数据,并且只留下噪声。它不是用曲线来表示你的点 - 如此绘制的曲线在数据点之间几乎没有意义。
答案 2 :(得分:4)
我想也许你正在寻找一个插值平滑线,在R的情况下,通过拟合插值样条可能最容易实现?正如其他答案所讨论的那样,这不是统计拟合的含义,但是在很多情况下你需要一个平滑的插值曲线 - 我认为你的术语可能会让人失望。
样条在数值上比多项式更稳定。
x <- seq(1, 10, 0.5)
y <- c(1, 1.5, 1.6, 1.7, 2.1,
2.2, 2.2, 2.4, 3.1, 3.3,
3.7, 3.4, 3.2, 3.1, 2.4,
1.8, 1.7, 1.6, 1.4)
library(splines)
isp <- interpSpline(x,y)
xvec <- seq(min(x),max(x),length=200) ## x values for prediction
png("isp.png")
plot(x,y)
## predict() produces a list with x and y components
lines(predict(isp,xvec),col="red")
dev.off()