2015-10-13 224 views
2

我想這個數據擬合到威布爾分佈Weibull分佈中的R擬合曲線利用NLS

y <- c(1, 1, 1, 4, 7, 20, 7, 14, 19, 15, 18, 3, 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24) 

情節是這樣的:

enter image description here

我期待這樣的事情: fitted plot

我想對它適合一個威布爾曲線。我使用R中的NLS功能是這樣的:

nls(y ~ ((a/b) * ((x/b)^(a-1)) * exp(- (x/b)^a))) 

此函數總是拋出了一個錯誤說:

Error in numericDeriv(form[[3L]], names(ind), env) : 
    Missing value or an infinity produced when evaluating the model 
In addition: Warning message: 
In nls(y ~ ((a/b) * ((x/b)^(a - 1)) * exp(-(x/b)^a))) : 
    No starting values specified for some parameters. 
Initializing ‘a’, ‘b’ to '1.'. 
Consider specifying 'start' or using a selfStart model 

所以首先我嘗試了不同的初始值沒有任何成功。我無法理解如何對初始值做出「好」的猜測。 然後我去了SSweibull(x, Asym, Drop, lrc, pwr)函數這是一個selfStart函數。現在SSWeibull函數需要Asym,Drop,lrc和pwr的值,我對這些值可能是什麼都沒有任何線索。

如果有人能幫我弄清楚如何着手,我將不勝感激。

數據背景:我從bugzilla獲取了一些數據,我的「y」變量是特定月份中報告的錯誤數量,「x」變量是發佈後的月份數量。

+0

也許這篇文章在交叉驗證將幫助:http://stats.stackexchange.com/questions/19866/how-to-fit-a-weibull-distribution-to-input-data-containing-zeroes – MrFlick

+0

我沒有在問這個問題之前先閱讀這篇文章,但沒有發現它有用,因爲使用fitdistr函數沒有問題。而fitdistr則提供了最佳的配戴合適性,而不是最佳的配合。 –

+1

_hint_:概率密度函數將積分爲1.這是否適合您數據的曲線? –

回答

4

您可能會考慮修改公式以更好地適合數據。例如,你可以添加一個截距(因爲你的數據在1處而不是0,這是模型想要做的)和一個標量乘數,因爲你實際上並不適合密度。

總是值得花一些時間真正思考哪些參數是有意義的,因爲模型擬合程序通常對初始估計非常敏感。你也可以進行網格搜索,找出可能的參數範圍,並嘗試使用錯誤捕獲函數對各種組合進行擬合。 nls2有一個選項可以爲你做到這一點。

因此,例如,

## Put the data in a data.frame 
dat <- data.frame(x=x, y=y) 

## Try some possible parameter combinations 
library(nls2) 
pars <- expand.grid(a=seq(0.1, 100, len=10), 
        b=seq(0.1, 100, len=10), 
        c=1, 
        d=seq(10, 100, len=10)) 

## brute-force them 
## note the model has changed slightly 
res <- nls2(y ~ d*((a/b) * ((x/b)^(a-1)) * exp(- (x/b)^a)) + c, data=dat, 
      start=pars, algorithm='brute-force') 

## use the results with another algorithm 
res1 <- nls(y ~ d*((a/b) * ((x/b)^(a-1)) * exp(- (x/b)^a)) + c, data=dat, 
      start=as.list(coef(res))) 

## See how it looks 
plot(dat, col="steelblue", pch=16) 
points(dat$x, predict(res), col="salmon", type="l", lwd=2) 

enter image description here

並不完美,但它是一個開始。

+0

這看起來非常好。謝謝!我對nls2沒有任何線索。所以要改進你的方法..我可能會使用更多的參數?或者你有更好的建議嗎? –

+0

我會玩實際的模型公式。你也可以看看最大似然估計。 – jenesaisquoi

+0

我看着fitdistr最大似然估計,但我找不到正確的方式來使用它。 –