Estimación de modelos de regresión logística multinivel


9

El siguiente modelo logístico multinivel con una variable explicativa en el nivel 1 (nivel individual) y una variable explicativa en el nivel 2 (nivel grupal):

π 0 j = γ 00 + γ 01 z j + u 0 j( 2 ) π 1 j = γ 10 + γ 11 z j + u 1 j( 3 )

logit(pij)=π0j+π1jxij(1)
π0j=γ00+γ01zj+u0j(2)
π1j=γ10+γ11zj+u1j(3)

donde, se supone que los residuos a nivel de grupo y u 1 j tienen una distribución normal multivariante con expectativa cero. La varianza de los errores residuales u 0 j se especifica como σ 2 0 , y la varianza de los errores residuales u 1 j se especifica como σ 2 1 .u0ju1ju0jσ02u1jσ12

Quiero estimar el parámetro del modelo y me gusta usar el Rcomando glmmPQL.

Sustituyendo la ecuación (2) y (3) en la ecuación (1) se obtiene,

logit(pij)=γ00+γ10xij+γ01zj+γ11xijzj+u0j+u1jxij(4)

Hay 30 grupos y 5 individual en cada grupo.(j=1,...,30)

Código R:

   #Simulating data from multilevel logistic distribution 
   library(mvtnorm)
   set.seed(1234)

   J <- 30             ## number of groups
   n_j <- rep(5,J)     ## number of individuals in jth group
   N <- sum(n_j)

   g_00 <- -1
   g_01 <- 0.3
   g_10 <- 0.3
   g_11 <- 0.3

   s2_0 <- 0.13  ##variance corresponding to specific ICC
   s2_1 <- 1     ##variance standardized to 1
   s01  <- 0     ##covariance assumed zero

   z <- rnorm(J)
   x <- rnorm(N)

   #Generate (u_0j,u_1j) from a bivariate normal .
   mu <- c(0,0)
  sig <- matrix(c(s2_0,s01,s01,s2_1),ncol=2)
  u <- rmvnorm(J,mean=mu,sigma=sig,method="chol")

  pi_0 <- g_00 +g_01*z + as.vector(u[,1])
  pi_1 <- g_10 + g_11*z + as.vector(u[,2])
  eta <- rep(pi_0,n_j)+rep(pi_1,n_j)*x
  p <- exp(eta)/(1+exp(eta))

  y <- rbinom(N,1,p)

Ahora la estimación del parámetro.

  #### estimating parameters 
  library(MASS)
  library(nlme)

  sim_data_mat <- matrix(c(y,x,rep(z,n_j),rep(1:30,n_j)),ncol=4)
  sim_data <- data.frame(sim_data_mat)
  colnames(sim_data) <- c("Y","X","Z","cluster")
  summary(glmmPQL(Y~X*Z,random=~1|cluster,family=binomial,data=sim_data,,niter=200))

SALIDA

      iteration 1
      Linear mixed-effects model fit by maximum likelihood
      Data: sim_data 

      Random effects:
      Formula: ~1 | cluster
              (Intercept)  Residual
      StdDev: 0.0001541031 0.9982503

      Variance function:
      Structure: fixed weights
      Formula: ~invwt 
      Fixed effects: Y ~ X * Z 
                      Value Std.Error  DF   t-value p-value
      (Intercept) -0.8968692 0.2018882 118 -4.442404  0.0000
      X            0.5803201 0.2216070 118  2.618691  0.0100
      Z            0.2535626 0.2258860  28  1.122525  0.2712
      X:Z          0.3375088 0.2691334 118  1.254057  0.2123
      Correlation: 
           (Intr) X      Z     
      X   -0.072              
      Z    0.315  0.157       
      X:Z  0.095  0.489  0.269

      Number of Observations: 150
      Number of Groups: 30 
  • 1200glmmPQLniter=200

  • (Z)(X:Z)(Z)(X:Z)

  • Además, ¿cómo se DFcalculan los grados de libertad ?

  • No coincide con el sesgo relativo de las diversas estimaciones de la tabla . Traté de calcular el sesgo relativo como:

     #Estimated Fixed Effect parameters :
    
     hat_g_00 <- -0.8968692 #overall intercept
     hat_g_10 <- 0.5803201  # X
     hat_g_01 <-0.2535626   # Z
     hat_g_11 <-0.3375088   #X*Z
    
    fixed <-c(g_00,g_10,g_01,g_11)
    hat_fixed <-c(hat_g_00,hat_g_10,hat_g_01,hat_g_11)
    
    
    #Estimated Random Effect parameters :
    
    hat_s_0 <-0.0001541031  ##Estimated Standard deviation of random intercept 
    hat_s_1 <-  0.9982503 
    
    std  <- c(sqrt(0.13),1) 
    hat_std  <- c(0.0001541031,0.9982503) 
    
    ##Relative bias of Fixed Effect :
    rel_bias_fixed <- ((hat_fixed-fixed)/fixed)*100
    [1] -10.31308  93.44003 -15.47913  12.50293
    
    ##Relative bias of Random Effect :
    rel_bias_Random <- ((hat_std-std)/std)*100
    [1] -99.95726  -0.17497
  • ¿Por qué el sesgo relativo no coincide con la tabla?

