如果我有一些(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
是一把电动 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/