Lab_10c_Chi_quadrado_e_teste_exato_de_Fisher

Author

Henrique Alvarenga

Published

11 de setembro de 2024

Teste do Chi Quadrado

O teste do chi-quadrado compara as frequências observadas em tabelas de contingência com as frequências esperadas se a hipótese nula fosse verdadeira.

O argumento para a realização desse teste no R é, portanto, uma tabela de contingência.

Vamos usar os dados de uma pesquisa sobre a efetividade dos capacetes de bicicleta na prevenção de trauma crânio-encefálico (TCE), tal como exemplificado por Pagano e Gauvreau (Pagano, Gauvreau, and Mattie 2022). O objetivo aqui é avaliar, num estudo de caso controle, se o uso de capacetes reduz o risco de Trauma Crânio Encefálico.


Attaching package: 'kableExtra'
The following object is masked from 'package:dplyr':

    group_rows
Usando capacete
TCE Sim Não Total
Sim 17 218 235
Não 130 428 558
Total 147 646 793

O testo do chi-quadrado pode ser usado para avaliar se o uso do capacete reduziu o nº de casos de TCE entre os ciclistas. Precisamos apenas construir uma tabela com esses dados no R, o que pode ser feito através da função matrix(), ou com as funções data.frame() ou tibble(). Veremos como fazer das duas formas.

Usando a função matrix():

Code
tab1 <- matrix(c(17,218,130,428), 
               nrow=2, 
               byrow = TRUE)
tab1
     [,1] [,2]
[1,]   17  218
[2,]  130  428

O argumento nrow=2 indica que a tabela terá 2 linhas e o argumento byrow = TRUE indica que as células da tabela serão preenchidas linha a linha.

Usando a função data.frame() ou tibble()

De forma simples, sem legendas. Observe que a função data.frame() cria colunas com cada vetor. Assim a primeira coluna conterá os valores 17 e 130, e a segunda coluna os valores 218 e 428.

Code
dat1 <- data.frame(c(17,130), c(218,428))
dat1
  c.17..130. c.218..428.
1         17         218
2        130         428

Podemos melhorar o data frame dicionando legendas:

Code
dat2 <- data.frame(comCapacete  = c(17,130), 
                   semCapacete  = c(218,428), 
                   row.names = c("comTCE", "semTCE"))
dat2
       comCapacete semCapacete
comTCE          17         218
semTCE         130         428

Vamos agora fazer os testes usando essas tabelas criadas, para verificarmos que o resultado é o mesmo.

Code
chisq.test(tab1)

    Pearson's Chi-squared test with Yates' continuity correction

data:  tab1
X-squared = 27.202, df = 1, p-value = 1.833e-07
Code
chisq.test(dat1)

    Pearson's Chi-squared test with Yates' continuity correction

data:  dat1
X-squared = 27.202, df = 1, p-value = 1.833e-07
Code
chisq.test(dat2)

    Pearson's Chi-squared test with Yates' continuity correction

data:  dat2
X-squared = 27.202, df = 1, p-value = 1.833e-07

Observe que em todos os casos o resultado foi idêntico. Observe também que o teste fez a correção de Yates automaticamente. É possível alterar esse comportamento padrão com o argumento correct = FALSE.

Code
chisq.test(dat2, correct = FALSE)

    Pearson's Chi-squared test

data:  dat2
X-squared = 28.255, df = 1, p-value = 1.063e-07

Para aplicar o teste do chi quadrado em dados armazenados em data frames precisamos, da mesma forma, primeiro tabular os dados para depois fazer o teste.

Como exemplo vamos usar o dataset “Arthritis” disponível no pacote vcd (visualizing categorical data). Esse dataset contém informações de 84 pacientes, 41 dos quais usaram um medicamento e 43 usaram um placebo. O uso do medicamento ou placebo está registrado numa variável categórica (Treatment) de dois níveis (treated, placebo). O resultado está registrado em uma variável categórica ordinal (Improved) de 3 níveis (None < Some < Marked).

Para instalar o pacote vcd use o comando install.packages no console.

install.packages(“vcd”)

Para usar esse pacote é necessário carregá-lo com o comando library() no início do código:

Code
library(vcd)
Loading required package: grid

Carregando o dataset Arthritis

Code
data("Arthritis")

Verificando o dataset Arthritis com o comando str().

Code
str(Arthritis)
'data.frame':   84 obs. of  5 variables:
 $ ID       : int  57 46 77 17 36 23 75 39 33 55 ...
 $ Treatment: Factor w/ 2 levels "Placebo","Treated": 2 2 2 2 2 2 2 2 2 2 ...
 $ Sex      : Factor w/ 2 levels "Female","Male": 2 2 2 2 2 2 2 2 2 2 ...
 $ Age      : int  27 29 30 32 46 58 59 59 63 63 ...
 $ Improved : Ord.factor w/ 3 levels "None"<"Some"<..: 2 1 1 3 3 3 1 3 1 1 ...

A primeira etapa para verificar a associação entre o tratamento e a melhora é criar uma tabela com as variáveis (categóricas) de interesse: Treatment e Improved.

Code
tab5 <- table(Arthritis$Treatment, Arthritis$Improved)
tab5
         
          None Some Marked
  Placebo   29    7      7
  Treated   13    7     21

