R中均匀分布的最大似然估计导致荒谬的结果

时间:2016-12-08 19:04:08

标签: r statistics mle

我想使用mle函数来估算a分布中bUnif(a,b)的估算值。但我得到的荒谬估计远不及1和3.

library(stats4)
set.seed(20161208)

N <- 100
c <- runif(N, 1, 3)
LL <- function(min, max) {
  R <- runif(100, min, max)
  suppressWarnings((-sum(log(R))))
  }
mle(minuslogl = LL, start = list(min = 1, max = 3), method = "BFGS",
    lower = c(-Inf, 0), upper = c(Inf, Inf))

我得到了:

Call:
mle(minuslogl = LL, start = list(min = 1, max = 3), method = "BFGS")

Coefficients:
     min      max 
150.8114 503.6586 

有关进展情况的任何想法?提前谢谢!

1 个答案:

答案 0 :(得分:3)

我首先会指出您的代码出错的地方。

  1. 您需要dunif而不是runif。您可以定义:

    LL <- function (a, b) -sum(dunif(x, a, b, log.p = TRUE))
    

    在我的代码中,我没有使用dunif,因为密度只是1 / (b - a),所以我直接写了。

  2. 您正在目标函数中生成示例。对于U[a,b],这是正常的,因为其密度不含x。但对于其他分布,目标函数在每次迭代时都会发生变化。
  3. 使用框约束时,您需要method = "L-BFGS-B",而不是普通的"BFGS"。而你没有使用正确的约束。
  4. 现在更深入......

    对于来自n的长度 - x样本向量U[a, b],可能性为(b - a) ^ (-n),负对数可能性为n * log(b - a)。显然,MLE是a = min(x)b = max(x)

    数值优化是完全没必要的,事实上没有约束就不可能。看看渐变向量:

    ( n / (a - b), n / (b - a) )
    

    偏导数w.r.t. a / b始终为负数/正数,且不能为0.

    当我们施加框约束时,数值方法变得可行:-Inf < a <= min(x)max(x) <= b < Inf。我们确信迭代终止于边界。

    下面的代码同时使用optimmle。注意mle将失效,当它反转Hessian矩阵时,因为它是单数的:

    -(b - a) ^ 2    (b - a) ^ 2
     (b - a) ^ 2   -(b - a) ^ 2
    

    代码:

    ## 100 samples
    set.seed(20161208); x <- runif(100, 1, 3)
    # range(x)
    # [1] 1.026776 2.984544
    
    ## using `optim`
    nll <- function (par) log(par[2] - par[1])  ## objective function
    gr_nll <- function (par) c(-1, 1) / diff(par)  ## gradient function
    optim(par = c(0,4), fn = nll, gr = gr_nll, method = "L-BFGS-B",
          lower = c(-Inf, max(x)), upper = c(min(x), Inf), hessian = TRUE)
    #$par
    #[1] 1.026776 2.984544  ## <- reaches boundary!
    #
    # ...
    #
    #$hessian  ## <- indeed singular!!
    #           [,1]       [,2]
    #[1,] -0.2609022  0.2609022
    #[2,]  0.2609022 -0.2609022
    
    ## using `stats4::mle`
    library(stats4)
    nll. <- function (a, b) log(b - a)
    mle(minuslogl = nll., start = list(a = 0, b = 4), method = "L-BFGS-B",
        lower = c(-Inf, max(x)), upper = c(min(x), Inf))
    #Error in solve.default(oout$hessian) : 
    #  Lapack routine dgesv: system is exactly singular: U[2,2] = 0