如果我有一些(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更适合解决某些问题,但对于其他问题,它根本不能完成工作)?
作为参考,以下是我使用的播放数据,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)在这三个方面都很好。
更新#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)
发布于 2011-09-26 09:09:00
非线性-最小二乘法是一种拟合参数非线性的模型的方法。通过拟合模型,我的意思是,对于响应和协变量之间的关系,存在某种先验指定的形式,以及一些待估计的未知参数。由于模型在这些参数中是非线性的,NLS是一种通过以迭代方式最小化最小二乘准则来估计这些系数的值的方法。
黄土是作为平滑散点图的一种手段而开发的。它有一个定义不太明确的“模型”概念(IIRC没有“模型”)。LOESS通过尝试识别响应和协变量之间的关系模式来工作,而用户不必指定该关系是什么形式。LOESS从数据本身找出了关系。
这是两个根本不同的想法。如果您知道数据应该遵循特定的模型,那么您应该使用NLS来拟合该模型。你总是可以比较两个拟合(NLS和LOESS),看看是否存在与假设模型等的系统差异-但这将在NLS残差中显示出来。
而不是LOESS,您可以考虑通过推荐的软件包mgcv中的gam()
安装的通用加性模型(GAMs)。这些模型可以看作是一个惩罚回归问题,但允许从数据中估计拟合的平滑函数,就像它们在黄土中一样。GAM扩展了GLM,允许协变量的平滑、任意函数。
发布于 2013-03-12 19:24:38
loess()是非参数的,这意味着您不会得到一组以后可以使用的系数-它不是一个模型,而是一条拟合线。nls()将为您提供系数,您可以使用这些系数来构建方程,并使用不同但相似的数据集预测数值-您可以使用nls()创建一个模型。
https://stackoverflow.com/questions/7550582
复制