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.