如果我有一些 (x,y) 数据,我可以轻松地通过它绘制直线,例如
f=glm(y~x)
plot(x,y)
lines(x,f$fitted.values)
但对于曲线数据,我想要一条曲线。似乎可以使用 loess() :
f=loess(y~x)
plot(x,y)
lines(x,f$fitted)
这个问题随着我的打字和研究而演变。我开始想要一个简单的函数来拟合曲线数据(我对数据一无所知),并想了解如何使用nls()
或optim()
做到这一点。这似乎是每个人在我发现的类似问题中的建议。但现在我偶然发现loess()
我很高兴。所以,现在我的问题是为什么有人会选择使用nls
oroptim
而不是loess
(or smooth.spline
)?使用工具箱类比,是nls
螺丝刀loess
还是电动螺丝刀(这意味着我几乎总是选择后者,因为它做同样的事情但我的努力更少)?或者是nls
一字螺丝刀和loess
十字螺丝刀(这意味着黄土更适合解决某些问题,但对于其他问题,它根本无法解决问题)?
作为参考,这是我使用的播放数据,它loess
给出了令人满意的结果:
x=1:40
y=(sin(x/5)*3)+runif(x)
和:
x=1:40
y=exp(jitter(x,factor=30)^0.5)
可悲的是,它在这方面做得不太好:
x=1:400
y=(sin(x/20)*3)+runif(x)
nls() 或任何其他函数或库能否在没有提示的情况下处理这个和前面的 exp 示例(即没有被告知它是正弦波)?
更新:stackoverflow 上相同主题的一些有用页面:
smooth.spline “开箱即用”在我的第一个和第三个示例中给出了很好的结果,但在第二个示例中却很糟糕(它只是连接了点)。但是 f=smooth.spline(x,y,spar=0.5) 在这三个方面都很好。
更新#2:到目前为止,gam()(来自 mgcv 包)很棒:当它更好时,它给出了与 loess() 相似的结果,而当它更好时,它给出了与 smooth.spline() 相似的结果。所有这些都没有提示或额外的参数。文档离我太远了,我觉得我正眯着眼睛看着头顶上飞过的飞机;但发现了一些试验和错误:
#f=gam(y~x) #Works just like glm(). I.e. pointless
f=gam(y~s(x)) #This is what you want
plot(x,y)
lines(x,f$fitted)