非线性拟合 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.001
或B ~ 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)
我的数据由两列组成 - 时间和累计数量,如下所示:
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.001
或B ~ 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)