威布尔分布参数估计误差

Weibull Distribution parameter estimation error

我使用以下函数来估计三参数威布尔分布。

library(bbmle)
library(FAdist)
set.seed(16)
xl=rweibull3(50, shape = 1,scale=1, thres = 0)
dweib3l <- function(shape, scale, thres) { 
  -sum(dweibull3(xl , shape, scale, thres, log=TRUE))
}
ml <- mle2(dweib3l, start= list(shape = 1, scale = 1, thres=0), data=list(xl))

但是,当我 运行 使用上述函数时,出现以下错误。

Error in optim(par = c(shape = 1, scale = 1, thres = 0), fn = function (p)  : 
  non-finite finite-difference value [3]
In addition: There were 16 warnings (use warnings() to see them)

有什么办法可以解决这个问题吗? 谢谢!

问题在于阈值参数很特殊:它定义了分布的明确边界,因此任何高于数据最小值的 thres 值都将给出零可能性(-Inf 负对数- likelihoods):如果xl的给定值比指定阈值,那么根据您定义的统计模型是不可能的。此外,我们已经知道阈值的最大似然值 等于 到数据集中的最小值(类似的结果适用于 MLE estimation of the bounds of a uniform distribution ...)

我不知道为什么解决这个问题的 other 没有遇到这个特殊问题 - 可能是因为他们使用的阈值起始值远远低于数据集...

下面,我使用固定值min(xl)-1e-5作为阈值(将值向下移动可以避免当值恰好在边界上时出现数值问题)。我还使用公式接口,这样我们就可以直接调用 dweibull3() 函数,并对形状和比例参数设置下限(因此我需要使用 method="L-BFGS-B",它允许约束)。

ml <- mle2(xl ~ dweibull3(shape=shape, scale = scale,
                        thres=min(xl)-1e-5),
           start=list(shape=1, scale=1),
           lower=c(0,0),
           method="L-BFGS-B",
           data=data.frame(xl))

(公式界面对于简单的例子很方便:如果你想做一些非常复杂的事情,你可能想回到明确定义你自己的对数似然函数。)


如果您坚持要拟合阈值参数,您可以通过设置一个(几乎)等于数据中出现的最小值的上限来实现 [任何更大的值都会给出 NA 值从而打破优化]。然而,你会发现 阈值参数的估计总是收敛到这个上限 ...所以这种方法真的很难得到以前的答案(你也会得到有关参数在边界上以及无法反转 Hessian 矩阵的警告)。

eps <- 1e-8
ml3 <- mle2(xl ~ dweibull3(shape=shape, scale = scale, thres = thres),
            start=list(shape=1, scale=1, thres=-5),
            lower=c(shape=0,scale=0,thres=-Inf),
            upper=c(shape=Inf,scale=Inf,thres=min(xl)-eps),
            method="L-BFGS-B",
            data=data.frame(xl))

就其价值而言,如果您从较小的值开始并使用 Nelder-Mead 优化,似乎可以在不固定阈值参数的情况下拟合模型:但是,它似乎给出了不可靠的结果。