如果我有一些(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
或optim
代替loess
(或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上同一主题的一些有用页面:
Goodness of fit functions in R
How to fit a smooth curve to my data in R?
smooth.spline“开箱即用”在我的第一和第三个例子中给出了很好的结果,但在第二个例子中可怕(它只是加入了点)。但是f = smooth.spline(x,y,spar = 0.5)在这三个方面都很好。
UPDATE#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)
答案 0 :(得分:25)
非线性最小二乘法是一种拟合参数非线性模型的方法。通过拟合模型,我的意思是对于响应和协变量之间的关系存在一些先验指定形式,其中一些未知参数将被估计。由于模型在这些参数中是非线性的,因此NLS是通过以迭代方式最小化最小二乘准则来估计这些系数的值的手段。
开发LOESS是一种平滑散点图的方法。它有一个非常不明确的“模型”概念(IIRC没有“模型”)。 LOESS的工作原理是尝试识别响应和协变量之间关系中的模式,而无需用户指定该关系的形式。 LOESS从数据本身中解决了这种关系。
这是两个根本不同的想法。如果您知道数据应该遵循特定模型,那么您应该使用NLS来适应该模型。您可以随时比较两个拟合(NLS与LOESS)以查看假定模型是否存在系统变化等 - 但这将显示在NLS残差中。
您可以考虑通过gam()
在推荐包 mgcv 中拟合的广义附加模型(GAM),而不是LOESS。这些模型可以看作是一个惩罚性的回归问题,但允许从数据中估算拟合的平滑函数,就像它们在黄土中一样。 GAM扩展了GLM,允许协变量的平滑,任意函数。
答案 1 :(得分:4)
loess()是非参数的,这意味着你没有得到一组你可以在以后使用的系数 - 它不是一个模型,只是一条拟合线。 nls()将为您提供可用于构建方程的系数,并使用不同但相似的数据集预测值 - 您可以使用nls()创建模型。