Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 何时选择nls()而不是黄土()?_R_Curve Fitting - Fatal编程技术网

R 何时选择nls()而不是黄土()?

R 何时选择nls()而不是黄土()?,r,curve-fitting,R,Curve Fitting,如果我有一些(x,y)数据,我可以很容易地画出穿过它的直线,例如 f=glm(y~x) plot(x,y) lines(x,f$fitted.values) 但是对于曲线数据,我想要一条曲线。似乎可以使用: f=loess(y~x) plot(x,y) lines(x,f$fitted) 这个问题随着我的打字和研究而不断发展。我一开始想用一个简单的函数来拟合曲线数据(我对数据一无所知),想了解如何使用nls()或optim()来实现这一点。在我发现的类似问题中,每个人似乎都在暗示这一点。但是

如果我有一些(x,y)数据,我可以很容易地画出穿过它的直线,例如

f=glm(y~x)
plot(x,y)
lines(x,f$fitted.values)
但是对于曲线数据,我想要一条曲线。似乎可以使用:

f=loess(y~x)
plot(x,y)
lines(x,f$fitted)
这个问题随着我的打字和研究而不断发展。我一开始想用一个简单的函数来拟合曲线数据(我对数据一无所知),想了解如何使用
nls()
optim()
来实现这一点。在我发现的类似问题中,每个人似乎都在暗示这一点。但是现在我偶然发现了黄土()我很高兴。所以,现在我的问题是,为什么有人会选择使用
nls
optim
而不是
leash
(或
smooth.spline
)?使用工具箱类比,是
nls
螺丝刀还是
leash
是电动螺丝刀(这意味着我几乎总是选择后者,因为它做同样的事情,但我的努力更少)?或者
nls
是一把平头螺丝刀,而
leash
是一把十字头螺丝刀(这意味着leash更适合解决某些问题,但对于其他问题,它根本不起作用)

作为参考,以下是我使用的播放数据,
黄土
在以下方面给出了令人满意的结果:

x=1:40
y=(sin(x/5)*3)+runif(x)
以及:

不幸的是,它在这方面做得不太好:

x=1:400
y=(sin(x/20)*3)+runif(x)
nls()或任何其他函数或库是否可以处理此示例和前面的exp示例,而无需给出提示(即,无需被告知它是正弦波)

更新:有关stackoverflow的相同主题的一些有用页面:

smooth.spline“开箱即用”在我的第一个和第三个示例中给出了很好的结果,但在第二个示例中却很糟糕(它只是连接了点)。然而,f=平滑。样条曲线(x,y,spar=0.5)在所有三种情况下都很好

到目前为止,更新#2:gam()(来自mgcv包)非常棒:它在更好的情况下给出了类似于黄土()的结果,在更好的情况下给出了类似于平滑.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是一种通过以迭代方式最小化最小二乘准则来估计这些系数值的方法

黄土是一种使散点图平滑的方法。它有一个定义不太明确的“模型”概念(IIRC没有“模型”)。黄土的工作原理是试图识别响应和协变量之间关系的模式,而用户不必指定这种关系的形式。黄土从数据本身计算出这种关系

这是两种根本不同的观点。如果您知道数据应遵循特定模型,则应使用NLS拟合该模型。你总是可以比较两种拟合(NLS和黄土),看看是否有系统的变化,从假定的模型等-但这将显示在NLS残差


代替黄土,可以考虑在推荐的包<强> MGCV < /强>中通过<代码> GAMER()/代码>拟合的广义加性模型(GAMS)。这些模型可被视为一个惩罚回归问题,但允许根据黄土中的数据估计拟合的平滑函数。GAM对GLM进行了扩展,允许平滑、任意的协变量函数。

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

对此,可以写一个很长的答案。但我也许可以澄清一件事。您知道
有一个
span
degree
参数,对吗?这些因素会影响拟合模型吗?请尝试使用
span=0.1
作为您的最后一个示例数据。谢谢@joran,了解这一点很有用。虽然必须为不同的方程指定不同的跨度算是一个提示。+1回答得不错,因为它们确实是无与伦比的。《大众读物》中有一个章节是关于比较黄土和替代品的平滑度。@Ben我以为Simon Wood在描述GAM的一般形式时使用了这个描述-我无法想象我自己编造的?我猜“任意”的意思是,它们可以是任何形式的平滑。感谢@Gavin对这些函数之间差异的良好解释。如果我想评估一个模型,我选择nls或类似的;如果我想发现一个模型,我会选择gam或类似产品。@DarrenCook不,最后我会说“…选择黄土或类似产品”。GAMs实际上是一个正式的统计模型,与现代理论等一起,是数据分析师工具箱中有用的一部分。GLMs只允许某些形式的关系。GAMs允许识别数据中的真实关系,同时保持在适当的统计框架中。使用GAMs比使用GLMs,一切都变得更接近(即推理),但是使用GLMs比使用线性模型更接近推理-这只是我们必须支付的价格。这是100%正确的;看看
?predict.leuch
,例如,它可以生成预测及其标准误差。@加文·辛普森,是的,leuch确实可以预测,但如果没有系数,它又如何预测呢?
#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)