gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:29:50 24 4
gpt4 key购买 nike

如果我有一些 (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一把 Screwdriver 和 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 残差中。

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com