Agora que já construímos a tabela a partir das duas variáveis de interesse do data frame, podemos então usar o teste do chi quadrado para verificar a associação entre o tratamento e o resultado. Basta aplicar o teste na tabela criada.

Code
chisq.test(tab5)

    Pearson's Chi-squared test

data:  tab5
X-squared = 13.055, df = 2, p-value = 0.001463

O resultado indica haver uma associação entre o tipo de tratamento realizado e o resultado, ou seja, o uso do medicamento parece ter sido melhor que o placebo.

Podemos também inserir as variáveis de interesse diretamente na função chisq.test(), tal como no exemplo abaixo:

Code
chisq.test(Arthritis$Treatment, Arthritis$Improved)

    Pearson's Chi-squared test

data:  Arthritis$Treatment and Arthritis$Improved
X-squared = 13.055, df = 2, p-value = 0.001463

Podemos da mesma forma extrair os resultados do teste armazenando os resultado do teste num objeto.

Code
result_chi <- chisq.test(tab5)
str(result_chi)
List of 9
 $ statistic: Named num 13.1
  ..- attr(*, "names")= chr "X-squared"
 $ parameter: Named int 2
  ..- attr(*, "names")= chr "df"
 $ p.value  : num 0.00146
 $ method   : chr "Pearson's Chi-squared test"
 $ data.name: chr "tab5"
 $ observed : 'table' int [1:2, 1:3] 29 13 7 7 7 21
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:2] "Placebo" "Treated"
  .. ..$ : chr [1:3] "None" "Some" "Marked"
 $ expected : num [1:2, 1:3] 21.5 20.5 7.17 6.83 14.33 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:2] "Placebo" "Treated"
  .. ..$ : chr [1:3] "None" "Some" "Marked"
 $ residuals: 'table' num [1:2, 1:3] 1.6175 -1.6565 -0.0623 0.0638 -1.937 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:2] "Placebo" "Treated"
  .. ..$ : chr [1:3] "None" "Some" "Marked"
 $ stdres   : 'table' num [1:2, 1:3] 3.2742 -3.2742 -0.0976 0.0976 -3.3956 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:2] "Placebo" "Treated"
  .. ..$ : chr [1:3] "None" "Some" "Marked"
 - attr(*, "class")= chr "htest"

O valor de p pode ser extraido com o comando result_chi$pvalue, como feito abaixo:

Code
result_chi$p.value
[1] 0.001462643

Teste exato de Fisher

O teste exato de Fisher é utilizado na análise de tabelas de contingência quando a amostra é pequena, embora seja válido para todo tamanho de amostra. Foi desenvolvido por Ronald Fisher. Fisher disse ter concebido o teste depois de um comentário da Dra. Muriel Bristol, que afirmou ser capaz de detectar se o chá ou o leite foi adicionado primeiro em sua xícara. Ele testou seu pedido no experimento “dama apreciadora de chá”, contado em diversos livros de história da estatística, inclusive num livro com esse mesmo título: “The Lady Tasting Tea” de David Salsburg (Salsburg2001?).

Fisher projetou um experimento em que a senhora recebia 8 xícaras de chá, 4 com leite primeiro, 4 com chá primeiro, em ordem aleatória. Ela então provou cada xícara e relatou quais quatro ela achava que tinham leite adicionado primeiro. Ela acertou todas as 8 chícaras.

A pergunta que Fisher fez foi: “como testamos se ela realmente é habilidosa nisso ou se está apenas adivinhando?”

Vamos construir uma tabela de contingência, com os valores VERDADEIROS nas colunas e as resultados nas linhas.

Code
tea_tasting <- data.frame(Leite_Primeiro  = c(4,0), 
                          Cha_Primeiro    = c(0,4), 
                          row.names = c("Respondeu que era Leite Primeiro", "Respondeu que era Chá Primeiro"))
tea_tasting
                                 Leite_Primeiro Cha_Primeiro
Respondeu que era Leite Primeiro              4            0
Respondeu que era Chá Primeiro                0            4

Para usar o teste de Fisher no R basta inserirmos a tabela de contingência como argumento da função fisher.test().

Entretanto, há mais um detalhe a ser analisado. Um dos parâmetros do teste é se ele é bicaudal ou unicaldal. O padrão é que o R realize um teste bicaudal (two.sided). Entretanto, Fisher testou se a senhora Muriel era melhor do que o acaso e não se sua habilidade era diferente do acaso e, portanto, ele usou um teste unilateral.

Para encontrarmos o mesmo resultado, precisamos ajustar esse argumento, inserindo alternative = "greater".

Code
fisher.test(tea_tasting, alternative = "greater")

    Fisher's Exact Test for Count Data

data:  tea_tasting
p-value = 0.01429
alternative hypothesis: true odds ratio is greater than 1
95 percent confidence interval:
 2.003768      Inf
sample estimates:
odds ratio 
       Inf 

É possível fazer o teste de Fisher diretamente com os dados de um data frame, sem necessidade de tabulação previa dos dados. Vamos usar novamente o data frame Arthritis, do pacote vcd.

Code
fisher.test(tab5)

    Fisher's Exact Test for Count Data

data:  tab5
p-value = 0.001393
alternative hypothesis: two.sided

References

Pagano, Marcello, Kimberlee Gauvreau, and Heather Mattie. 2022. Principles of Biostatistics. Book. CRC Press.