Artigo escrito com a colaboração de Alice Ferreira

O principal objetivo do modelo linear misto é remover a premissa de independência dos dados, da análise de regressão comum. Por exemplo, se desejamos prever o volume de vendas de vendedores e esses pertencem a regiões diferentes e a organizações de vendas diferentes, fica evidente que as variáveis possuem uma hierarquia, ou seja, são dependentes.

observações vêm de um grupo homogêneo ou de subgrupos prévios
E, na prática, observamos que a maioria dos dados possui uma correlação entre si, o que fazer então?

Como tratar dados hierárquicos?

Como eles quebram a premissa de idenpendência, não podemos seguir com uma regressão linear usual, então o que fazer?

Resumir os dados:
Uma abordagem simples é resumir os dados, no exemplo acimia iríamos pegar as regiões, que são o nível máximo, e utilizar a média por grupo no lugar das observações individuais. Dessa maneira os dados seriam independentes.

Porém você já deve imaginar que essa abordagem não é a ideal, pois muitas vezes teríamos um número de observações infímo como o do exemplo acima, n = 4.

Separar os dados:
Outra abordagem seria realizar uma modelagem por região, separando nossos dados em 4 bancos diferentes e aplicando 4 modelos, um por banco. Porém isso também gera perda de informação sobre a regionalidade, sobre a disperção entre regiões.

Isso também gera modelos baseados em menos dados, tornando eles menos acertivos.

A regressão linear de modelos mistos pode ser vista como um intermédio entre essas propostas.

Vantagens do LMER

Não possui premissa de independência entre as variáveis explicativas

A variável dependente pode ser categórica, ordinal ou discreta!

A variável tempo é contínua.
Na ANOVA a variável de tempo é categórica, isso torna o modelo LMER mais vantajoso! Por exemplo, se tivermos os meses 1,2,3, e 5, a ANOVA as entende como categorias, já o LMER identifica essa diferença de dispersão.

Fatores fixos e aleatórios

O principial objetivo do modelo linear misto é remover a premissa de independência dos dados, permitindo que tenhamos tanto efeitos fixos quanto efeitos aleátorios.

Diferença teórica

Os fatores fixos são paramétricos que não variam, igual aos dos tradicionais modelos de regressão. Assumimos que há um valor verdadeiro de β o tentamos estimar, ele é parâmetro desconhecido.

Já os fatores aleatórios são variáveis aleatórias, por exemplo, poderíamos dizer que um parâmetro β com média μ e variância σ tem a distribuição:

Podemos observar os fatores aleátorios como parte de uma população maior do que a amostrada, ou seja, uma VA. No modelo de efeitos mistos não atentamos a cada nível dos fatores aleatórios, não importamos com cada fator, o importante é que possuimos uma sequência de fatores e queremos levar em conta sua variabilidade.

Então a regressão linear pode ser vista como um modelo linear de efeitos mistos mas com apenas fatores fixos. Agora, como identificar esses fatores? Não há uma regra, isso irá depender da sua variável resposta e do seu banco de dados. Mas há algumas diretrizes que podemos seguir.

Fatores Fixos: são os fatores que você esta mais interresado, aqueles que tem mais importância sob o modelo.

Fatores aleatórios: Os fatores randomicos normalmente são as que você não se importa tanto com a variável em si, mas deseja levar em conta no modelo diferenças potenciais entre os grupos, ou seja, levar em conta a variância.

Diferença prática

Os modelos lineares de efeitos mistos usam algo chamado restricted maximum likelihood estimation (REML) para modelar esses efeitos aleatórios, e seus resíduos (que no exemplo abaixo seriam a diferença entre os pontos e as linhas).

Porém como o fator vem de uma VA , o modelo estima um intercepto e/ou inclinação para cada categoria. Isso pode ter um poder muito siginificativo para nossa análise, como mostrado abaixo:

Sem a análise da variância das categorias acreditamos que as variáveis ‘Salário’ e ‘Neuroticismo’ possuia uma correlação diretamente proporcional, mas atravéz da análise do efeito aleatório escolaridade, oservamos que possuem uma relação inversamente proporcional.

Os fatores vem de uma variável aleatória desconhecida ->
Estimamos os melhores fatores para cada categoria da variável ->
Como vem de uma VA, os estimadores podem diferir.

Tratamento para fatores ateatórios

Uma opção, mostrada na primeira imagem, é partimos da premissa que os fatores aleatórios possuem interceptos diferentes, mas possuem mesma inclinação. Fórmula:

