(正如其他人所指出的,当数据仅为整数时,Weibull 分布不太可能是一个合适的近似值。以下内容旨在帮助您确定之前的研究人员所做的事情,无论是对还是错。)
有几种不受数据中零点影响的替代方法,例如使用各种矩估计方法。这些通常需要对涉及 gamma 函数的方程进行数值求解,因为 Weibull 分布的矩是根据该函数给出的。我不熟悉 R,但这里有一个Sage程序,它说明了一种更简单的方法——也许它可以适应 R?(您可以在例如 Horst Rinne的“The Weibull distribution: a handbook” ,第 455 页 ff中阅读有关此方法和其他此类方法的信息——但是,他的 eq.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, IE
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