r - 如何设置 nls 系数的界限?

标签 r constraints regression nls

有没有办法限制 NLS 系数在 R 中的取值范围?我知道我的数据应该存在的曲线形状;然而,NLS 无法通过产生 < 1 的功率系数来产生这样的曲线。

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

问题是我只有一定范围内的树高数据,并且缺少高度小于 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),蓝线表示生物学上合适的拟合。

enter image description here

我知道有许多与生成模型拟合的方法相关的统计问题——但是我在这里不关心它们。相反,我只是对将 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)

关于r - 如何设置 nls 系数的界限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33573987/

相关文章:

r - ggplot2 中的 geom.point,条件形状

RServe 共享库代码

c# - 使用反射调用具有约束的泛型方法

r - 纵向序列数据的三次样条方法?

python - 在 scikit-learn 中实现 R 随机森林特征重要性评分

R 中的递归回归(提取残差)

r - R中的布局内部布局

r - 大写数据框中的第一个字母

系统 verilog 中数组的约束

postgresql - 如何添加 "on delete cascade"约束?