使用R的最大似然估计出错

时间:2016-01-22 16:02:53

标签: r parameters estimation

我目前正在完成关于Sarhan和Apaloo(2013)引入的指数修正威布尔扩展(EMWE)分布参数估计的本科论文,其中包括以下pdf:

f(x,theta)=theta[1]*theta[2]*theta[3]*((x/theta[4])^(theta[2]-1))*(exp(((x/theta[4])^theta[2])+(theta[1]*theta[4]*(1-(exp(x/theta[4])^theta[2])))))*(1-(exp(theta[1]*theta[4]*(1-(exp(x/theta[4])^theta[2])))))^(theta[3]-1)

该分布具有使用最大似然估计估计的四个参数。由于隐式估计参数,我尝试继续使用Newton-Raphson迭代方法。对于我的计算过程,我使用的是统计软件R语言。我使用的包是“maxLik”,Newton-Raphson方法的初始值是(theta [1] = 0.00007181, theta [2] = 3,148, theta [3] = 0.145, theta [4] = 49.05)

这是对数似然函数:

l(theta)=n*(log(theta[1])+log(theta[2])+log(theta[3])+(1-theta[2])*log(theta[4])+theta[1]*theta[4])+(theta[2]-1)*sum(log(xi))+(1/(theta[4]^theta[2]))*sum(xi^theta[2])-(theta[1]*theta[4])*sum(exp((xi/theta[4])^theta[2]))+(theta[3]-1)*sum(1-(exp((theta[1]*theta[4])*(1-(exp((xi/theta[4])^theta[2]))))))

但是在R语言帮助的参数估计过程中,由于我得到的结果与我使用的参考文献中的估算结果不相似,我陷入僵局。这是我使用的以下R语言语法:

xi<-c(0.1,0.2,1,1,1,1,1,2,3,6,7,11,12,18,18,18,18,18,21,32,36,40,45,46,47,50,55,60,63,63,67,67,67,67,72,75,79,82,82,83,84,84,84,85,85,85,85,85,86,86);
n <-length (xi);
parameter <-function (theta, xi) {
logL<-(n*(log(theta[1])+log(theta[2])+log(theta[3])+(1-theta[2])*log(theta[4])+theta[1]*theta[4])+(theta[2]-1)*sum(log(xi))+(1/(theta[4]^theta[2]))*sum(xi^theta[2])-(theta[1]*theta[4])*sum(exp((xi/theta[4])^theta[2]))+(theta[3]-1)*sum(1-(exp((theta[1]*theta[4])*(1-(exp((xi/theta[4])^theta[2])))))))
return (-logL)
};
library(maxLik);
output <-maxLik (parameter, start = c (0.00007181,3.148,0.145,49.05), xi = xi);

根据语法,我得到的参数估计结果是:

theta [1] = 4.785855e-03
theta [2] = 1.759048e-04
theta [3] = 2.983679e + 04
theta [4] = 9.139192e + 02

虽然纸上属于Sarhan和Apaloo(2013),但结果应如下:

theta [1] = 2.506924e-06
theta [2] = 3.148000e + 00
theta [3] = 1.450000e-01
theta [4] = 4.905000e + 01

我对上述程序中的错误感到困惑。以前,如果我打扰你们,我道歉。我非常感谢你帮助我完成本科毕业论文。很快我会提出这个论点,我发现了很多僵局。我真的期待你的任何帮助,无论多么小的帮助,我都会非常感激。非常感谢你

  • 说实话,我对我糟糕的英语语法感到遗憾。我不会说英语

1 个答案:

答案 0 :(得分:1)

你的似然函数有问题。我无法阅读它,但请注意maxLik 最大化目标函数,因此您必须返回loglik,而不是-loglik。我以更易阅读的形式重新编写了它(请参阅Sarhan&amp; Apaloo 2013)(对不起,但请为参数命名,添加空格,将长方程分成多行...),我也不想使用名称& #34;参数&#34;对于对数似然函数...

loglik <-function(theta, xi) {
   lambda <- theta[1]
   beta <- theta[2]
   gamma <- theta[3]
   alpha <- theta[4]
   xi.a <- xi/alpha
   A <- log(lambda) + log(beta) + log(gamma) + (beta - 1)*log(xi.a)
   LA1 <- lambda*alpha*(1 - exp(xi.a^beta))
   B <- xi.a^beta + LA1
   C <- log(1 - exp(LA1))
   logL <- A + B + (gamma - 1)*C
   return(logL)
}

library(maxLik);
start <- c(2.506924e-6, 3.148,0.145,49.05)
m <- maxLik(loglik, start=start, xi = xi);

它有点奏效。主要问题似乎是数字不稳定。玩不同的优化方法,特别是BFGS似乎让你相当接近:

summary(maxLik(loglik, start = start, method="bfgs", xi = xi))
--------------------------------------------
Maximum Likelihood estimation
BFGS maximization, 337 iterations
Return code 0: successful convergence 
Log-Likelihood: -213.3168 
4  free parameters
Estimates:
      Estimate Std. error t value  Pr(> t)    
[1,] 1.213e-05  5.976e-06   2.030   0.0423 *  
[2,] 3.133e+00  3.709e-02  84.456  < 2e-16 ***
[3,] 1.255e-01  1.897e-02   6.615 3.72e-11 ***
[4,] 4.496e+01         NA      NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

另外,如果您修复了第一个参数,那么您将获得BHHH的确切值:

summary(maxLik(loglik, start = start, method="bhhh", xi = xi, fixed=1))
--------------------------------------------
Maximum Likelihood estimation
BHHH maximisation, 13 iterations
Return code 2: successive function values within tolerance limit
Log-Likelihood: -213.5116 
3  free parameters
Estimates:
      Estimate Std. error t value  Pr(> t)    
[1,] 2.507e-06  0.000e+00      NA       NA    
[2,] 3.091e+00  9.577e-03  322.74  < 2e-16 ***
[3,] 1.153e-01  2.234e-02    5.16 2.46e-07 ***
[4,] 4.189e+01  1.592e+00   26.32  < 2e-16 ***

它暗示剩下的问题与源自第一个组件(lambda)的数值不稳定性有关。我可以建议两种补救措施:

  • 为maxLik函数提供分析梯度。我知道,这是一个地狱,但甚至可能只为lambda提供它就足够了。
  • 重新参数化问题。即使指定lambda <- theta[1]/1e6,并相应地调整起始值,似乎也可以提高收敛性。

另请注意,我从似然函数中删除了求和:现在您也可以使用BHHH方法,这种方法通常比NR更强大。