Modelos Multinível

Como vimos na última aula dados em painel ou séries temporais de cortes transversais (time series, cross section) permitem, por meio do que se chama efeitos fixos ou por meio de diferenças em diferenças, estabelecer relações de causalidade. Neste caso a estrutura dos dados nos ajuda a eliminar o viés de seleção de atributos que não variam no nível agregado. Nos modelos multinível a estrutura dos dados nos permite combinar as informações nos níveis individual e de grupo, isto é, entender o quanto e como a variação na relação entre variáveis se deve a características individuais e/ou a efeitos ‘contextuais’. As informações nos dois níveis se combinam permitindo maior eficiência ao estimar coeficientes para grupos específicos ou identificar efeitos no nível agregado.

Além de dados longitudinais, que agregam observações individuais no tempo, dados com estrutura multinível envolvem dados aninhados, sendo o exemplo mais usados o de alunos agregados em salas de aula que, por sua vez, também podem estar reunidas em diferentes escolas. Esse tipo de dado tem um caráter hierárquico. Os dados também podem ser não aninhados, como ocorre em modelos que inferem a posição ideológica de deputados por meio de seu padrão de votação nominal e onde temos votos agregados no nível dos deputados e do projeto de lei.

Podemos pensar nos modelos multinível como uma regressão onde incluímos indicadores para cada grupo. Foi o que fizemos na aula passada para estimar os modelos de efeitos fixos. Ao incluir estes indicadores temos um intercepto para cada grupo e, no caso do que chamamos de efeitos fixos, tratamos esses indicadores como constantes, características permanentes e imutáveisde cada indivíduo/unidade. Podemos também tratar esses indicadores como variáveis aleatórias atribuindo uma distribuição a eles, o que se chama de efeitos aleatórios. Se o centro da distribuição for zero os coeficientes de cada grupo seriam variações com relação ao intercepto. Se tivermos outros preditores além do intercepto podemos, também, permitir que as inclinações variem. Neste último caso teríamos modelos com intercepto e inclinação variáveis.

Uma forma de representar modelos multinível, onde o intercepto e a inclinação variam é

\[ Y_{ij} \sim N(\alpha_{j[i]} + \beta_{j[i]}, \sigma_{y})\]

Onde cada grupo \(j\) ao qual pertence o indivíduo \(i\) tem seu próprio intercepto (\(\alpha_{j[i]}\)) e inclinação (\(\beta_{j[i]}\)). Esses parâmetros, por sua vez têm, também, sua própria distribuição

\[ \left( \begin{array}{c} \alpha_j \\ \beta_j \end{array} \right) = N \left(\left(\begin{array}{c} \mu_{\alpha} \\ \mu_{\beta} \end{array} \right), \left(\begin{array}{c} \sigma_{\alpha}^2 & \rho\sigma_{\alpha}\sigma_{\beta} \\ \rho\sigma_{\alpha}\sigma_{\beta} & \sigma_{\beta} \end{array} \right) \right) \]

Embora esta notação torne explícito que em um modelo multinível tratamos os coeficientes de uma regressão como variáveis aleatórias atribuindo uma distribuição para elas, vou recorrer a uma outra notação para tornar o conceito mais intuitivo1. Usando um modelo de regressão clássica teríamos

\[ y_i = X_i \beta + \epsilon_i^{all}, \text{ } \epsilon_i^{all} \sim N(0, \Sigma)\]

Onde \(X\) é uma matriz com preditores no nível individual e de grupo (mais a constante) e \(\epsilon_i^{all}\) inclui os erros nos diferentes níveis. \(\Sigma\) é a matriz de covariância de \(\epsilon_i^{all}\) onde os efeitos aleatórios aparecem como correlações entre os erros. Um exemplo ajudará a deixar esta ideia mais concreta.

Seguindo Fox (2017), vamos usar como exemplo o survey “High School and Beyond” feito em 1982 com 7185 alunos norte americanos distribuídos em 160 escolas das quais 70 eram católicas e 90 eram públicas. Nosso interesse é na relação entre desempenho escolar (mensurado pelo desempenho em um teste de matemática) e o status socioeconômico da família do aluno (SES). No nosso modelo, o desempenho do aluno é afetado por um “efeito escola” além de caracetrísticas individuais. Esse efeito da escola também impacta a relação entre o desempenho e o SES. Seguindo a notação acima teríamos