Respuestas:


7

Quizás haya demasiadas preguntas aquí. Algunos comentarios:

  • puede considerar usarlo glmerdesde el lme4paquete ( glmer(Y~X*Z+(1|cluster),family=binomial,data=sim_data)); utiliza la aproximación de Laplace o la cuadratura de Gauss-Hermite, que generalmente son más precisas que PQL (aunque las respuestas son muy similares en este caso).
  • El niterargumento especifica el número máximo de iteraciones; solo una iteración era realmente necesaria
  • No estoy seguro de cuál es su pregunta sobre el término de interacción. Si debe eliminar o no los términos de interacción no significativos es una especie de lata de gusanos, y depende tanto de su filosofía estadística como de los objetivos de su análisis (por ejemplo, vea esta pregunta )
  • los grados de libertad del denominador se calculan de acuerdo con una simple heurística 'interna-externa', una regla simple 'interna-externa' descrita en la página 91 de Pinheiro y Bates (2000), que está disponible en Google Books ... generalmente una aproximación razonable pero el cálculo de grados de libertad es complejo, especialmente para GLMM
  • si está intentando replicar "Un estudio de simulación del tamaño de la muestra para modelos de regresión logística multinivel" por Moineddin et al. (DOI: 10.1186 / 1471-2288-7-34), necesita ejecutar una gran cantidad de simulaciones y calcular promedios, no solo comparar una sola ejecución. Además, probablemente debería intentar acercarse a sus métodos (volviendo a mi primer punto, afirman que usan SAS PROC NLMIXED con cuadratura adaptativa de Gauss-Hermite, por lo que sería mejor, por ejemplo glmer(...,nAGQ=10), aún no lo hará). coincide exactamente, pero probablemente estará más cerca que glmmPQL.

I need to run a large number of simulations and compute averages300E[θ^]=θ

glmer()σ02σ12summary(glmer(Y~X*Z+(1|cluster),family=binomial,data=sim_data,nAGQ=10))

2
está asumiendo que las aproximaciones que usamos para la estimación GLMM son imparciales. Eso probablemente no sea cierto; La mayoría de las mejores aproximaciones (no PQL) son asintóticamente insesgadas, pero todavía están sesgadas para muestras de tamaño finito.
Ben Bolker

1
@ABC: Sí, ambos enlaces contienen ejemplos de cómo replicar un fragmento de código varias veces. Debería ser fácil incluir su código en una función y ejecutar el comando replicar, por ejemplo.
Ryan Simmons

1
@ABC: En cuanto a la otra parte de tu pregunta, estoy un poco confundido sobre lo que te está molestando. Estás generando números aleatorios; sin redondear o un número infinitamente grande de repeticiones, nunca obtendrá exactamente 0 con el sesgo (o, de hecho, una estimación exacta precisa de CUALQUIER parámetro). Sin embargo, con un número suficientemente grande de repeticiones (por ejemplo, 1000), es probable que obtenga un sesgo muy pequeño (cercano a 0). El documento que cita que está intentando replicar lo demuestra.
Ryan Simmons
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.