Também poderiamos partir do inverso, de que os interceptos são iguais porém a inclinação difere.

Ou ainda, seguir da premissa de que tanto o intercepto quanto a inclinação podem diferir, como mostrado na segunda imagem. Fórmula:

Tipos de efeitos aleatórios

Lembrando que os fatores aleatórios vêm de uma variável categórica independente e desconhecida, e para o método estimar essa distribuição precisamos de muitas estimativas.

Essas estimativas são calculas por cada grupo da variável, como mostrado acima, então os os efeitos aleatórios devem ter muitas categorias! Normamente dizemos que menos de 5 grupos é sugerido que os tratem como efeitos fixos.

O método precisa estimar a distribuição das categorias dos efeitos aleatórios, se tivermos apenas 4 categorias fica muito difícil estimar esse tipo de VA de maneira adequada.

Nested Effects

nested effects
  • Os Efeitos Aninhados são aqueles que possuem categorias únicas, não possuindo níveis iguais para categorias de hirarquia superior.
  • Na imagem acima poderíamos considerar os números em vermelhos os vendedores e as caixas pontilhadas seus gerentes, eles são Nasted Effects, pois os números não cruzam entre caixas.

Outro exemplo:

nested effects

Crossed Efects

crossed effects

Os crossed effects são os que possuem todas suas opções de cetegórias nas hierarquia superior, como mostrado na imagem acima, em que a sombra esverdeada e a sombra azulada apercem em todas as caixas pontilhadas.

Fazendo um pararlo com os exemplos anteriores essas sombras poderiam ser tipos de materias que os gerentes venderam, como materiais refrigerados ou não.

Esse exemplo é de um efeito cruzado inteiro, pois as duas cores ocorrem em todas as caixas, se isso não ocorrer ainda o chamariamos de efeito cruzado mas não inteiro.

Outro exemplo:

crossed effects
(1|School) + (1|Class)

Na prática, os efeitos cruzados são aqueles que não são aninhados.

Aplicando o modelo misto

Pacotes

Ao baixar o pacote lmer4 é indicado que seja instalado uma versão antiga dele, isso irá evitar problemas ao extrair os coeficientes de efeitos aleatórios de bancos de dados grandes.

# InstallOldPackages("lme4", versions = "1.1-15")
# install.packages('JWileymisc')
library(lme4)
library(lmerTest)
library(haven)
library(tidyverse)

O banco de dados usado contém cerca de 2 mil alunos de determinada escola, com suas respectivas classes, grau de extroversão, sexo, anos de experiência de seu professor e grau de popularidade.

popular2data <- read_sav(file = "popular2.sav") %>% 
  select(pupil, class, extrav, sex, texp, popular)

popular2data %>% head()
## # A tibble: 6 x 6
##   pupil class extrav       sex  texp popular
##   <dbl> <dbl>  <dbl> <dbl+lbl> <dbl>   <dbl>
## 1     1     1      5  1 [girl]    24     6.3
## 2     2     1      7  0 [boy]     24     4.9
## 3     3     1      4  1 [girl]    24     5.3
## 4     4     1      3  1 [girl]    24     4.7
## 5     5     1      5  1 [girl]    24     6  
## 6     6     1      4  0 [boy]     24     4.7
  • pupil: aluno
  • class: turma
  • extrav: grau de extroversão
  • sex: sexo
  • texp: anos de experiência do seu professor
  • popular: grau de popularidade

Para evitar os problemas de sobreajuste, Barr et al. (2013) sugerem que comecemos a análise da maneira com a estrutura mais complexa possível para os efeitos aleatórios. Caso o modelo tenha problemas de sobreajuste ou de convergência no método iterativo, devemos simplificar esta estrutura até atingir uma convergência sem problemas.

Porém isso é algo relativo, pois depende da quantidade de variáveis ou complexidade do seu banco de dados. Neste caso, como possuimos poucas iremos seguir essa lógica!

Análise das variáveis

Antes de iniciar a análise vamos observar as relações das variáveis de interesse com a variável resposta desejada: popular