\[ \text{matteste}_{ij} = \alpha_{j[i]} + \beta_{j[i]}cses_{ij} + \epsilon_{ij}\]

Onde \(cses - ses_{ij} - \overline{ses_i}\) ou seja o SES centralizado por escola. No nível agregado modelamos os coeficientes conforme características das escolas: se são católicas ou públicas e o nível médio do SES

\[ \begin{align} \alpha_{j[i]} &= \gamma_0^{\alpha} + \gamma_1^{\alpha}*\overline{ses_i} + \gamma_2^{\alpha}*setor_i + \omega_{\alpha} \\ \beta_{j[i]} &= \gamma_0^{\beta} + \gamma_1^{\beta}*\overline{ses_i} + \gamma_2^{\beta}*\overline{ses_i}^2 + \gamma_3^{\beta}*setor_i + \omega_{\beta} \end{align} \]

Onde \(sector\) é uma dummy com 1 para escolas católicas e 0 para públicas. Substituindo a equação do nível agregado na do nível individual temos:

\[ \begin{align} \text{matteste}_{ij} &= [\gamma_0^{\alpha} + \gamma_1^{\alpha}*\overline{ses_i} + \gamma_2^{\alpha}*setor_i + \omega_{\alpha}] + [\gamma_0^{\beta} + \gamma_1^{\beta}*\overline{ses_i} + \gamma_2^{\beta}*\overline{ses_i}^2 + \gamma_3^{\beta}*setor_i + \omega_{\beta}]*cses_{ij} + \epsilon_{ij} \\ &= \gamma_0^{\alpha} + \gamma_1^{\alpha}*\overline{ses_i} + \gamma_2^{\alpha}*setor_i + \gamma_0^{\beta}*cses_{ij} + \gamma_1^{\beta}*\overline{ses_i}*cses_{ij} + \gamma_2^{\beta}*\overline{ses_i}^2*cses_{ij} + \gamma_3^{\beta}*setor_i*cses_{ij} + \omega_{\alpha} + \omega_{\beta}*cses_{ij} + \epsilon_{ij} \end{align} (1)\]

Este modelo, temabém conhecido como modelo linear de efeitos mistos (\(LMM\) em inglês) embora complicado, explicta que os coeficientes das variáveis contextuais (do nível de grupo) aparecem como coeficientes de interações de níveis cruzados na equação final (por exemplo \(\gamma_1^{\beta}*\overline{ses_i}*cses_{ij}\)). Esses são os chamado efeitos fixos de um modelo misto. Os efeitos aletórios são os erros na última equação (\(\omega_{\alpha}, \omega_{\beta}\)), ou seja, eles dão os desvios em torno dos efeitos fixos.

Escrevendo \(\delta_{1j} = \omega_{\alpha}\) e \(\delta_{2j} = \omega_{\beta}\) definimos

