2012-05-15 10 views
7

Estoy tratando de usar el comando mle2, en el paquete bbmle. Estoy mirando la p2 de "Estimación de máxima verosimilitud y análisis con el paquete bbmle" de Bolker. De alguna manera, no puedo ingresar los valores correctos de inicio. Aquí está el código reproducibles:intervalos de confianza de perfil en R: mle2

l.lik.probit <-function(par, ivs, dv){ 
Y <- as.matrix(dv) 
X <- as.matrix(ivs) 
K <-ncol(X) 
b <- as.matrix(par[1:K]) 
phi <- pnorm(X %*% b) 
sum(Y * log(phi) + (1 - Y) * log(1 - phi)) 
} 

n=200 

set.seed(1000) 

x1 <- rnorm(n) 
x2 <- rnorm(n) 
x3 <- rnorm(n) 
x4 <- rnorm(n) 

latentz<- 1 + 2.0 * x1 + 3.0 * x2 + 5.0 * x3 + 8.0 * x4 + rnorm(n,0,5) 

y <- latentz 
y[latentz < 1] <- 0 
y[latentz >=1] <- 1 
x <- cbind(1,x1,x2,x3,x4) 
values.start <-c(1,1,1,1,1) 

foo2<-mle2(l.lik.probit, start=list(dv=0,ivs=values.start),method="BFGS",optimizer="optim", data=list(Y=y,X=x)) 

y este es el error que consigo:

Error in mle2(l.lik.probit, start = list(Y = 0, X = values.start), method = "BFGS", : 
    some named arguments in 'start' are not arguments to the specified log-likelihood function 

Cualquier idea de por qué? ¡Gracias por tu ayuda!

+1

'values.start' no está especificado. Tienes que definirlo. También hay un error tipográfico en 'foo2 << -'. –

+0

¡Gracias por la respuesta rápida! Hice esos cambios (mis valores iniciales son values.start <-c (1,1,1,1,1)), pero sigo recibiendo el mismo mensaje de error. Creo que hay una incongruencia entre el comando mle2 y la función que especifiqué, ¡pero no puedo entenderlo por mi vida! – EOM

+1

¿Está implementando una [regresión probit] (http://www.ats.ucla.edu/stat/R/dae/probit.htm)? –

Respuesta

6

Te has perdido un par de cosas, pero la más importante es que por defecto mle2 toma una lista de parámetros; puede hacer que tome un parámetro vector, pero debe trabajar un poco más.

He modificado el código ligeramente en algunos lugares. (He cambiado la función de log-verosimilitud a una función logarítmica de verosimilitud negativa, sin los cuales esto no funcionaría!)

l.lik.probit <-function(par, ivs, dv){ 
    K <- ncol(ivs) 
    b <- as.matrix(par[1:K]) 
    phi <- pnorm(ivs %*% b) 
    -sum(dv * log(phi) + (1 - dv) * log(1 - phi)) 
} 

n <- 200 

set.seed(1000) 

dat <- data.frame(x1=rnorm(n), 
        x2=rnorm(n), 
        x3=rnorm(n), 
        x4=rnorm(n)) 

beta <- c(1,2,3,5,8) 
mm <- model.matrix(~x1+x2+x3+x4,data=dat) 
latentz<- rnorm(n,mean=mm%*%beta,sd=5) 

y <- latentz 
y[latentz < 1] <- 0 
y[latentz >=1] <- 1 
x <- mm 
values.start <- rep(1,5) 

Ahora vamos a hacer el ajuste. Lo principal es especificar vecpar=TRUE y utilizar parnames dejar mle2 saben los nombres de los elementos en el vector de parámetros ...

library("bbmle") 
names(values.start) <- parnames(l.lik.probit) <- paste0("b",0:4) 
m1 <- mle2(l.lik.probit, start=values.start, 
      vecpar=TRUE, 
      method="BFGS",optimizer="optim", 
      data=list(dv=y,ivs=x)) 

Como se ha señalado anteriormente para este ejemplo en particular que acaba de re-implementado el probit regresión (aunque entiendo que ahora quiere extender este para permitir la heterocedasticidad de alguna manera ...)

dat2 <- data.frame(dat,y) 
m2 <- glm(y~x1+x2+x3+x4,family=binomial(link="probit"), 
    data=dat2) 

Como nota final, yo diría que usted debe comprobar el argumento parameters, que le permite especificar un modelo sublineal para cualquiera de los parámetros, y la interfaz formula:

m3 <- mle2(y~dbinom(prob=pnorm(eta),size=1), 
      parameters=list(eta~x1+x2+x3+x4), 
      start=list(eta=0), 
      data=dat2) 

PS confint(foo2) parece funcionar bien (IC dando perfil a lo solicitado) con esta configuración.

ae <- function(x,y) all.equal(unname(coef(x)),unname(coef(y)),tol=5e-5) 
ae(m1,m2) && ae(m2,m3) 
Cuestiones relacionadas