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
或optim
而不是loess
(或smooth.spline
)?使用工具箱比喻,nls
是螺丝刀,而loess
是电动螺丝刀(这意味着我几乎总是选择后者,因为它可以用更少的努力完成相同的工作)?还是nls
是一字螺丝刀,loess
是十字螺丝刀(这意味着对于一些问题,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“开箱即用”在我的第1个和第3个示例中效果很好,但在第2个示例中效果很差(只是连接了点)。然而 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)
loess
有span
和degree
参数吗?而且它们会影响到拟合的模型。尝试在你最后一个例子数据中使用span = 0.1
。 - joran