我使用以下函数来估计三参数威布尔分布。
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)
有什么办法可以解决这个问题? 谢谢!
答案 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优化,似乎可以在不固定阈值参数的情况下对模型进行拟合:但是,这似乎给出了不可靠的结果。