modelo logit mixto multinomial mlogit r-package
-
21-12-2019 - |
Pregunta
descubrí el mlogit
-paquete para modelos logit multinomiales en busca de estimar un modelo logit mixto multinomial.Después de leer la excelente viñeta descubrí que no podía aplicar mis datos en ninguno de los ejemplos descritos.
Ahora escribo con la esperanza de recibir ayuda con mi problema y creé un ejemplo mínimo para ilustrar mi situación.
El problema es el siguiente:Hay palabras con la consonante 'Q' en alguna parte.Ahora se realizó un experimento con personas a las que se les pidió que escucharan estas palabras y dijeran si escuchaban una Q, una U o alguna OTRA consonante.Esto tiene que modelarse en dependencia de algunos factores como la posición de la sílaba o la palabra real/no real.
En el ejemplo mínimo creé 4 personas y sus respuestas con la posición de la sílaba.
library(mlogit)
library(nnet)
set.seed(1234)
data <- data.frame(personID = as.factor(sample(1:4, 40, replace=TRUE)),
decision = as.factor(sample(c("Q","U", "other"), 40, replace=TRUE)),
syllable = as.factor(sample(1:4, 40, replace=TRUE)))
summary(data)
personID decision syllable
1:11 other:10 1:18
2:10 Q :18 2: 9
3:10 U :12 3: 5
4: 9 4: 8
Por lo que yo sé nnet
's multinom
La función no cubre modelos mixtos.
modNnet1 <- multinom(decision ~ syllable, data=data)
Primero usé el mlogit.data
-función para remodelar el archivo.Después de discutirlo con un colega, llegamos a la conclusión de que no existe una variable específica alternativa.
dataMod <- mlogit.data(data, shape="wide", choice="decision", id.var="personID")
mod1 <- mlogit(formula = decision ~ 0|syllable,
data = dataMod,
reflevel="Q", rpar=c(personID="n"), panel=TRUE)
Error in names(sup.coef) <- names.sup.coef :
'names' attribute [1] must be the same length as the vector [0]
mod2 <- mlogit(formula = decision ~ personID|syllable,
data = dataMod,
reflevel="Q", rpar=c(personID="n"), panel=TRUE)
Error in solve.default(H, g[!fixed]) :
Lapack routine dgesv: system is exactly singular: U[3,3] = 0
No, no sé qué hacer, así que pido ayuda aquí.Pero creo que este tipo de problema se puede resolver con mlogit
y todavía no lo veo ;)
Solución
El rpar
El argumento acepta sólo variables alternativas específicas.No es necesario especificar la identificación específica de la persona en la fórmula del modelo; esto se maneja incluyendo id.var = something
en el mlogit.data
dominio.Por ejemplo, si tuviera una covariable específica alternativa acov
, podría permitir pendientes aleatorias para acov
a través de un panel:
N = 200
dat <- data.frame(personID = as.factor(sample(1:4, N, replace=TRUE)),
decision = as.factor(sample(c("Q","U", "other"), N, replace=TRUE)),
syllable = as.factor(sample(1:4, N, replace=TRUE)),
acov.Q = rnorm(N), acov.U = rnorm(N), acov.other = rnorm(N))
dataMod <- mlogit.data(dat, shape="wide", choice="decision", id.var="personID", varying = 4:6)
mlogit(formula = decision ~ acov|syllable, rpar = c(acov = "n"), panel = T, data = dataMod)
Parece que está intentando ajustar un modelo con una intersección aleatoria específica de cada persona para cada alternativa (no pendientes aleatorias).Desafortunadamente, no creo que puedas hacerlo en mlogit
(pero mira esta publicación).
Una opción que funcionaría para ajustar interceptos aleatorios en ausencia de covariables alternativas específicas es MCMCglmm
.
library(MCMCglmm)
priors = list(R = list(fix = 1, V = 0.5 * diag(2), n = 2),
G = list(G1 = list(V = diag(2), n = 2)))
m <- MCMCglmm(decision ~ -1 + trait + syllable,
random = ~ idh(trait):personID,
rcov = ~ us(trait):units,
prior = priors,
nitt = 30000, thin = 20, burnin = 10000,
family = "categorical",
data = dat)
Las cuestiones relevantes son la selección previa, la convergencia de las cadenas de Markov, etc.El blog del laboratorio de Florian Jaeger tiene un breve tutorial sobre modelos multinomiales vía MCMCglmm
que puede resultarle útil, además de la MCMCglmm
documentación.