Motivação Link para o cabeçalho

Modelos lineares são uma classe grande de modelos. Muitas técnicas que conhecemos na estatística são casos particulares de modelos lineares mistos. Neste post mostro como podemos utilizar casos particulares de modelos mistos para substituir dois famosos testes de hipóteses da literatura: o Teste T para Duas Populações Independentes e o Teste T Pareado. Um approach como esse uniformiza nossas análises, fazendo com que o nosso workflow seja padronizado e menos suscetível a erros.

Teste T para Duas Populações Independentes e Regressão Linear Simples Link para o cabeçalho

Objetivo Link para o cabeçalho

Vamos mostrar como podemos substituir o Teste T para Duas Populações Independentes por um regressão linear simples. Uma limitação dessa técnica é assumir que a variância é constante entre os grupos, o que em alguns casos pode não ser uma hipótese razoável.

Conjunto de Dados Link para o cabeçalho

Vamos aplicar o Teste T para Duas Populações Independentes no conjunto de dados genderweight, do pacote datarium. O conjunto de dados tem a seguinte estrutura:

data("genderweight", package = "datarium")
genderweight
##    id group   weight
## 1   1     F 61.58587
## 2   2     F 64.55486
## 3   3     F 66.16888
## 4   4     F 59.30860
## 5   5     F 64.85825
## 6   6     F 65.01211
## 7   7     F 62.85052
## 8   8     F 62.90674
## 9   9     F 62.87110
## 10 10     F 62.21992
## 11 11     F 63.04561
## 12 12     F 62.00323
## 13 13     F 62.44749
## 14 14     F 64.12892
## 15 15     F 65.91899
## 16 16     F 63.77943
## 17 17     F 62.97798
## 18 18     F 62.17761
## 19 19     F 62.32566
## 20 20     F 68.83167
## 21 21     M 89.73749
## 22 22     M 86.30123
## 23 23     M 86.57699
## 24 24     M 91.52774
## 25 25     M 85.18454
## 26 26     M 81.03487
## 27 27     M 92.16116
## 28 28     M 83.36989
## 29 29     M 88.91674
## 30 30     M 83.85228
## 31 31     M 95.06264
## 32 32     M 86.38424
## 33 33     M 85.09808
## 34 34     M 86.24308
## 35 35     M 80.03999
## 36 36     M 82.57809
## 37 37     M 77.00978
## 38 38     M 81.62454
## 39 39     M 87.38138
## 40 40     M 86.43756

São 40 observações, sendo 20 para cada gênero.

Teste T para Duas Populações Independentes Link para o cabeçalho

O Teste T para Duas Populações Independentes pode ser realizado de duas maneiras: da forma padrão, comparando dois vetores, ou como fórmula, que na minha opinião, é mais organizada.

Comparação de Vetores Link para o cabeçalho

Vamos criar vetores chamados females e males, com as observações dos grupos de mulheres e homens. Queremos comparar os pesos de homens e mulheres e decidir se eles são, em média, diferentes entre si. Ou seja, queremos testar as hipóteses

\begin{align*} H_0& : \mu_F = \mu_M \\ H_0& : \mu_F \neq \mu_M \end{align*}

\noindent em que \(\mu_F\) e \(\mu_H\) são as médias de pesos das mulheres e dos homens, respectivamente.

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
females <- genderweight |> 
  filter(group == "F") |> 
  pull(weight)

males <- genderweight |> 
  filter(group == "M") |> 
  pull(weight)

t.test(females, males, var.equal = TRUE)
## 
## 	Two Sample t-test
## 
## data:  females and males
## t = -20.791, df = 38, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -24.50140 -20.15349
## sample estimates:
## mean of x mean of y 
##  63.49867  85.82612

Atente para o p-valor do teste e para a estimativa da diferença entre as médias, que é dada por 63.49867-85.82612 = -22.32745. Elas serão importantes mais tarde.

Utilizando Notação de Fórmula Link para o cabeçalho

Particularmente, prefiro fazer desse jeito. Note como o p-valor e estimativa para a diferença são idênticos ao caso anterior:

t.test(weight ~ group, data = genderweight, var.equal = TRUE)
## 
## 	Two Sample t-test
## 
## data:  weight by group
## t = -20.791, df = 38, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
##  -24.50140 -20.15349
## sample estimates:
## mean in group F mean in group M 
##        63.49867        85.82612

Portanto, não faz diferença executar o Teste T para Duas Populações Independentes comparando vetores ou utilizando notação de fórmula. Ambas são equivalentes.

Regressão Linear Link para o cabeçalho

Agora vamos ver como obter o mesmo resultado do Teste T para Duas Populações Independentes utilizando uma regressão linear.

No exemplo a seguir eu ajusto um modelo de regressão, utilizando o mesmo conjunto de dados genderweight.

# group eh o efeito de genero

modelo_regressao <- lm(weight ~ group, data = genderweight)

Ao estimar o contraste entre F e M, obtemos o mesmo resultado, em termos de estatística, p-valor e estimativa da média entre as diferenças, pela terceira vez:

library(emmeans)

medias <- emmeans(modelo_regressao, pairwise ~ group)

