何时选择nls()而不是loess()?

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(),我很高兴。那么,现在我的问题是:为什么有人选择使用nlsoptim而不是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 上有一些有用的关于同一主题的页面:

R 中适合度函数

如何在 R 中将平滑曲线拟合到我的数据中?

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)

2
这个问题可以写很长的答案,但我可以澄清一个事情。你知道loessspandegree参数吗?而且它们会影响到拟合的模型。尝试在你最后一个例子数据中使用span = 0.1 - joran
谢谢@joran,这很有用。不过需要为不同的方程指定不同的跨度也算是一个提示。 - Darren Cook
2个回答

25

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

LOESS是作为平滑散点图的一种方法而开发的。它没有很好定义的被“拟合”的“模型”概念(如果我没记错的话,没有“模型”)。LOESS试图在不需要用户指定关系形式的情况下,识别响应和协变量之间的模式。LOESS从数据本身中计算出这种关系。

这是两个根本不同的想法。如果您知道数据应该遵循特定的模型,那么您应该使用NLS来拟合该模型。您始终可以比较两种拟合(NLS vs LOESS),以查看是否存在来自预设模型等的系统变异-但这将显示在NLS残差中。

除了LOESS,您可能考虑使用建议包mgcv中的gam()拟合的广义加性模型(GAMs)。这些模型可以被视为带有惩罚的回归问题,但允许像在LOESS中一样从数据中估计拟合平滑函数。GAM将GLM扩展到允许协变量的平滑、任意函数。


1
+1 很好的回答,因为这些是无与伦比的。MASS书中有一节关于平滑器,比较了loess和其他替代方法。 - Dirk Eddelbuettel
@Ben 我记得Simon Wood在描述广义加性模型的一般形式时使用了这个描述,我无法想象是我自己编造的?我认为“任意”的意思是它们可以是任何类型的平滑器。 - Gavin Simpson
感谢@Gavin对这些函数的差异做出了良好的解释。如果我想评估一个模型,我会选择nls或类似的函数;如果我想发现一个模型,我会选择gam或类似的函数。 - Darren Cook
1
@DarrenCook 不,对于最后一部分,我会说“...选择LOESS或类似方法”。GAM确实是一种正式的统计模型,结合现代理论等因素,是数据分析师工具箱中有用的一部分。GLM只允许某些形式的关系。GAM允许识别数据中真实关系,同时保持适当的统计框架。与GLM相比,使用GAM进行推断变得更加近似,但是与线性模型相比,GLM中的推断比线性模型中的推断更加近似-这就是我们必须付出的代价。 - Gavin Simpson

4

loess()是非参数的,意味着你不能得到一组系数以后使用——它不是模型,只是一个拟合曲线。nls()会给你系数,你可以用它们构建方程并预测具有不同但相似数据集的值——你可以使用nls()创建模型。


这是100%正确的;例如,可以查看?predict.loess,它可以生成预测值及其标准误差。 - Gavin Simpson
@gavin simpson,是的,Loess确实可以进行预测,但没有系数怎么办? - user1471980

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接