4 参数 NLS 的起始值 - Chapman Richards 函数
Starting values for 4 parameter NLS - Chapman Richards function
*注意 - 我已经阅读了几篇关于如何找到 NLS 起始值的文章 - 但是,我还没有找到一个具有这种形式的方程式(即 4 个参数,指数的幂)
我正在努力寻找 Chapman Richards 方程的合适起始值,该方程在林业中常用于模拟树木生长。
y(t) = α * (1 - β * exp(-k * t)^{1/(1-m)})
我通常尝试通过绘制一条带有设定参数的线来找到初始值,然后调整它以更接近地拟合数据(图 1)。在此之后我将使用函数中的参数:
initial.test <- chapmanRichards(seq(0:15),42,0.95,0.28, 0.67)
plot(age,topHeight,type="p",xlab="year since planting",ylab="Dom height (m)", xlim = c(0,20), ylim = c(0, 50))
lines(seq(0:15),initial.test,col="red")
nls(topHeight ~ chapmanRichards(age,a,b,k,m),start=list(a=42,b=0.95,k=0.28,m=0.67))
在这种情况下,程序能够使用提供的起始值拟合曲线。然而,问题是当数据有点嘈杂时,在摆弄初始测试值 2 小时后,我仍然找不到足够好的起始值(图 2 显示了在另一个数据集上的几次尝试。
任何人都可以建议找到合适的起始值的好方法吗?我想过创建一个矩阵,该矩阵基本上为每个参数运行一个序列,并使用这些起始值循环 nls,但不确定代码的外观。任何其他建议将不胜感激!
PS - 这会更适合 Excel - 求解器吗?
正如@Roland 在评论中指出的那样,问题中显示的方程式中的参数无法识别,因此假设方程式如他所示:
y = a * (1 - b * exp(-k * t))^{1/(1-m)}
取双方日志:
log(y) ~ log(a) + (1/(1-m)) * log(1 - b * exp(-k*t))
并令 log(a) = A, 1/(1-m) = M 和 b = exp(k*B) 给出:
log(y) ~ A + M * log(1 - exp(k*(B-t))
由于 B 是一个偏移量,k 是一个缩放比例,我们可以将它们估计为 B = mean(t) 和 k = 1/sd(t)。使用 algorithm = "plinear"
我们可以避免线性参数(A 和 M)的起始值,前提是我们将右侧指定为矩阵,使得 A 乘以第一列加上 M 乘以第二列将给出预测值。因此我们有:
st <- list(B = mean(t), k = 1/sd(t))
fm0 <- nls(log(y) ~ cbind(1, log(1 - exp(k*(B - t)))), start = st,
algorithm = "plinear")
然后对如此获得的系数进行反变换以获得运行的起始值最终nls
.
另请注意,nls2 包中的 nls2
可以在网格或一组随机点上评估模型以获得起始值。
*注意 - 我已经阅读了几篇关于如何找到 NLS 起始值的文章 - 但是,我还没有找到一个具有这种形式的方程式(即 4 个参数,指数的幂)
我正在努力寻找 Chapman Richards 方程的合适起始值,该方程在林业中常用于模拟树木生长。
y(t) = α * (1 - β * exp(-k * t)^{1/(1-m)})
我通常尝试通过绘制一条带有设定参数的线来找到初始值,然后调整它以更接近地拟合数据(图 1)。在此之后我将使用函数中的参数:
initial.test <- chapmanRichards(seq(0:15),42,0.95,0.28, 0.67)
plot(age,topHeight,type="p",xlab="year since planting",ylab="Dom height (m)", xlim = c(0,20), ylim = c(0, 50))
lines(seq(0:15),initial.test,col="red")
nls(topHeight ~ chapmanRichards(age,a,b,k,m),start=list(a=42,b=0.95,k=0.28,m=0.67))
在这种情况下,程序能够使用提供的起始值拟合曲线。然而,问题是当数据有点嘈杂时,在摆弄初始测试值 2 小时后,我仍然找不到足够好的起始值(图 2 显示了在另一个数据集上的几次尝试。
任何人都可以建议找到合适的起始值的好方法吗?我想过创建一个矩阵,该矩阵基本上为每个参数运行一个序列,并使用这些起始值循环 nls,但不确定代码的外观。任何其他建议将不胜感激!
PS - 这会更适合 Excel - 求解器吗?
正如@Roland 在评论中指出的那样,问题中显示的方程式中的参数无法识别,因此假设方程式如他所示:
y = a * (1 - b * exp(-k * t))^{1/(1-m)}
取双方日志:
log(y) ~ log(a) + (1/(1-m)) * log(1 - b * exp(-k*t))
并令 log(a) = A, 1/(1-m) = M 和 b = exp(k*B) 给出:
log(y) ~ A + M * log(1 - exp(k*(B-t))
由于 B 是一个偏移量,k 是一个缩放比例,我们可以将它们估计为 B = mean(t) 和 k = 1/sd(t)。使用 algorithm = "plinear"
我们可以避免线性参数(A 和 M)的起始值,前提是我们将右侧指定为矩阵,使得 A 乘以第一列加上 M 乘以第二列将给出预测值。因此我们有:
st <- list(B = mean(t), k = 1/sd(t))
fm0 <- nls(log(y) ~ cbind(1, log(1 - exp(k*(B - t)))), start = st,
algorithm = "plinear")
然后对如此获得的系数进行反变换以获得运行的起始值最终nls
.
另请注意,nls2 包中的 nls2
可以在网格或一组随机点上评估模型以获得起始值。