Podemos observar que no geral a popularidade tem uma relação positiva com a extroversão, o que faz sentido! Agora vamos considerar as 100 classes.

  • O gráfico a princípio pode parecer confuso, mas nos modelos mistos como os efeitos aleatórios são tratados como uma variável aleatória esperamos que eles possuam muitas categorias, pois assim temos uma amostra maior dos interceptos e inclinações!
  • Se analisarmos de maneira geral continuamos observando uma relação positiva entre as variáveis (inclinação postivia) para maioria das classes, e com uma diferença significativa nos interceptos! Segue que é razoável assumir que cada classe tem uma influência de diferente sobre a popularidade do aluno, afetando a distribuição dos dados.
  • Isso significa que cada classe contribui com uma variabilidade aleatória que deve ser prevista no modelo. E como possui um número de categorias sufuciente, devemos considerar a variável classe como um efeito aleatório.
  • Aqui estamos determinando que o modelo considere interceptos diferentes para cada classe (o número 1, aqui, representa o intercepto). Esse intercepto é chamado de intercepto aleatório, visto que ele tem por objetivo modelar um fator de variabilidade aleatória: as classes (nós podemos chamar esse intercepto específico de intercepto aleatório por classe).
  • Podemos observar que a variável sexo possui inclinações muito similares, diferindo apenas nos interceptos.
  • Como o número de categorias é infimo não podemos considerar a variável como um efeito aleatório, além disso não podemos afirmar que ele influência de maneira diferente sobre a popularidade do aluno, pois suas inclinações são similares.
  • Além disso devemos adicionar a variável numérica dos anos de experiência dos professores, que como é uma variável númerica deve ser tratada como um fator fixo, e também desejamos acionar um intercepto para o modelo, resultando na seguinte fórmula:

Slope Aleatório!

  • Porém como visto anteriormente possuimos várias maneiras de lidarmos com os efeitos aleatórios, e o ideal neste caso é a que a classe possua interceptos e inclinações diferentes para cada categoria! Ou seja, possuam também slopes aleatórios (inclinações)!
  • A fórmula aplicada acima (1|class)(1|class) se refere a que possui apenas interceptos diferentes
  • Como desejamos que a inclinação da classe seja alterada para cada categoria de cada variável categórica (partindo do modelo mais complexo) devemos usar a fórmula:

O que a sintaxe (1 + sex + extrav + texp|class)(1 + sex + extrav + texp|class) indica é:

“intercepto aleatório +
slope aleatório por sexo por classe +
slope aleatório por grau de extroversão por classe +
slope aleatório por experiência do professor”.

  • Porém é de se imaginar que multiplos splopes vão causar um overfit, logo antes de prosseguirmos vamos analisar os níveis de significancias desses slopes! Para isso usamos a função ranova() do pacote lmerTest, pois o summary tradicional não fornece essas informações sobre os efeitos aleatórios.
model <- lmer(formula = popular ~ 1 + sex + extrav + texp + (1 + sex + extrav + texp| class),
               data    = popular2data)

ranova(model)
## ANOVA-like table for random-effects: Single term deletions
## 
## Model:
## popular ~ sex + extrav + texp + (1 + sex + extrav + texp | class)
##                                             npar  logLik    AIC    LRT Df
## <none>                                        15 -2416.6 4863.2          
## sex in (1 + sex + extrav + texp | class)      11 -2417.3 4856.6  1.419  4
## extrav in (1 + sex + extrav + texp | class)   11 -2441.7 4905.4 50.180  4
## texp in (1 + sex + extrav + texp | class)     11 -2416.6 4855.3  0.060  4
##                                             Pr(>Chisq)    
## <none>                                                    
## sex in (1 + sex + extrav + texp | class)        0.8408    
## extrav in (1 + sex + extrav + texp | class)  3.312e-10 ***
## texp in (1 + sex + extrav + texp | class)       0.9996    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  • Através do teste fica evidente que o único slope significativo é o vindo de extrav, pois seu p valor < 0,05. Temos então a fórmula: popular ∼ 1 + sex + texp + extrav + (1 + extrav|class)
  • A partir da fórmula descrita acima, criamos um Modelo Linear Misto, que recebe esse nome porque, dentre seus parâmetros, há tanto efeitos fixos quanto efeitos aleatórios. Nesse modelo, o efeito fixo é o sexo do aluno, a experiência do seu professor e seu grau de extroversão, mas se considera, ao mesmo tempo, variabilidade por classe por grau de extroversão.

Aplicando com lme4

model <- lmer(formula = popular ~ 1 + sex + extrav + texp + (1 + extrav| class),
               data    = popular2data)

