威布尔分布参数估计误差

时间:2019-03-27 21:05:30

标签: r statistics distribution mle weibull

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

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)

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

1 个答案:

答案 0 :(得分:1)

问题在于阈值参数很特殊:它为分布定义了一个清晰的边界,因此,高于数据最小值的thres的任何值将给出零可能性(-Inf负对数似然) :如果xl的给定值小于指定阈值 ,则根据您定义的统计模型,这是不可能的。此外,我们已经知道阈值的最大似然值等于等于数据集中的最小值(MLE estimation of the bounds of a uniform distribution的相似结果成立)

我不知道为什么解决这个问题的other questions on SO不会遇到这个特定问题-可能是因为他们使用的阈值的起始值远远低于最小值数据集中的值...

下面,我将固定值min(xl)-1e-5用作阈值(将值向下精确地移到边界上可以避免数值问题)。我还使用了公式接口,因此我们可以直接调用dweibull3()函数,并在shape和scale参数上设置下界(因此,我需要使用method="L-BFGS-B",这会带来约束)。 / p>

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值,因此打破优化]。但是,您会发现阈值参数的估计值始终会收敛到该上限 ...,因此,这种方法确实很难达到先前的答案(您还会收到有关参数的警告处于边界,并且无法反转黑森州)。

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优化,似乎可以在不固定阈值参数的情况下对模型进行拟合:但是,这似乎给出了不可靠的结果。