【问题标题】:How to place bounds on nls coefficients?如何对 nls 系数设置界限?
【发布时间】:2016-02-08 00:35:42
【问题描述】:

有没有一种方法可以限制 NLS 系数在 R 中的取值范围?我知道我的数据应该存在的曲线形状;但是,NLS 无法通过产生

本质上,我正在尝试为一组幼树茎(树苗)数据生成茎高与地上生物量的关系。树木的高度受到场地寒冷天气的影响,因此它们的高度接近极限......但随着年龄的增长,它们的周长和生物量继续增长。

问题是我只有特定范围的树高的数据,并且缺少高度

#Plot the raw data
plot(AC$Height.m, AC$ag.biomass, xlim=c(0,2.5), ylim=c(0,40))

#Generate a NLS fit and plot curve on the raw data to show misfit
bg.nls = nls(ag.biomass ~ B0*Height.m^B1, data=AC, start=list(B0=8,B1=2))
curve(coef(bg.nls)[1]*x^coef(bg.nls)[2], col="red", add=TRUE)

#Provide example of appropriate growth curve given biological understanding
curve(6*x^1.7, col="blue", add=TRUE)

这会产生以下情节。红线表示 NLS 失配(主要是由于 B1

我知道,这种生成模型拟合的方法存在许多统计问题——但我在这里不关心它们。相反,我只是对将 B1 值限制为仅大于 1 的值的技术问题感兴趣。有没有办法这样做?

【问题讨论】:

  • 检查lowerupper 参数以约束系数适合nls
  • 但是请注意,upperlower 参数只能与端口算法一起使用,根据文档“似乎未完成”并且应该“谨慎使用,尤其是在提供了边界。”

标签: r constraints regression nls


【解决方案1】:

您可以使用nlsupperlower 参数对系数拟合设置约束。约束仅适用于 port 算法,因此您也需要指定它。简单例子:

没有约束:

nls(mpg ~ wt^a + disp^b, data=mtcars, start=list(a=3.5, b=0.1), algorithm="port")

Nonlinear regression model
model: mpg ~ wt^a + disp^b
data: mtcars
a      b 
0.4441 0.5025 
residual sum-of-squares: 3612

有约束:

nls(mpg ~ wt^a + disp^b, data=mtcars, start=list(a=3.5, b=0.1), algorithm="port", 
    lower=c(3,0), upper=c(5,0.25))

Nonlinear regression model
model: mpg ~ wt^a + disp^b
data: mtcars
a b 
3 0 
residual sum-of-squares: 78781

Algorithm "port", convergence message: relative convergence (4)

【讨论】:

  • 似乎有了约束,NLS 只估计上下“界限”而不是更好的值。
  • 我猜当约束不包括局部最优并且最接近局部最优的拟合是在约束的边界处时会发生这种情况。如果您更改约束(例如,lower=c(-5, 0), upper=c(5, 1)),您会发现它不会自动结束在边界上。我在答案中随机选择了约束以进行说明,但在实际分析中,您希望根据领域知识来选择它们。
猜你喜欢
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 2010-12-05
  • 2014-02-12
  • 2022-01-24
  • 2021-12-14
相关资源
最近更新 更多