11

如果我有一些 (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()我很高兴。所以,现在我的问题是为什么有人会选择使用nlsoroptim而不是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 上相同主题的一些有用页面:

R中的拟合优度函数

如何在 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)
4

2 回答 2

25

非线性最小二乘法是一种拟合参数非线性模型的方法。通过拟合模型,我的意思是响应和协变量之间的关系有一些先验指定的形式,以及一些要估计的未知参数。由于模型在这些参数中是非线性的,NLS 是一种通过以迭代方式最小化最小二乘准则来估计这些系数值的方法。

LOESS 是作为一种平滑散点图的方法而开发的。它有一个非常不明确的拟合“模型”概念(IIRC没有“模型”)。LOESS 的工作原理是尝试识别响应和协变量之间的关系模式,而无需用户指定该关系的形式。LOESS 根据数据本身计算出这种关系。

这是两个根本不同的想法。如果您知道数据应该遵循特定模型,那么您应该使用 NLS 拟合该模型。您始终可以比较两种拟合(NLS 与 LOESS),以查看假定模型等是否存在系统变化 - 但这会出现在 NLS 残差中。

代替 LOESS,您可以考虑通过gam()推荐的包mgcv安装的广义加法模型 (GAM) 。这些模型可以被视为一个惩罚回归问题,但允许从数据中估计拟合的平滑函数,就像它们在 LOESS 中一样。GAM 扩展了 GLM 以允许协变量的平滑、任意函数。

于 2011-09-26T09:08:59.770 回答
4

loess() 是非参数的,这意味着您没有得到一组以后可以使用的系数——它不是模型,只是一条拟合线。nls() 将为您提供可用于构建方程并使用不同但相似的数据集预测值的系数 - 您可以使用 nls() 创建模型。

于 2013-03-12T19:24:37.953 回答