2017-05-25 90 views
0

我的數據由兩列 - 時間和累計數如下圖所示:非線性擬合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) 

我的目標是利用我的數據模型非線性方法。我試過如下:

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 

回答

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)) 

(繪製在對數y縮放比例,並且什麼我發現下面延伸y軸的限制,基於...)

enter image description here

  • 從上面的等式中,我們知道,漸近線(用於大的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) 

enter image description here

+0

謝謝你這麼多!!!!!!!!!!!!!!!!!!!!!我得到了點 –

+0

THANK YOU SO MUCH 。如果我要計算這個模型的置信區間,但仍然是母豬的錯誤是這樣的:等待分析做... 錯誤教授$ getProfile():奇異梯度.........你能不能請在這方面澄清@Ben Bolker –