【问题标题】:Non linear fit in rr中的非线性拟合
【发布时间】:2017-05-26 08:03:21
【问题描述】:

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

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)

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

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

【问题讨论】:

    标签: r nls


    【解决方案1】:

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

    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 倍的时间)。看起来像电子折叠时间 ~ 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)
    

    【讨论】:

    • 非常感谢。如果我想计算这个模型的置信区间,它仍然会出现这样的错误:Waiting for profiling to be done... prof$getProfile() 中的错误:奇异梯度.........请问在这方面澄清@Ben Bolker
    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多