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

R中均匀分布的极大似然估计导致了荒谬的结果,r,statistics,mle,R,Statistics,Mle,我想使用mle函数来获得aUnif(a,b)分布中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 =

我想使用
mle
函数来获得a
Unif(a,b)
分布中
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))

你知道发生了什么事吗?提前谢谢你

我首先要指出你的代码哪里错了。

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

    LL <- function (a, b) -sum(dunif(x, a, b, log.p = TRUE))
    
    偏导数w.r.t.
    a
    /
    b
    始终为负/正,且不能为0


    当我们施加框约束时,数值方法变得可行:
    -Inf我首先要指出您的代码哪里是错误的。

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

    LL <- function (a, b) -sum(dunif(x, a, b, log.p = TRUE))
    
    偏导数w.r.t.
    a
    /
    b
    始终为负/正,且不能为0


    当我们施加框约束时,数值方法变得可行:
    -Infmle
    不是一个基本的R函数。
    LL
    应该是你的对数似然函数吗?因为
    runif
    绝对不应该出现在你的对数似然函数中。@lmo:library(stat4)@Dason:好吧,这就是我理解R中mle函数的方式。我做错了吗?另一件事是,该代码适用于其他发行版,如Poisson和gamma。@Lola-是的,你做得不对。你能包括你正在使用的库的名称吗
    mle
    不是一个基本的R函数。
    LL
    应该是你的对数似然函数吗?因为
    runif
    绝对不应该出现在你的对数似然函数中。@lmo:library(stat4)@Dason:好吧,这就是我理解R中mle函数的方式。我做错了吗?另一件事是,该代码适用于其他发行版,如Poisson和gamma。@Lola-是的,你做得太错了。
    ( n / (a - b), n / (b - a) )
    
    -(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