如何在 nls 系数上设置界限?
How to place bounds on nls coefficients?
有没有办法限制 NLS 系数在 R 中的取值范围?我知道我的数据应该存在的曲线形状;然而,NLS 无法通过生成 < 1 的幂系数来生成这样的曲线。
本质上,我正在尝试为一组幼树茎(树苗)数据生成茎高与地上生物量的关系。树木的高度因现场的寒冷天气而受阻,因此它们的高度接近极限......但随着年龄的增长,树的周长和生物量继续增长。
问题是我只有特定范围树高的数据,并且缺少高度 < 1.3 米的树干的值。到目前为止我的代码是:
#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 <1),蓝线表示生物学上合适的拟合。
我知道有很多与这种生成模型拟合的方法相关的统计问题——但是我在这里不关心它们。相反,我只是对将 B1 值限制为仅大于 1 的值的技术问题感兴趣。有没有办法这样做?
您可以使用 upper
和 lower
参数对 nls
设置系数拟合约束。约束仅适用于 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 系数在 R 中的取值范围?我知道我的数据应该存在的曲线形状;然而,NLS 无法通过生成 < 1 的幂系数来生成这样的曲线。
本质上,我正在尝试为一组幼树茎(树苗)数据生成茎高与地上生物量的关系。树木的高度因现场的寒冷天气而受阻,因此它们的高度接近极限......但随着年龄的增长,树的周长和生物量继续增长。
问题是我只有特定范围树高的数据,并且缺少高度 < 1.3 米的树干的值。到目前为止我的代码是:
#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 <1),蓝线表示生物学上合适的拟合。
我知道有很多与这种生成模型拟合的方法相关的统计问题——但是我在这里不关心它们。相反,我只是对将 B1 值限制为仅大于 1 的值的技术问题感兴趣。有没有办法这样做?
您可以使用 upper
和 lower
参数对 nls
设置系数拟合约束。约束仅适用于 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)