Primero simulemos algunos datos para una regresión logística con partes fijas y aleatorias:
set.seed(1)
n <- 100
x <- runif(n)
z <- sample(c(0,1), n, replace=TRUE)
b <- rnorm(2)
beta <- c(0.4, 0.8)
X <- model.matrix(~x)
Z <- cbind(z, 1-z)
eta <- X%*%beta + Z%*%b
pr <- 1/(1+exp(-eta))
y <- rbinom(n, 1, pr)
Si solo quisiéramos ajustar una regresión logística sin partes aleatorias, podríamos usar la glm
función:
glm(y~x, family="binomial")
glm(y~x, family="binomial")$coefficients
# (Intercept) x
# -0.2992785 2.1429825
O construir nuestra propia función del log-verosimilitud
donde y
y use optim()
para estimar los parámetros que lo maximizan, como en el siguiente código de ejemplo:
ll.no.random <- function(theta,X,y){
beta <- theta[1:ncol(X)]
eta <- X%*%beta
p <- 1/(1+exp(-eta))
ll <- sum( y*log(p) + (1-y)*log(1-p) )
-ll
}
optim(c(0,1), ll.no.random, X=X, y=y)
optim(c(0,1), ll.no.random, X=X, y=y)$par
# -0.2992456 2.1427484
que, por supuesto, proporciona las mismas estimaciones y maximiza la probabilidad logarítmica para el mismo valor. Para efectos mixtos, nos gustaría algo como
library(lme4)
glmer(y~x + (1|z), family="binomial")
Pero, ¿cómo podemos hacer lo mismo con nuestra propia función? Dado que la probabilidad es
y la integral no tiene una expresión de forma cerrada, necesitamos usar la integración numérica como la Cuadratura Gaussiana. Podemos usar el paquete statmod
para obtener algunas cuadraturas, digamos 10
library(statmod)
gq <- gauss.quad(10)
w <- gq$weights
g <- gq$nodes
ACTUALIZACIÓN: Al usar estas ubicaciones en cuadratura y los pesos para ( aquí), podemos aproximar la integral sobre mediante una suma de los términos con sustituido por y todo término multiplicado por los pesos respectivos . Por lo tanto, nuestra función de probabilidad debería ser ahora
Además, debemos tener en cuenta la varianza de la parte aleatoria, leí que esto se puede lograr reemplazando en nuestra función con where , por lo que en la función de probabilidad anterior reemplazamos 's con ' s y no 's.
Un problema computacional que no entiendo es cómo sustituir los términos, ya que los vectores no tendrán la misma longitud. Pero probablemente no entiendo eso, porque me falta algo crucial aquí o no entendí mal cómo funciona este método.
Respuestas:
No vi cómo "los vectores no serán de la misma longitud", aclare su pregunta.
En primer lugar, para la integral con una dimensión inferior a 4, los métodos numéricos directos como la cuadratura son más eficientes que MCMC. Estudié estas preguntas por un tiempo y me complacería discutir este problema con usted.
Para la regresión logística de efectos mixtos, el único
R
código explícito que he encontrado es del libro del Prof. Demidenko, Modelos mixtos: teoría y aplicaciones , puede descargar el código a través de la columna "SOFTWARE Y DATOS" en la página web. EllogMLEgh()
se puede encontrar en\mixed_models_data.zip\MixedModels\Chapter07
. No usó elstatmod
paquete para obtener las cuadraturas, pero escribió su propia funcióngauher()
. Hay algunos errores menores en el código y los he discutido con el autor, pero todavía es muy útil comenzar desde su código y libro. Puedo proporcionar la versión corregida si es necesario.Otro problema es que, si desea obtener estimaciones precisas,
optim()
no es suficiente, es posible que deba usar métodos como la puntuación de Fisher, como englm()
.fuente
b
con los 10 nodos, ¿cómo podremos multiplicar las matricesZ
yg
? ¿O lo tengo completamente mal?Z = rep(1,n)
Z=rep(1,n)
lo siguiente, ¿obtendría una intercepción aleatoria para cada fila, lo que significa que cada individuo es un grupo? En mi ejemplo, tengo dos grupos, por lo tanto tenemos y para dar las que necesitamos. ¿No?Z%*%b
Z
se usa para separar la intersección aleatoria de cada grupo, no la matriz de diseño para el efecto aleatorio. Entonces tiene razón, pero debe evaluar la integral y utilizar la cuadratura por separado para cada grupo. Ya no necesitaZ
más, solo evalúe la integral para cada grupo y luego sumelos. La matriz de diseño para la intersección aleatoria es solo el vector de 1s.