\[ \delta_{kj} \sim N(0, \psi_k^2), C(\delta_{kj}, \delta_{k'j}) = \psi_{kk'}\]

\(\delta_{kj}\) e \(\delta_{kj}\) são independentes para \(j \neq j'\)

\[ \epsilon{ij} \sim N(0, \sigma_{\epsilon}^2\lambda_{iij}), C(\epsilon_{ij}, \epsilon_{i'j}) = \sigma_{\epsilon}^2\lambda_{ii'j}\] \(\epsilon_{ij}\) e \(\epsilon_{i'j'}\) são independentes para \(j \neq j'\) e \(\epsilon_{ij}\) é independente de \(\delta_{kj}\) para todo \(i\) e \(j\).

Deste modo teríamos

\[ \text{Var(matteste}_{ij}) = \sigma^2 + \psi_1^2 + cses_{ij}^2 \psi_2^2 + 2cses_{ij} \psi_{12} \\ \text{Cov(matteste}_{ij}, \text{matteste}_{i'j}) = \psi_1^2 + cses_{ij}cses_{i'j} \psi_2^2 + (cses_{ij} + cses_{i'j}) \psi_{12} \]

Seguindo Fox(2019, cap. 23) vou estimar o modelo multinível do desempenho em matemática com relação ao SES, SES médio da escola e setor da escola usando o R. Vamos usar as funções lme() do pacote nlme e lmer() do pacote lme4. Os dados que vamos usar estão disponíveis no pacote nlme.

library(car)
library(nlme)
## 
## Attaching package: 'nlme'
## The following object is masked from 'package:lme4':
## 
##     lmList
## The following object is masked from 'package:dplyr':
## 
##     collapse
# os dados estão organizados em um banco com informações de alunos e outrocom informações das escolas
brief(MathAchieve)
## 7185 x 6 nfnGroupedData (7180 rows and 1 columns omitted)
##      School Minority    Sex . . . MathAch MEANSES
##         [c]      [f]    [f]           [n]     [n]
## 1      1224      No  Female         5.876  -0.428
## 2      1224      No  Female        19.708  -0.428
## 3      1224      No  Male          20.349  -0.428
## . . .                                                 
## 7184   9586      No  Female        16.241   0.627
## 7185   9586      No  Female        22.733   0.627
brief(MathAchSchool)
## 160 x 7 data.frame (155 rows omitted)
##      School Size   Sector PRACAD DISCLIM HIMINTY MEANSES
##         [f]  [n]      [f]    [n]     [n]     [f]     [n]
## 1224   1224  842 Public     0.35   1.597     0    -0.428
## 1288   1288 1855 Public     0.27   0.174     0     0.128
## 1296   1296 1719 Public     0.32  -0.137     1    -0.420
## . . .                                                        
## 9550   9550 1532 Public     0.45   0.791     0     0.059
## 9586   9586  262 Catholic   1.00  -2.416     0     0.627
# vamos juntar os dados dos alunos  e das escolas.
# primeiro calculando a média do SES por escola na base de alunos e juntando com a base de escolas

MathAchieve %>% group_by(School) %>% summarize(mean.ses = mean(SES)) -> temp
temp <- merge(MathAchSchool, temp, by = "School")

# Agora juntamos as variáveis do nívelda escola na base dos alunos

HSB <- merge(temp[,c("School", "Sector", "mean.ses")],
             MathAchieve[,c("School","SES","MathAch")], by = "School")
names(HSB) <- tolower(names(HSB))

# Por fim centralizamos a variável SES com relação à média de cada escola

HSB$cses <- with(HSB, ses - mean.ses)
brief(HSB)
## 7185 x 6 data.frame (7180 rows omitted)
##      school   sector   mean.ses    ses mathach        cses
##         [f]      [f]        [n]    [n]     [n]         [n]
## 1      1224 Public   -0.4343830 -1.528   5.876 -1.09361702
## 2      1224 Public   -0.4343830 -0.588  19.708 -0.15361702
## 3      1224 Public   -0.4343830 -0.528  20.349 -0.09361702
## . . .                                                          
## 7184   9586 Catholic  0.6211525 -0.008  16.241 -0.62915254
## 7185   9586 Catholic  0.6211525  0.792  22.733  0.17084746
# Vamos agora examinar nossos dados procurando entender
# a) a relação entre desempenhoescolar e SES
# b) se essa relação varia por setor (católica vs pública)
# c) se essa relação varia aleatoriamente entre escolas de um mesmo setor

# Vamos primeiro olhar para a relação em uma amostra de 20 escolas de cada tipo

set.seed(12345)
cat <- with(HSB,
            sample(unique(school[sector == "Catholic"]), 20))
cat.20 <- HSB[is.element(HSB$school, cat),]

pub <- with(HSB,
            sample(unique(school[sector == "Public"]), 20))
pub.20 <- HSB[is.element(HSB$school, pub),]

# vamos usar a função xyplot() do pacote latice para visualizar a relação
# entre o desempenho em matemática e o SES centralizado nas nossas amostras de escolas

xyplot(mathach ~ cses | school, data = cat.20, main = "Católicas",
       panel = function(x,y){
         panel.points(x,y)
         panel.lmline(x,y, ly=2, lwd =2, col = "darkgray")
         panel.loess(x,y, span = 1, lwd = 2)
       })

xyplot(mathach ~ cses | school, data = pub.20, main = "Públicas",
       panel = function(x,y){
         panel.points(x,y)
         panel.lmline(x,y, ly=2, lwd =2, col = "darkgray")
         panel.loess(x,y, span = 1, lwd = 2)
       })

# O próximo passo é ajustar uma regressão de mathach em cses para cada escola em cada setor.
# A função lmList() faz isto juntando os resultadosde cada regressão em uma lista

cat.list <- lmList(mathach ~ cses | school, subset = sector == "Catholic", data = HSB)
pub.list <- lmList(mathach ~ cses | school, subset = sector == "Public", data = HSB)

brief(pub.list[[1]])
##            (Intercept) cses
## Estimate          9.72 2.51
## Std. Error        1.10 1.77
## 
##  Residual SD = 7.51 on 45 df, R-squared = 0.043
cat.coef <- coef(cat.list)
head(cat.coef)
##      (Intercept)       cses
## 1308    16.25550  0.1260242
## 1317    13.17769  1.2739128
## 1433    19.71914  1.8542944
## 1436    18.11161  1.6005617
## 1462    10.49556 -0.8288086
## 1477    14.22847  1.2306059
pub.coef <- coef(pub.list)

# Podemos examinar a diferença na distribuição dos interceptos e das inclinações usando boxplots.

old.par <- par()
par(mfrow = c(1,2))
boxplot(cat.coef[,1], pub.coef[,1], main = "Intercepto", names = c("Católicas","Públicas"))
boxplot(cat.coef[,2], pub.coef[,2], main = "Inclinação", names = c("Católicas","Públicas"))

par <- old.par

# vamos agora examinar os efeitos no nível das escolas, istoé, vamos examinar a relação entre intercepto, inclinação e
# a média do SES nas escolas. Para isso vamos juntar a variável "mean.ses" na base com os coeficientes.

cat.coef <- merge(cat.coef, temp[,c("School", "mean.ses")],
                  by.x = "row.names", by.y = "School")
pub.coef <- merge(pub.coef, temp[,c("School", "mean.ses")],
                  by.x = "row.names", by.y = "School")
colnames(pub.coef)[c(1,2)] <- colnames(cat.coef)[c(1,2)] <- c("school", "intercept")
head(cat.coef)
##   school intercept       cses   mean.ses
## 1   1308  16.25550  0.1260242  0.5280000
## 2   1317  13.17769  1.2739128  0.3453333
## 3   1433  19.71914  1.8542944  0.7120000
## 4   1436  18.11161  1.6005617  0.5629091
## 5   1462  10.49556 -0.8288086 -0.6694035
## 6   1477  14.22847  1.2306059  0.1595806
scatterplot(intercept ~ mean.ses, data =cat.coef, boxplots = FALSE, main = "Católicas")

scatterplot(cses ~ mean.ses, data =cat.coef, boxplots = FALSE, main = "Católicas")

scatterplot(intercept ~ mean.ses, data =pub.coef, boxplots = FALSE, main = "Públicas")

scatterplot(cses ~ mean.ses, data =pub.coef, boxplots = FALSE, main = "Públicas")

# O exame dos dados mostram que de fato parece haver uma relação linear entre mathach e cses nas escolas
# e que o intercepto e a inclinação desta relaçõ varia com as escolas. Também vemos que há diferenças 
# no intercepto e inclinação nos diferentes tipos de escolas (católicas e públicas). Isso justifica a
# a especificação da equação (1)

# Primeiro vamos reordenar o fator"sector" atribuindo o valor zero para
# escolas públicas e um para escolas católicas

HSB$sector <- factor(HSB$sector, levels = c("Public","Catholic"))

#Agora ajustamos o modelo na equação (1)

hsb.lme.1 <- lme(mathach ~ mean.ses*cses + sector*cses, random = ~cses | school, data = HSB)
S(hsb.lme.1)
## Linear mixed model fit by REML,  Data: HSB
## 
## Fixed Effects:
##  Formula: mathach ~ mean.ses * cses + sector * cses 
## 
##                     Estimate Std.Error   df t value Pr(>|t|)    
## (Intercept)          12.1279    0.1993 7022  60.854  < 2e-16 ***
## mean.ses              5.3329    0.3692  157  14.445  < 2e-16 ***
## cses                  2.9450    0.1556 7022  18.928  < 2e-16 ***
## sectorCatholic        1.2266    0.3063  157   4.005 9.55e-05 ***
## mean.ses:cses         1.0392    0.2989 7022   3.477  0.00051 ***
## cses:sectorCatholic  -1.6427    0.2398 7022  -6.851 7.94e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Random effects:
##  Formula: ~cses | school
##  Structure: General positive-definite, Log-Cholesky parametrization
##             StdDev    Corr  
## (Intercept) 1.5426481 (Intr)
## cses        0.3178419 0.391 
## Residual    6.0598009       
## 
## 
## Number of Observations: 7185
## Number of Groups: 160 
## 
##    logLik        df       AIC       BIC 
## -23251.83        10  46523.66  46592.45
# Podemos também analisar esses resultados graficamente com o pacote effects

library(effects)
## Use the command
##     lattice::trellis.par.set(effectsTheme())
##   to customize lattice options for effects plots.
## See ?effectsTheme for details.
plot(predictorEffects(hsb.lme.1, ~cses,
                      xlevel=list(mean.ses=round(seq(-1.2,0.8, length=6),1))),
     lines=list(multiline=TRUE, lwd = 4),
     confint=list(style="bands"),
     axes=list(x=list(rug=FALSE)),
     lattice = list(key.args=list(space="right",columns=1)))

# O exame das variâncias e covariâncias nos informam sobre o quanto os efeitos aleatórios
# fazem sentido e quanta informação eles nos dão.
# Comparando um modelo com e outro sem os componentes da variância nos informa se o
# modelo de efeitos aleatórios faz diferença.
# Primeiro vamos comparar um modeo onde só o intercepto varia por grupo e as inclinações não
# isto é, a correlação entre pares no mesmogrupo é a mesma.

hsb.lme.2 <- update(hsb.lme.1, random = ~1 | school)
anova(hsb.lme.1, hsb.lme.2)
##           Model df      AIC      BIC    logLik   Test  L.Ratio p-value
## hsb.lme.1     1 10 46523.66 46592.45 -23251.83                        
## hsb.lme.2     2  8 46520.79 46575.82 -23252.39 1 vs 2 1.124097    0.57
# Podemos também comparar um modelo onde o interceptonão varia (mesmamédia de desempenho em cada setor) 
# mas relação entre desempenho e SES varia por escola.

hsb.lme.3 <- update(hsb.lme.1, random = ~ cses - 1 | school)
anova(hsb.lme.1, hsb.lme.3)
##           Model df      AIC      BIC    logLik   Test  L.Ratio p-value
## hsb.lme.1     1 10 46523.66 46592.45 -23251.83                        
## hsb.lme.3     2  8 46740.23 46795.26 -23362.11 1 vs 2 220.5634  <.0001
# Além dos efeitos fixos, isto é, da relação entre desempenho em matemática e SES para toda a população
# nosso modelo permite ver como éa relação em cada escola. Para isso vamos usar a função lmer() do pacote lme4

hsb.lmer.1 <- lmer(mathach ~ mean.ses*cses + sector*cses + (cses | school), data = HSB)
display(hsb.lmer.1)
## lmer(formula = mathach ~ mean.ses * cses + sector * cses + (cses | 
##     school), data = HSB)
##                     coef.est coef.se
## (Intercept)         12.13     0.20  
## mean.ses             5.33     0.37  
## cses                 2.95     0.16  
## sectorCatholic       1.23     0.31  
## mean.ses:cses        1.04     0.30  
## cses:sectorCatholic -1.64     0.24  
## 
## Error terms:
##  Groups   Name        Std.Dev. Corr 
##  school   (Intercept) 1.54          
##           cses        0.32     0.39 
##  Residual             6.06          
## ---
## number of obs: 7185, groups: school, 160
## AIC = 46523.7, DIC = 46489.2
## deviance = 46496.4
# Para estimar os coeficientes em cada grupo usamos:

coef(hsb.lmer.1)$school[1:5,]
##      (Intercept) mean.ses     cses sectorCatholic mean.ses:cses
## 1224    12.05614 5.332872 2.940096        1.22658      1.039251
## 1288    12.58510 5.332872 2.985510        1.22658      1.039251
## 1296    10.41504 5.332872 2.750412        1.22658      1.039251
## 1308    12.15902 5.332872 2.930121        1.22658      1.039251
## 1317    10.59582 5.332872 2.812846        1.22658      1.039251
##      cses:sectorCatholic
## 1224           -1.642682
## 1288           -1.642682
## 1296           -1.642682
## 1308           -1.642682
## 1317           -1.642682
# Ou paraver apenas os efeitos aleatórios usamos

ranef(hsb.lme.1)[1:5,]
##      (Intercept)         cses
## 1224 -0.07178617 -0.004945505
## 1288  0.45718314  0.040443092
## 1296 -1.71289856 -0.194549974
## 1308  0.03109671 -0.014924010
## 1317 -1.53213431 -0.132125770
# obtendo osdesvios com relação aos efeitos fixos.

Exemplo Logit

[Ver exemplo Gelman e Hill cap.14]


  1. ver Gelman e Hill (2007:262) sobre as diferentes maneiras de escrever o mesmo modelo