(正如其他人指出的那样,当数据仅是整数时,Weibull分布不太可能是合适的近似值。以下内容仅用于帮助您确定以前的研究人员是对还是错。
有几种不受数据零影响的替代方法,例如使用各种矩量估计器。这些通常需要涉及伽马函数的方程的数值解,因为威布尔分布的矩是根据该函数给出的。我不熟悉R,但是这里有一个Sage程序,它说明了一种更简单的方法-也许它可以适应R?(您可以在Horst Rinne撰写的“ Weibull发行:一本手册”,第455ff页中阅读有关此方法和其他此类方法的信息;但是,他的等式12.4b中有一个错字,即“ -1”是多余的)。
"""
Blischke-Scheuer method-of-moments estimation of (a,b)
for the Weibull distribution F(t) = 1 - exp(-(t/a)^b)
"""
x = [23,19,37,38,40,36,172,48,113,90,54,104,90,54,157,
51,77,78,144,34,29,45,16,15,37,218,170,44,121]
xbar = mean(x)
varx = variance(x)
var("b"); f(b) = gamma(1+2/b)/gamma(1+1/b)^2 - 1 - varx/xbar^2
bhat = find_root(f, 0.01, 100)
ahat = xbar/gamma(1+1/bhat)
print "Estimates: (ahat, bhat) = ", (ahat, bhat)
这产生了输出
Estimates: (ahat, bhat) = (81.316784310814455, 1.3811394719075942)
0
x = [23,0,37,38,40,36,172,48,113,90,54,104,90,54,157,
51,77,78,144,34,29,45,0,0,37,218,170,44,121]
然后相同的过程产生输出
Estimates: (ahat, bhat) = (78.479354097488923, 1.2938352346035282)
编辑:我刚刚安装R来尝试一下。冒着使这个答案冗长的风险,对于有兴趣的人,这是我的Blischke-Scheuer方法的R代码:
fit_weibull <- function(x)
{
xbar <- mean(x)
varx <- var(x)
f <- function(b){return(gamma(1+2/b)/gamma(1+1/b)^2 - 1 - varx/xbar^2)}
bhat <- uniroot(f,c(0.02,50))$root
ahat <- xbar/gamma(1+1/bhat)
return(c(ahat,bhat))
}
这重现了上述两个Sage示例(至五个有效数字):
x <- c(23,19,37,38,40,36,172,48,113,90,54,104,90,54,157,
51,77,78,144,34,29,45,16,15,37,218,170,44,121)
fit_weibull(x)
[1] 81.316840 1.381145
x <- c(23,0,37,38,40,36,172,48,113,90,54,104,90,54,157,
51,77,78,144,34,29,45,0,0,37,218,170,44,121)
fit_weibull(x)
[1] 78.479180 1.293821