Todos os modelos paramétricos que vimos até agora partiam da premissa de que uma observação não trazia nenhuma informação sobre outras observações de nossa amostra. As observações seriam independentes uma das outras. Isso faz todo sentido quando as observações se referiam a medidas feitas sobre um mesmo objeto de forma independente por diferentes investigadores. Quando selecionamos uma amostra da população e tratamos cada observação como uma medida feita de modo independente estamos forçando estas observações a se comportarem como uma mesma observação medida por diversos observadores. Quando falamos em erro queremos dizer exatamente isso: diferenças nas obervações se devem a diferenças na forma de observá-las e não em diferenças inerentes a elas.
Na realidade nossas observações não são de fato independentes. Elas sempre tem alguma relação, direta ou indireta, uma com as outras. Isto quer dizer que quando tratamos as observações como independentes estamos ignorando as razões das relações entre as observaçãoes, estamos perdendo informação. Um tipo comum de relação entre as observações é o pertencimento comum a algum grupo (no espaço, tempo ou apenas conceitual). 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 usado 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 modelar a estrutura de clusters como uma regressão onde incluímos indicadores para cada grupo, captando as similaridades das observações em cada grupo e sua diferença com as que pertencem aos demais grupos. É o que se chama de modelos de efeitos fixos. Ao incluir estes indicadores temos um intercepto para cada grupo e tratamos esses indicadores como constantes, características próprias de cada grupo. No caso de um painel, por exemplo, o grupo é o indivíduo e essas características são permanentes e imutáveis o que possibilita identificar efeitos causais. Mas não estamos levando em conta a interdependência no erro das unidades no mesmo cluster.
Podemos também tratar essas características dos grupos, representadas por indicadores, como variáveis aleatórias atribuindo uma distribuição a eles. A isso chamamos de efeitos aleatórios ou efeitos mistos. Isso sigifica que além da distribuição de \(Y\) assumimos uma distribuição para o coeficiente do grupo, isto é adicionamos mais um erro aleatório ao modelo. Ao estipular uma distribuição do erro por cluster nosso modelo incorpora a informação de que nossas observações são oriundas de grupos diferentes que podem ter uma relação diferente com nossa variável resposta segundo características desses cluster.
Vamos examinar um modelo de efeitos mistos linear para clarear a ideia.
\[\begin{align*} & y_ij = \beta_1 + \beta_{2}X_{2ij} + \dots + \beta_{p}X_{pij} + \delta{1i}Z_{1ij} + \delta{qi}Z_{qij} + \epsilon_{ij} \\ &\delta_{ki} \sim N(0, \psi_{k}^2 \\ & C(\delta_{ki}, \delta_{k'i}) = \psi_{kk'} \\ & \delta_{ki}, \delta_{k'i} \text{ são independentes para }i \neq i' \\ & \epsilon_{ij} \sim N(0, \sigma_{\epsilon}^2 \lambda_{ijj}) \\ & C(\epsilon_{ij}. \epsilon_{i'j'} \text{ são independentes para }i \neq i') \\ & \delta_{ki}, \epsilon_{i'j} \text{ são independentes para todo } i,i',k,j (\text{incluindo }i = i') \end{align*}\]
Onde:
\(Y_{ij}\) é o valor da variável resposta para a \(j^a\) de \(n_i\) observações no \(i^o\) de \(m\) clusters.
\(\beta\)s são coeficientes de efeitos fixos e \(X\)s são os regressores cujos efeitos são fixos.
\(\delta\)s são coeficiente de efeitos aleatórios e \(Z\)s são os regresores cujos efeitos são aleatórios (têm uma distribuição). Podemos pensar em \(\delta\) não como parâmetros, mas como variáveis aleatórias não observadas.
\(\psi_{k}^2\) são as variâncias e \(\psi_{kk'}\) as covariâncias entre os efeitos aleatórios, que assumimos ser constantes dentros dos clusters.
\(\epsilon_{ij}\) são erros para a observação \(j\) dentro do cluster \(i\).
\(\sigma_{\epsilon}^2 \lambda_{ijj}\) são as covariâncias entre os erros no grupo \(i\). Se as observações em cada grupo são escolhidas de maneira independente então \(\lambda_{ijj} = 1\) e \(\lambda_{ijj} = 0\). Se não forem, como acontece em estudos longitudinais, quando o grupo é o indivíduo, cada observação e esse indivíduo em um dado momento do tempo e cada observação é serialmente correlacionada com a anterior, a estrutura de \(\lambda\) deve ser especificada.
Existem duas propriedades essenciais que distinguem o modelo linear padrão do modelo linear de efeitos mistos: (1) Existem efeitos aleatórios estruturados no nível do cluster no modelo misto (os \(\delta_{ki}\)), em adição ao erro no nível individual (os \(\epsilon_{ij}\)), e (2) o modelo misto pode acomodar certas formas de variância de erro que não são constantes além de dependências entre or erros.
Seguindo Fox (2019, cap. 23), 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). Suspeitamos que o desempenho do aluno é afetado por um “efeito escola” além de caracetrísticas individuais e que esse efeito se deve ao tipo de escola (católica vs pública).
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
# Analisando os dados e identificando sua natureza multinível.
# os dados estão organizados em um banco com informações de alunos e outro com 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)
})
# Os gráficos indicam um impacto do tipo de escola no desempenho. Para refinar mais a análise o próximo passo é ajustar uma regressão linear simples 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"),
cex.main = 0.7,
cex.axis = 0.7)
boxplot(cat.coef[,2], pub.coef[,2],
main = "Inclinação",
names = c("Católicas","Públicas"),
cex.main = 0.7,
cex.axis = 0.7)
par <- old.par
# 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ção 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 de um modelo multinível.
No nível individual temos o seguinte modelo:
\[\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.
Agora vamos modelar as variações entre os grupos. 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 i} \\ \beta_{j[i]} &= \gamma_0^{\beta} + \gamma_1^{\beta} \overline{ses_i} + \gamma_3^{\beta} setor_i + \omega_{\beta i} \end{align}\]
Onde \(sector\) é um indicador com 1 para escolas católicas e 2 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} \\ \\ \text{matteste}_{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_3^{\beta}setor_i cses_{ij} \\ &+ \omega_{\alpha} + \omega_{\beta} cses_{ij} + \epsilon_{ij} \end{align*}\]
Este modelo, també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})\)
\(Cov(\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} \]
Continuando com Fox 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.
# Primeiro vamos reordenar o fator"sector" atribuindo o valor um para
# escolas públicas e dois para escolas católicas
HSB$sector <- factor(HSB$sector, levels = c("Public","Catholic"))
# Agora ajustamos o modelo na equação composta
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,cex = 0.7),y=list(cex = 0.7)),
lattice = list(key.args=list(space="right",columns=1,cex.title=0.8),strip=list(factor.names=TRUE,values=TRUE,cex=0.6)))
# 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 modelo onde só o intercepto varia por grupo e as inclinações não
# isto é, a correlação entre pares no mesmo grupo é a mesma.
hsb.lme.2 <- update(hsb.lme.1, random = ~cses - 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 46740.23 46795.26 -23362.11 1 vs 2 220.5634 <.0001
# Podemos também comparar um modelo onde o intercepto não varia (mesma média de desempenho em cada setor)
# mas relação entre desempenho e SES varia por escola.
hsb.lme.3 <- update(hsb.lme.1, random = ~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 46520.79 46575.82 -23252.39 1 vs 2 1.124097 0.57
# 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.