繁体   English   中英

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

[英]Maximum likelihood estimation with uniform distribution in R leads to absurd result

我想使用mle函数来获得Unif(a,b)分布中ab估计值。 但我估计荒谬的估计数接近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. 你需要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" 而你没有使用正确的约束。

现在更深入......

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

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

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

偏导数wrt a / b总是负/正,不能为0。

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

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

-(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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM