multinomial MLE error in R

2019-07-23 07:43发布

问题:

I am new to R, Trying do MLE using mle2 in bbmle package. R Code:

rm(list = ls())  
library(bbmle)  
N <- 100  
testmat=rmultinom(N, size=3, prob = c(0.1,0.2,0.8))  
LL<- function(s, p){-sum(dmultinom(x=testmat, size = s, prob=p, log = TRUE))}  
values.start <- list(3, c(0.1,0.2,0.7))   
names(values.start) <- parnames(LL) <- paste0("b",0:1)  
mle2(LL, start =values.start) 

I keep getting this error
"Error in mle2(LL, start = values.start) : some named arguments in 'start' are not arguments to the specified log-likelihood function"

I am using mle2, I thought its not needed here. At first I was using "mle"

N <- 100
testmat=t(rmultinom(3, size=3, prob = c(0.1,0.2,0.8)))
LL<- function(s, p1,p2,p3){prob=unlist(as.list(environment()))[2:4]
  -sum(dmultinom(x=testmat, size = s, prob=prob, log = TRUE))}
values.start <- list(s=3,p1=0.1,p2=0.2,p3=7)
mle(LL, start =values.start)

which game this error ""Error in dmultinom(x = testmat, size = s, prob = prob, log = TRUE) : x[] and prob[] must be equal length vectors."

I even edited it as follows

N <- 100
testmat=t(rmultinom(3, size=3, prob = c(0.1,0.2,0.8)))
LL<- function(s=3, p1=0.1,p2=0.2,p3=0.7){
  prob=unlist(as.list(environment()))[2:4]
  s=unlist(as.list(environment()))[1]
  -sum(dmultinom(x=testmat, size = s, prob=prob, log = TRUE))}
mle(LL)

error still persists. Finally I was able to decode the errors, thanks a lot.

library(bbmle)  
N <- 1000
X=rmultinom(N,size=3,prob = rep(1/3, 3))

    LL <- function( p_1 = 0.1,p_2=0.1,p_3=0.8) {
      p <- unlist(as.list(environment()))
    -sum(apply(X, MAR = 2, dmultinom, size = NULL, prob = c(p_1,p_2,p_3), log = TRUE))
    }
    mle(LL,method = "L-BFGS-B", lower = c(-Inf, 0), upper = c(Inf, Inf))

In my current ploblem, I have 5k features, therefore I need to write something like this.

function( p_1 = 0.1,p_2=0.1,p_3=0.8...., p_5000=..)

which not possible. Is there any way out of it?

I was able to do it with mle2. this way

rm(list = ls())
library(bbmle)  
N <- 1000
s<-100
X=rmultinom(N,size=s,prob = rep(1/s, s))
LL= function(params){
  p <- unlist(as.list(environment()))
  minusll  = -sum(apply(X, MAR = 2, dmultinom, size = NULL, prob = p, log = TRUE))
  return(minusll)
}
values.start<-vector(mode="list", length=s)
values.start <- c(0.02,0.01*rep(98/99,99))
names(values.start) <- parnames(LL)<-paste0("b",1:s)
mle2(LL, start =values.start,vecpar = TRUE, method = "L-BFGS-B", lower = c(rep(0,s)), upper = c(rep(1,s)))

Above I was doing Multinomial MLE parameter estimation for dimension of 100, and 1000 samples. I was able to solve the problem of vector parameters. Now I am having this error

Error in optim(par = c(0.02, 0.0098989898989899, 0.0098989898989899, 0.0098989898989899,  : 
  L-BFGS-B needs finite values of 'fn'

I found out that this error is due to 'fn=Inf', might be due to one of the propabilities becoming zero, therefore fn=-log(0) = Inf. Is there any way to solve this problem? Thanks for the help.