如果我有一些(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是一把电动 Screwdriver (这意味着我几乎总是选择后者,因为它做同样的事情,但是用了我很少的精力)?还是nls是平头 Screwdriver 而loess是十字头 Screwdriver (这意味着黄土更适合某些问题,但对于另一些问题,它根本无法解决问题)?

作为引用,以下是我使用的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)

最佳答案

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

LOESS是为平滑散点图而开发的。它具有非常不明确的“模型”概念的概念(IIRC没有“模型”)。 LOESS通过尝试识别响应和协变量之间的关系中的模式而工作,而无需用户指定该关系的形式。 LOESS从数据本身计算出关系。

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

您可以考虑通过推荐软件包 mgcv 中的gam()拟合的通用加性模型(GAM),而不是LOESS。这些模型可以看作是惩罚性回归问题,但可以像在LOESS中一样从数据中估计拟合的平滑函数。 GAM扩展了GLM以允许平滑,任意的协变量函数。

关于r - 什么时候在loess()上选择nls()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7550582/

10-12 19:47