medias$contrasts
##  contrast estimate   SE df t.ratio p.value
##  F - M       -22.3 1.07 38 -20.791  <.0001

Portanto, o modelo de regressão linear substitui a contento o Teste T para Duas Populações Independentes.

Teste T Pareado e Modelo Misto Link para o cabeçalho

Objetivo Link para o cabeçalho

Modelos mistos são uma classe grande de modelos. Muitas técnicas que conhecemos na estatística são casos particulares de modelos mistos. Nesse texto, mostro como podemos utilizar um modelo misto para substituir o Teste T Pareado. Dessa forma, espero que fique mais claro porque podemos utilizar essa ferramenta sempre que temos duas ou mais observações repetidas por sujeito em nossos problemas. Assim, uniformizamos as

Conjunto de dados Link para o cabeçalho

O conjunto de dados sleep, presente na memória do R, possui 20 observações de 10 sujeitos (portanto, duas observações por sujeito) que mostram o efeito de duas drogas soporíficas, considerando o aumento das horas de sono em relação ao controle. Veja o conteúdo do conjunto de dados abaixo:

sleep
##    extra group ID
## 1    0.7     1  1
## 2   -1.6     1  2
## 3   -0.2     1  3
## 4   -1.2     1  4
## 5   -0.1     1  5
## 6    3.4     1  6
## 7    3.7     1  7
## 8    0.8     1  8
## 9    0.0     1  9
## 10   2.0     1 10
## 11   1.9     2  1
## 12   0.8     2  2
## 13   1.1     2  3
## 14   0.1     2  4
## 15  -0.1     2  5
## 16   4.4     2  6
## 17   5.5     2  7
## 18   1.6     2  8
## 19   4.6     2  9
## 20   3.4     2 10

Teste T Pareado Link para o cabeçalho

Assim como no caso do Teste T para Duas Populações, podemos aplicar o Teste T Pareado de duas maneiras: da forma padrão, comparando dois vetores, ou como fórmula, que na minha opinião, é mais organizada.

Comparação de Vetores Link para o cabeçalho

Vamos criar vetores chamados group_1 e group_2, com as observações dos grupos 1 e 2. Em seguida, vamos testar as hipóteses

\begin{align*} H_0& : \mu_d = 0 \\ H_0& : \mu_d \neq 0 \end{align*}

\noindent em que \(\mu_d\) é a diferença pareada entre os grupos 1 e 2 para cada um dos 10 sujeitos.

group_1 <- sleep |> 
  filter(group == 1) |> 
  pull(extra)

group_2 <- sleep |> 
  filter(group == 2) |> 
  pull(extra)

t.test(group_1, group_2, paired = TRUE)
## 
## 	Paired t-test
## 
## data:  group_1 and group_2
## t = -4.0621, df = 9, p-value = 0.002833
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -2.4598858 -0.7001142
## sample estimates:
## mean difference 
##           -1.58

Atente para o p-valor do teste e para a estimativa da diferença entre as médias. Elas serão importantes mais tarde.

Utilizando Notação de Fórmula Link para o cabeçalho

Particularmente, prefiro fazer desse jeito. Note como o p-valor e estimativa para a diferença são idênticos ao caso anterior:

t.test(extra ~ group, data = sleep, paired = TRUE)
## 
## 	Paired t-test
## 
## data:  extra by group
## t = -4.0621, df = 9, p-value = 0.002833
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -2.4598858 -0.7001142
## sample estimates:
## mean difference 
##           -1.58

Portanto, não faz diferença executar o Teste T Pareado comparando vetores ou utilizando notação de fórmula. Ambas são equivalentes.

Modelo Misto Link para o cabeçalho

Já vimos anteriormente que aquilo que chamamos de Teste T não passa de uma regressão linear simples. Por sua vez, o Teste T Pareado é uma regressão linear simples com efeito aleatório, que é parte de uma classe maior de modelos chamados modelos mistos^[https://pt.wikipedia.org/wiki/Modelo_misto]. Esse modelos têm esse nome porque eles mesclam efeitos fixos e efeitos aleatórios para estimar a variável de interesse.

No exemplo a seguir eu ajusto um modelo misto, utilizando o mesmo conjunto de dados sleep. Note a inclusão do termo (1|ID), indicando que há medidas repetidas por sujeito.

library(lme4)
## Loading required package: Matrix
## 
## Attaching package: 'Matrix'
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
library(emmeans)

# group eh o efeito fixo
# ID eh o efeito aleatorio

modelo_misto <- lmer(extra ~ group + (1|ID), data = sleep)

Ao estimar o contraste entre group_1 e group_2, obtemos o mesmo resultado, em termos de p-valor e estimativa da média entre as diferenças, pela terceira vez:

medias <- emmeans(modelo_misto, pairwise ~ group)

medias$contrasts
##  contrast        estimate    SE df t.ratio p.value
##  group1 - group2    -1.58 0.389  9  -4.062  0.0028
## 
## Degrees-of-freedom method: kenward-roger

Portanto, modelos mistos servem para abordar problemas com medidas repetidas por sujeitos, mesmo que sejam apenas duas para cada um deles.