summary(model)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: popular ~ 1 + sex + extrav + texp + (1 + extrav | class)
##    Data: popular2data
## 
## REML criterion at convergence: 4834.8
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.1768 -0.6475 -0.0235  0.6648  2.9684 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev. Corr 
##  class    (Intercept) 1.30299  1.1415        
##           extrav      0.03455  0.1859   -0.89
##  Residual             0.55209  0.7430        
## Number of obs: 2000, groups:  class, 100
## 
## Fixed effects:
##              Estimate Std. Error        df t value Pr(>|t|)    
## (Intercept) 7.361e-01  1.966e-01 1.821e+02   3.745 0.000242 ***
## sex         1.252e+00  3.657e-02 1.913e+03  34.240  < 2e-16 ***
## extrav      4.526e-01  2.461e-02 9.750e+01  18.389  < 2e-16 ***
## texp        9.098e-02  8.685e-03 1.017e+02  10.475  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##        (Intr) sex    extrav
## sex    -0.031              
## extrav -0.717 -0.057       
## texp   -0.688 -0.039  0.086
  • Caso nosso modelo obtivsse um overfit (funcionando muito bem para esta amostra em particular, mas não permite generalizações para a população de onde os dados foram obtidos), receberiamos o seguinte alerta: “## boundary (singular) fit: see ?isSingular”.
  • Como não foi o caso seguimos com a análise desse modelo. Atravéz do pvalor podemos observar que todos os efeitos fixos foram significativos, e anteriormente foi visto que o efeito aletório também.

Analisando o modelo

  • Como o summary não reatorna o ajuste do nosso modelo podemos caculalo:
pred <- predict(model, type = "response")
resp <- popular2data$popular
cor(pred,resp)^2
## [1] 0.7330734

Comparação por modelos aninhados

  • Caso queira testar se um determinado fator fixo é de fato significativo para o modelo em questão podemos fazer a comparação por modelos aninhados.
  • Isso é feito por um teste de razão de verossimilhança. Nas palavras de Winter (2013):
    “Verossimilhança é a probabilidade de ver seu conjunto de dados dado o seu modelo. A lógica do teste de razão de verossimilhança é comparar a verossimilhança de dois modelos entre si. Primeiro, o modelo sem o fator de interesse (…), e depois o modelo com o fator em que se está interessado”
  • Suponha que desejamos testar se a experiência do professor é significativo, devemos criar dois modelos, um com texp e outro sem! Na sequência, o teste de razão de verossimilhança é feito com a função anova(). Esse tipo de comparação é chamada de comparação de modelos aninhados pelo fato de o modelo mais simples estar contido (i.e., aninhado) no modelo mais completo.
## criando modelo completo e modelo aninhado

modelo.nulo  <- lmer(formula = popular ~ 1 + sex + extrav + (1+ extrav|class),
                     data  = popular2data, REML = FALSE)

modelo.texp <- lmer(formula = popular ~ 1 + sex + extrav + texp + (1+ extrav|class),
                     data  = popular2data, REML = FALSE)

## comparação de modelos
anova(modelo.nulo, modelo.texp)
## Data: popular2data
## Models:
## modelo.nulo: popular ~ 1 + sex + extrav + (1 + extrav | class)
## modelo.texp: popular ~ 1 + sex + extrav + texp + (1 + extrav | class)
##             Df    AIC    BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)    
## modelo.nulo  7 4873.1 4912.3 -2429.6   4859.1                             
## modelo.texp  8 4828.8 4873.6 -2406.4   4812.8 46.323      1  1.003e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  • As colunas AIC e BIC são estatísticas chamadas Akaike Information Criteria e Bayaesian Information Criteria. Elas servem como auxiliares na escolha do melhor modelo para os dados analisados. Não existe um valor de referência para estas estatísticas. Vamos escolher os modelos que possuam o menor valor de AIC ou BIC.
  • Entretanto, esta decisão precisa ser tomada a partir de um teste de hipóteses realizado por meio de um Teste de Razão de Verossimilhanças, cujo pvalor está na coluna Pr(>Chisq). Como foi menor que 0.05 podemos confirmar qeu texp é siginificativo.
## $class

Análise de resíduo

  • Homostecidade: resíduos devem estar dispersos, sem padrões.
  • Normalidade resíduos
  • Normalidade efeitos aleatórios

Fazendo a previsão com o modelo

  • A fórmula abaixo:
pred <- predict(model, type = "response"
                #newdata = ...
                )

Nem sempre é aplicavel para banco de dados grandes, ou as vezes demanda de muito tempo computacional, nesse caso podemos fazer a predição manualmente.

  • Quando desejamos ir além da análise do comportamento dos fatores, e usar o modelo para fazer previsões de novos dados podemos extrair os ranefs.
