R:完美的平滑曲线

时间:2011-10-31 11:34:41

标签: r graphics

我正在尝试将平滑曲线拟合到我的数据集中;是否有比使用以下代码生成的更好的平滑曲线:

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)

编辑:

我不打算产生好看(不必要) 我希望展示一个平滑的趋势.... 我不关心相关的模型公式......我确实需要恢复公式

3 个答案:

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

enter image description here


另一种方法是通过数据拟合样条曲线。样条曲线被约束为通过每个点(而lowess等更平滑的可能不会。)

spl <- smooth.spline(x, y)
plot(x, y)
lines(predict(spl, xl))

enter image description here

答案 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()

enter image description here