非线性拟合 r

Non linear fit in r

我的数据由两列组成 - 时间和累计数量,如下所示:

time <- c(1:14)
cum.num <- c(20, 45, 99, 195, 301, 407, 501, 582, 679, 753, 790, 861, 1011, 1441)

我的非线性函数是:

B/(B*C*exp(-A*B*time) + 1)

我的 objective 是使用非线性方法对我的数据建模。我尝试了以下方法:

m1 < -nls(cum.num ~ B/((B*C)*exp(-A*B*time) + 1)

我尝试了几个初始值,但出现以下错误:

Error in nls(cum.vul ~ B/((B * C) * exp(-A * B * time) + 1), 
start = list(B = 60,  : singular gradient

发生这种情况时,您通常需要做一些侦探工作来了解函数的参数,并通过查看绘图粗略估计值。

time <- c(1:14)
cum.num <- c(20, 45, 99, 195, 301, 407, 501, 582, 679,
           753, 790, 861, 1011, 1441)
  • 首先要注意的是函数的顶层结构是双曲线的(即 1/(1+x) 形式)。如果我们反转 y 值,那么数据可视化和估计参数会更容易,因此我们有 1/cum.num ~ C*exp(-A*B*time) + 1/B.
plot(time,1/cum.num,log="y",xlim=c(0,14),ylim=c(0.0005,0.5))

(根据我在下面发现的内容,以 log-y 比例绘制,并扩展 y 轴限制...)

  • 从上面的等式,我们知道渐近线(大y的值)应该是1/B,所以我们有1/B ~ 0.001B ~ 1000
  • 在时间 0 时,该值应为 C + 1/B = C + 0.001。查看图表,我们有 C ~ 0.5
  • 最后,1/(A*B)是减少的特征尺度(即e-fold减少的时间)。看起来电子折叠时间 ~ 1 (从 t=1 到 t=2) 所以 1/(A*B) ~ 1 所以 A ~ 0.001

使用这些起始值来拟合:

m1 <- nls(cum.num ~ B/((B*C)*exp(-A*B*time) + 1),
                   start=list(A=0.001,B=1000,C=0.5))

似乎有效。绘制预测值:

tpred <- seq(0,14,length=101)
cpred <- predict(m1,newdata=data.frame(time=tpred))
par(las=1,bty="l")
plot(time,cum.num)
lines(tpred,cpred)