Ranef_classe <- 
  data.frame(
    class=rownames(ranef(model)$class), 
    Int_classe=ranef(model)$class[,2], 
    extrav_class=ranef(model)$class[,1]
  )

Ranef_classe %>% head(10)
##    class   Int_classe extrav_class
## 1      1 -0.009962121  -0.55757957
## 2      2  0.007645745  -0.69876452
## 3      3  0.145673570  -1.14517346
## 4      4 -0.063415991   0.51332720
## 5      5  0.234199649  -0.58842549
## 6      6  0.074538681  -0.39216643
## 7      7 -0.142620248  -0.09782894
## 8      8  0.165578304  -1.88137801
## 9      9  0.031936286   0.10554475
## 10    10 -0.177518771   0.66963848
  • Armazenamos as estimativas do fator aleatório para cada classe, como é tratado como uma variável aleatória iremos considerar que cada classe possui um intercepto (Int_classe) e um grau de declividade (extrav_class) diferente.
  • Vou criar um conjunto de 3 alunos, com características diferentes, e fazer a previsibilidade dos seus respectivos graus de popularidade:
novos_alunos = data.frame(
  row.names = c("João", "Maria", "Claudia"),
  "class"   = c('1', '4', '5'),
  "extrav"  = c(10, 2, 6),
  "sex" = c(0, 1 , 1),
  "texp" = c(10, 15, 8)
)

novos_alunos
##         class extrav sex texp
## João        1     10   0   10
## Maria       4      2   1   15
## Claudia     5      6   1    8
summary(model)$coefficients
##               Estimate  Std. Error         df   t value      Pr(>|t|)
## (Intercept) 0.73614952 0.196586862  182.09945  3.744653  2.421594e-04
## sex         1.25225444 0.036573241 1913.09435 34.239635 8.111296e-201
## extrav      0.45261994 0.024613832   97.53865 18.388845  1.819715e-33
## texp        0.09097566 0.008685065  101.65668 10.474955  7.516098e-18
  • Vamos utilizar os coeficientes do modelo para os efeitos fixos, e para o efeito aleatório o ranef_class acima.
novos_alunos %>% 
  left_join(Ranef_classe, by = "class") %>% #juntando com os rafenfs de suas respectivas classes
  mutate(class = as.numeric(class)) %>% 
  mutate(
  popularidade_predita = (
    summary(model)$coefficients[1, 1] + # intercepto
    summary(model)$coefficients[2, 1]*sex +
    summary(model)$coefficients[3, 1]*extrav +
    summary(model)$coefficients[4, 1]*texp +
    Int_classe + # intercepto classes
    extrav_class*`class`
))
##   class extrav sex texp   Int_classe extrav_class popularidade_predita
## 1     1     10   0   10 -0.009962121   -0.5575796             5.604564
## 2     4      2   1   15 -0.063415991    0.5133272             6.248172
## 3     5      6   1    8  0.234199649   -0.5884255             2.724001

4 respostas
    • Adilane Ribeiro da Silva
      Adilane Ribeiro da Silva says:

      Oi Marcelo! Você pode obter o banco de dados de duas maneiras:

      – diretamente do GitHub utilizando o código “read_sav(file =”https://github.com/MultiLevelAnalysis/Datasets-third-edition-Multilevel-book/blob/master/chapter%202/popularity/SPSS/popular2.sav?raw=true”)”;

      – ou baixando diretamente do site “https://github.com/MultiLevelAnalysis/Datasets-third-edition-Multilevel-book/blob/master/chapter%202/popularity/SPSS/popular2.sav”.

      Lembrando que você precisa carregar o pacote “haven” para poder usar a função read_sav.

      Responder
  1. Heloysa
    Heloysa says:

    Muito bom! Temos poucos materiais sobre modelagem em sites em português. Gostei muito da explicação. Sempre acompanho as atualizações daqui. Fico no aguardo de uma postagem sobre modelos mistos generalizados. (:

    Responder
    • Adilane Ribeiro da Silva
      Adilane Ribeiro da Silva says:

      Sim Heloysa, tem pouquíssimo material em português sobre modelagem, mas estamos trabalhando para produzir cada vez mais artigos sobre o tema. Já anotamos aqui e o artigo sobre modelos mistos generalizados sai em breve!

      Responder

Deixe uma resposta

Quer participar dessa discussão?
Sinta-se livre para contribuir!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *