1 Teste de Kruskal-Wallis

  • É um teste não-paramétrico que funciona como alternativa ao teste ANOVA de uma via (one-way).

  • Usamos o teste de Kruskal-Wallis quando as suposições da ANOVA não são satisfeitas.

1.1 Pré-requisitos

  • Carregar os seguintes pacotes:
library(tidyverse)
library(ggpubr)
library(rstatix)

1.2 Preparação dos dados

Vamos usar uma base de dados chamada FilmData, com as seguintes informações:

library(readxl)
FilmData <- read_excel("FilmData.xlsx")
glimpse(FilmData)
## Rows: 151
## Columns: 15
## $ Rank      <dbl> 1, 2, 4, 8, 9, 13, 15, 16, 17, 18, 20, 22, 23, 27, 28, 29, 3…
## $ Film      <chr> "Avatar", "Titanic", "Harry Potter and the Deathly Hallows P…
## $ Studio    <chr> "Fox", "Par.", "WB", "Sony", "WB", "Fox", "WB", "WB", "WB", …
## $ Genre     <chr> "Action/Adventure", "Drama", "Action/Adventure", "Action/Adv…
## $ Year      <dbl> 2009, 1997, 2011, 2012, 2012, 1999, 2012, 2008, 2001, 1993, …
## $ Gross     <dbl> 2782300000, 2185400000, 1341500000, 1108600000, 1084400000, …
## $ Gross.Dom <dbl> 760500000, 658700000, 381000000, 304400000, 448100000, 47450…
## $ Pct.Dom   <dbl> 0.273, 0.301, 0.284, 0.275, 0.413, 0.462, 0.298, 0.532, 0.32…
## $ Gross.Ovr <dbl> 2021800000, 1526700000, 960500000, 804200000, 636300000, 552…
## $ Pct.Ovr   <dbl> 0.727, 0.699, 0.716, 0.725, 0.587, 0.538, 0.702, 0.468, 0.67…
## $ Rotten    <dbl> 83, 88, 96, 92, 87, 57, 65, 94, 80, 92, 78, 79, 84, 87, 63, …
## $ IMDB      <dbl> 8.0, 7.6, 8.1, 7.8, 8.6, 6.5, 8.1, 9.0, 7.3, 8.0, 7.6, 7.4, …
## $ Rating    <chr> "PG13", "PG13", "PG13", "PG13", "PG13", "PG", "PG13", "PG13"…
## $ Days      <dbl> 238, 219, 133, 122, 147, 261, 133, 231, 162, 147, 140, 156, …
## $ Budget    <dbl> 237.0, 200.0, 125.0, 200.0, 250.0, 115.0, 180.0, 185.0, 125.…
dados <- FilmData
  • Queremos responder à seguinte pergunta:

O número de dias (Days) que os filmes passam em cartaz nos cinemas, é diferente para cada gênero (Genre) de filme?

1.3 Estatísticas de resumo

  • Comuns:
dados %>% 
  group_by(Genre) %>% 
  get_summary_stats(Days, type = "full")

1.4 Primeira Visualização

ggboxplot(dados, x = "Genre", y = "Days")

1.5 Computando o teste

  • Neste ponto, já sabemos que os dados não seguem a distribuição normal, e já podemos aplicar o teste de Kruskal-Wallis diretamente. Mesmo assim, vamos testar a normalidade:
dados %>% 
  group_by(Genre) %>% 
  shapiro_test(Days)
  • Filmes de Ação/Aventura e de Drama, não tem seus dias no cinema distribuídos normalmente, assim, aplicaremos o teste de Kruskal-Wallis.
dados %>% 
  kruskal_test(Days ~ Genre)
  • Como o p-valor é maior que 0.05 (p = 0.262), podemos dizer que não há evidências para afirmar que um certo gênero de filme passa mais dias no cinema em relação aos outros.

  • Caso a diferença fosse estatisticamente significativa, teríamos mais um passo na análise, que seria a comaparação dois a dois, chamada de teste post-hoc. O teste de Dunn com correção de Bonferroni é geralmente usado nestas comaprações dois a dois.

dados %>% 
  dunn_test(Days ~ Genre, p.adjust.method = "bonferroni")

1.5.1 Calculando o tamanho do efeito

  • O tamanho do efeito para o teste de Kruskal-Wallis é chamado de \(\eta^2[H]\), em que H é o valor obtido pelo teste de Kruskal-Wallis.

    • Interpretação dos calores comumentes publicados na literatura:

      • 0.01 - < 0.06 (efeito pequeno)

      • 0.06 - < 0.14 (efeito moderado)

      • >= 0.14 (efeito grande).

dados %>% 
  kruskal_effsize(Days ~ Genre)
  • A magnitude do efeito é pequena, isto é, a relação entre as duas variáveis não é forte. Este resultado está alinhado com o resultado do teste.

1.6 Reportando o resultado

Não foi encontrada diferença estatisticamente significativa para o número de dias no cinema segundo o gênero do filme (p = 0.262, \(\eta^2\) = 0.007 teste de Kruskal-Wallis). Filmes de ação e aventura apresentam uma mediana de 135 dias (IQR: 114, 158); filmes de animação apresentam uma mediana de 148 dias (IQR: 145, 174), filmes de comédia apresentam uma mediana de 135 dias (IQR: 113, 149), e filmes de drama apresentam uma mediana de 120 dias (IQR: 119, 143).

