Weibull 上 MLE 的 R 和 SAS 之间的不一致

机器算法验证 r 最大似然 sas 威布尔分布
2022-04-02 06:10:54

我有以下数据Y,我想使用 R 中的 Weibull 分布对参数进行 MLE 估计。

1468, 1872, 475, 1372, 3830, 1849, 978, 1389, 909, 701, 1227, 962, 1781, 580, 584, 2675, 841, 1544, 452, 955, 556, 15537, 731,7, 1188、2649、1800、2718、808、1138、909、1359、846、1334、1397、719、1715、681、2002、994、2543、1564、1717、1106、1859

如果我尝试运行,fitdistr(Y, "weibull")我会收到警告:

fit = fitdistr(Y, "weibull")
Warning message:
In densfun(x, parm[1], parm[2], ...) : NaNs produced
> warnings(fit)
Warning message:
In densfun(x, parm[1], parm[2], ...) : NaNs produced Error in 
at(list(...), file, sep, fill, labels, append) : 
argument 2 (type 'list') cannot be handled by 'cat'

但它仍然给了我一个 MLE。但是,该值与 SAS 给出的结果不同。

R的输出:

  shape          scale    
 2.1103684   1537.2344072 
(0.2245888)  (112.1596367)

SAS 的输出(使用 proc lifereg):

 Weibull Scale 1550.559
 Weibull Shape 2.1195

是什么导致了这种差异,是否有任何首选的包/函数来计算分布的 MLE 的简单MASS估计fitdistr

3个回答

不应期望优化函数对不同包中的类似函数给出相同的答案 - 甚至对具有不同选项的相同函数给出相同的答案。

我尝试了各种不同的优化器和fitdistr. 他们通常给出非常相似的结果,其中 SAS 和你fitdistr在 R 中得到的结果是典型的。

我已经包含了其中一种拟合,在fitdistr非默认起点中使用了不同的优化器。就结果拟合而言,这三个基本上是无法区分的(你的两个结果比第三个更相似):

在此处输入图像描述

我不认为有什么不妥。

警告不应被忽略,但应尽可能进行调查,但有时可能会生成错误(或在这种情况下为警告),但不会表明存在任何收敛问题。你应该试着弄清楚是什么原因造成的。尝试不同的起点和优化器(并绘制结果拟合)应该表明是否存在很多问题。

[理想情况下,您应该在已确定的最佳值附近将函数绘制在 3D 图中(或在 2D 图中绘制其轮廓),这将有助于识别许多潜在问题。]


对于 Weibull,您可以做的一件事是使用包survreg中的函数survival,它将适合 Weibull 作为其默认模型。它的两个参数与通常的 Weibull 参数相关(这在帮助中有所描述survreg)。您只需要一个恒定均值模型:

> survreg(Surv(Y)~1)
Call:
survreg(formula = Surv(Y) ~ 1)

Coefficients:
(Intercept) 
   7.354423 

Scale= 0.4703164 

Loglik(model)= -362.2   Loglik(intercept only)= -362.2
n= 46 
> exp(7.354423)   #  exponentiate the Intercept
[1] 1563.095
> 1/0.4703164     #  take inverse of the Scale
[1] 2.126228

summary(survreg)将给出它使用的比例的标准误差,但如果你采用 95% CI 并转换端点,它们可以用作转换参数的 CI。

首先提醒该fitdistr函数(来自 MASS 包)是一个非常通用的函数,几乎可以与任何发行版一起使用。警告来自默认情况下不受约束的优化期间遇到的不允许的参数值(例如负比例或形状)。

在这里尝试针对 Weibull 分布的特定MLE 似乎是个好主意。一个众所周知的事实是,两参数 Weibull 的 ML 估计可以依赖于对数似然的集中,从而导致更容易的一维 优化。此外,集中对数似然是凹的,因此存在唯一的 ML 估计。

这里的问题是,对数似然在最优值附近非常平坦,因此不同的优化会导致不同的结果,正如@Glen_b 所报告的那样。此外,数据缩放容易出现数值问题。重新缩放后,无论是否集中,都可以获得类似的结果。关于 MLE 的一个普遍的实际发现是,使用比例不佳的数据可能足以破坏估计。

> library(Renext)            ## for concentrated log-lik
> try(fweibull(Y))           ## error (numerical pb with information matrix)
> fit <- fweibull(Y / 1000)  ## works
> ## set parameters and logLik back to original scale
> fit$est * c(1, 1000)
      shape       scale 
   2.126225 1563.094460

> fit$sd * c(1, 1000)
      shape       scale 
  0.2444308 114.1293266

> fit$loglik - length(Y) * log(1000)
[1] -362.2237

> library(MASS)
> ## set parameters and logLik back to original scale
> fit2 <- fitdistr(Y / 1000, "weibull")
> fit2$est * c(1, 1000)
      shape       scale 
   2.126231 1563.095165 

> fit2$sd * c(1, 1000)
      shape       scale 
  0.2288605 114.9071653 

> fit2$loglik - length(Y) * log(1000)
[1] -362.2237

虽然 SAS 输出优于 R 输出,但令人不快的事实是两者的表现都相当差。要看到这一点,请注意报告解决方案的梯度应消失为 0 ... 而对于 R 和 SAS 结果,情况并非如此。

特别是,让与 pdfXWeibull(b,c)f(x)


(来源:tri.org.au

我要激活mathStaticaSuperLog功能:


(来源:tri.org.au

的精确符号对数似然由下式给出:θ=(b,c)


(来源:tri.org.au

替换数据值会产生准确的观察到的对数似然:(x1,,xn)n=46


(来源:tri.org.au

对于 R 解决方案和 SAS 解决方案,在每个报告的解决方案处计算的梯度向量为:


(来源:tri.org.au

在最优解处,梯度应该消失到 0。SAS 解决方案优于 R 解决方案,但两者都很差。Yves 报告的解决方案做得更好:


(来源:tri.org.au

...但仍然可以轻松改进。

Hessian 矩阵(在解处)……和 Hessian 的特征值……也应该被计算,以确保观察到的对数似然在邻域中是凹的。