Оценка многоуровневых моделей логистической регрессии

9

Следующая многоуровневая логистическая модель с одной пояснительной переменной на уровне 1 (индивидуальный уровень) и одной пояснительной переменной на уровне 2 (групповой уровень):

π 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)

где предполагается, что остатки и u 1 j на уровне группы имеют многомерное нормальное распределение с нулевым ожиданием. Дисперсия остаточных ошибок u 0 j указана как σ 2 0 , а дисперсия остаточных ошибок u 1 j определена как σ 2 1 .u0ju1ju0jσ02u1jσ12

Я хочу оценить параметр модели, и мне нравится использовать Rкоманду glmmPQL.

Подставляя уравнения (2) и (3) в уравнение (1), получаем,

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

Есть 30 групп и 5 человек в каждой группе.(j=1,...,30)

Код 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)

Теперь оценка параметров.

  #### 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))

ВЫВОД :

      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)

  • Также Как DFрассчитываются степени свободы ?

  • Это не соответствует относительному смещению различных оценок таблицы . Я попытался рассчитать относительное смещение как:

     #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
  • Почему относительное смещение не совпадает с таблицей?
азбука
источник

Ответы:

7

Здесь, возможно, слишком много вопросов. Некоторые комментарии:

  • вы можете рассмотреть возможность использования glmerиз lme4пакета ( glmer(Y~X*Z+(1|cluster),family=binomial,data=sim_data)); он использует приближение Лапласа или квадратуру Гаусса-Эрмита, которые, как правило, более точны, чем PQL (хотя ответы в этом случае очень похожи).
  • niterАргумент задает максимальное число итераций; фактически была необходима только одна итерация
  • Я не уверен, что ваш вопрос о термине взаимодействия. Должны ли вы отбрасывать незначительные термины взаимодействия или нет, это червяк, и это зависит как от вашей статистической философии, так и от целей вашего анализа (например, см. Этот вопрос )
  • степени свободы знаменателя рассчитываются в соответствии с простым эвристическим «внутренним-внешним» простым правилом «внутреннего-внешнего», описанным на стр. 91 «Пинейро и Бейтс» (2000), которое доступно в Google Книгах ... оно обычно разумное приближение, но вычисление степеней свободы является сложным, особенно для GLMM
  • если вы пытаетесь воспроизвести «Имитационное исследование размера выборки для многоуровневых моделей логистической регрессии», выполненное Moineddin et al. (DOI: 10.1186 / 1471-2288-7-34), вам нужно запустить большое количество симуляций и вычислить средние значения, а не просто сравнить один прогон. Кроме того, вам, вероятно, следует попытаться приблизиться к их методам (возвращаясь к моему первому пункту, они утверждают, что они используют SAS PROC NLMIXED с адаптивной квадратурой Гаусса-Эрмита, так что вам будет лучше, например, с glmer(...,nAGQ=10); совпадать точно, но это, вероятно, будет ближе, чем 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
Вы предполагаете, что аппроксимации, которые мы используем для оценки GLMM, несмещены. Это, вероятно, не правда; большинство из лучших приближений (не PQL) асимптотически несмещены, но они все еще смещены для выборок конечного размера.
Бен Болкер
1
@ABC: Да, обе эти ссылки содержат примеры того, как повторять фрагмент кода несколько раз. Например, должно быть легко обернуть ваш код в функцию и выполнить команду replicate.
Райан Симмонс
1
@ABC: Что касается другой части вашего вопроса, я немного смущен тем, что вас беспокоит. Вы генерируете случайные числа; без округления или бесконечно большого количества репликаций вы никогда не получите точно 0 со смещением (или, действительно, точно точную оценку ЛЮБОГО параметра). Однако при достаточно большом количестве репликаций (скажем, 1000) вы, вероятно, получите очень маленький (близкий к 0) уклон. Документ, который вы цитируете, что вы пытаетесь повторить, демонстрирует это.
Райан Симмонс