2 Teste de Friedman

  • O teste de Friedman é uma alternativa não paramétrica para o teste ANOVA de uma via com medidas repetidas.

  • O teste de Friedman é usado para verificar s ehá qualquer diferença estatisticmente significativa entre as distribuições de 3 ou mais grupos pareados.

  • É recomendado quando as susposições de normalidade do teste da ANOVA de medidas reperitdas não são satisfeitas ou quandoa variável dependente é medida numa escala ordinal.

2.1 Pré-requisitos

library(datarium)
library(tidyverse)
library(ggpubr)
library(rstatix)

2.2 Preparação dos dados

library(readr)
RoundingTimes <- read_csv("RoundingTimes.csv")

df <- RoundingTimes
  • Criando a variável id:
df <- df %>% 
  mutate(id = 1:22)

glimpse(df)
## Rows: 22
## Columns: 4
## $ Round.Out    <dbl> 5.40, 5.85, 5.20, 5.55, 5.90, 5.45, 5.40, 5.45, 5.25, 5.8…
## $ Narrow.Angle <dbl> 5.50, 5.70, 5.60, 5.50, 5.85, 5.55, 5.40, 5.50, 5.15, 5.8…
## $ Wide.Angle   <dbl> 5.55, 5.75, 5.50, 5.40, 5.70, 5.60, 5.35, 5.35, 5.00, 5.7…
## $ id           <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17…
  • A base de dados contém a comapração de 3 métodos de rebatidas no baseball (“round out”, “narrow angle”, “wide angle”) para a primeira base. Para cada um dos 22 jogadores é registrado o tempo médio de duas corridas de um ponto na primeira linha de base a 35 pés da placa base até um ponto de 15 pés da segunda base.

  • Transformando para o formato longo:

df2 <- df %>% 
  gather(key = "tipo_rebatida", value = "tempo", Round.Out , Narrow.Angle, Wide.Angle) %>% 
  convert_as_factor(id, tipo_rebatida)

glimpse(df2)
## Rows: 66
## Columns: 3
## $ id            <fct> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1…
## $ tipo_rebatida <fct> Round.Out, Round.Out, Round.Out, Round.Out, Round.Out, R…
## $ tempo         <dbl> 5.40, 5.85, 5.20, 5.55, 5.90, 5.45, 5.40, 5.45, 5.25, 5.…
head(df2)

2.3 Estatísticas de resumo

estatisticas_resumo <- df2 %>% 
  group_by(tipo_rebatida) %>% 
  get_summary_stats(tempo, type = "full")
estatisticas_resumo

2.4 Visualização

df2 %>% 
  ggboxplot(x = "tipo_rebatida", y = "tempo", add = "jitter", bxp.errorbar = TRUE)

2.5 Computando o teste

df2 %>% 
  group_by(tipo_rebatida) %>% 
  shapiro_test(tempo)
resposta_friedman <- df2 %>% 
  friedman_test(tempo ~ tipo_rebatida | id)
resposta_friedman

O tempo de corrida dos jogadores foi estatisticamente diferente para cada tipo de rebatida (p = 0.004).

2.6 Tamanho do efeito

  • O tamanho do efeito para o teste de Friedman é chamdo W de Kendall.

  • O W de Kendall assume valores de 0 (indicando que não há relação) até 1 (indicando uma relação perfeita)

  • Valores:

    • 0.1 - < 0.3: Efeito pequeno

    • 0.3 - < 0.5: Efeito moderado

    • >= 0.5: Efeito grande

df2 %>% 
  friedman_effsize(tempo ~ tipo_rebatida | id)

O tamanho do efeito é pequeno, W = 0.253.

2.7 Comparações múltiplas

  • O teste de Friedman identificou diferença significativa entre os grupos.

  • Agora, devemos fazer comparações dois a dois usando o teste de postos de Wilcoxon para identificar que grupos são diferentes:

teste_post_hoc <- df2 %>% 
  wilcox_test(tempo ~ tipo_rebatida, paired = TRUE, p.adjust.method = "bonferroni")

teste_post_hoc

Os tipos de rebatida Narrow.Angle e Round.Out são os únicos que não apresentam diferença significativa nos tempos entre si.

2.8 Reportando o resultado

  • Gráfico final
teste_post_hoc <- teste_post_hoc %>% 
  add_xy_position(x = "tipo_rebatida")

teste_post_hoc$y.position <- c(7, 6.6, 6.5)

ggboxplot(df2, x = "tipo_rebatida", 
          y = "tempo", 
          add = "jitter",
          bxp.errorbar = TRUE) +
stat_pvalue_manual(teste_post_hoc, hide.ns = TRUE) +
labs(
subtitle = get_test_label(resposta_friedman, type = "expression", detailed = TRUE),
caption = get_pwc_label(teste_post_hoc, type = "expression"),
x = "Tipo de rebatida", y = "Tempo (s)"
)

O tempo de corrida foi estatisticamente diferente para os tipos de rebatida (Teste de Friedman, \(\chi^2(2) = 18.2\), p = 0.004). Nas comparações dois a dois o tempo de corrida foi estatisticamente diferente para as rebatidas Narrow Angle e Wide Angle (p = 0.006), e entre Round Out e Wide Angle (p = 0.044). O tempo mediano de corrida para a rebatida Narrow Angle foi de 5.52 segundos (IQR: 5.46, 5.6); para Round Out, este tempo foi de 5.5 segundos (IQR: 5.46, 5.6) e para Wide Angle, o tempo mediano foi de 5.45 segundos (IQR: 5.35, 5.55), sendo o menor tempo mediano registrado.