R语言 威布尔分布参数估计误差



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

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 负对数似然):如果给定的xl值小于指定的阈值,那么根据您定义的统计模型,这是不可能的。此外,我们已经知道阈值的最大似然值等于数据集中的最小值(类似结果适用于均匀分布边界的 MLE 估计......

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

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

最新更新