Sobre Implicit Association Tests (IAT)

IAT: 0.15, 0.35, and 0.65 are considered small, medium, and large level of bias for individual scores.

Positive means bias towards arts / against Math.

Análise de uma replicação

iat = read_csv(here::here(params$arquivo_dados), col_types = "cccdc")
iat = iat %>% 
    mutate(sex = factor(sex, levels = c("m", "f"), ordered = TRUE))
glimpse(iat)
## Rows: 155
## Columns: 5
## $ session_id  <chr> "2436706", "2436967", "2440429", "2440430", "2440431", "24…
## $ referrer    <chr> "sdsu", "sdsu", "sdsu", "sdsu", "sdsu", "sdsu", "sdsu", "s…
## $ sex         <ord> f, f, f, f, m, f, f, m, f, m, f, f, f, f, f, f, m, m, f, m…
## $ d_art       <dbl> 0.90444320, -0.47402625, 0.46840862, -0.02522412, 0.136813…
## $ iat_exclude <chr> "Include", "Include", "Include", "Include", "Include", "In…
iat %>%
    ggplot(aes(x = d_art, fill = sex, color = sex)) +
    geom_histogram(binwidth = .2, alpha = .4) +
    geom_rug() +
    facet_grid(sex ~ ., scales = "free_y") + 
    theme(legend.position = "None")

iat %>% 
    ggplot(aes(x = sex, y = d_art)) + 
    geom_quasirandom(width = .1)

iat %>% 
    ggplot(aes(x = sex, y = d_art)) + 
    geom_quasirandom(width = .1) + 
    stat_summary(geom = "point", fun.y = "mean", color = "red", size = 5)
## Warning: The `fun.y` argument of `stat_summary()` is deprecated as of ggplot2 3.3.0.
## ℹ Please use the `fun` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Qual a diferença na amostra
iat %>%
    group_by(sex) %>%
    summarise(media = mean(d_art), `Desvio Padrão` = sd(d_art), N = n())
## # A tibble: 2 × 4
##   sex   media `Desvio Padrão`     N
##   <ord> <dbl>           <dbl> <int>
## 1 m     0.224           0.485    38
## 2 f     0.467           0.548   117
agrupado = iat %>% 
        group_by(sex) %>% 
        summarise(media = mean(d_art))
    m = agrupado %>% filter(sex == "m") %>% pull(media)
    f = agrupado %>% filter(sex == "f") %>% pull(media)
m - f
## [1] -0.2430539

Comparação via ICs

library(boot)

theta <- function(d, i) {
    agrupado = d %>% 
        slice(i) %>% 
        group_by(sex) %>% 
        summarise(media = mean(d_art))
    m = agrupado %>% filter(sex == "m") %>% pull(media)
    f = agrupado %>% filter(sex == "f") %>% pull(media)
    m - f
}

booted <- boot(data = iat, 
               statistic = theta, 
               R = 2000)

ci = tidy(booted, 
          conf.level = .95,
          conf.method = "bca",
          conf.int = TRUE)

glimpse(ci)
## Rows: 1
## Columns: 5
## $ statistic <dbl> -0.2430539
## $ bias      <dbl> -0.001386363
## $ std.error <dbl> 0.09508192
## $ conf.low  <dbl> -0.4431532
## $ conf.high <dbl> -0.06070472
ci %>%
    ggplot(aes(
        x = "",
        y = statistic,
        ymin = conf.low,
        ymax = conf.high
    )) +
    geom_pointrange() +
    geom_point(size = 3) + 
    labs(x = "Diferença", 
         y = "IAT homens - mulheres")

p1 = iat %>% 
    ggplot(aes(x = sex, y = d_art)) +
    geom_quasirandom(width = .1) + 
    stat_summary(geom = "point", fun.y = "mean", color = "red", size = 5)

p2 = ci %>%
    ggplot(aes(
        x = "",
        y = statistic,
        ymin = conf.low,
        ymax = conf.high
    )) +
    geom_pointrange() +
    geom_point(size = 3) + 
    ylim(-1, 1) + 
    labs(x = "Diferença", 
         y = "IAT homens - mulheres")

grid.arrange(p1, p2, ncol = 2)

Conclusão

Em média, as mulheres que participaram do experimento tiveram uma associação implícita (medida pelo IAT) com a matemática negativa e média (média = 0.4666898, desvio padrão = 0.5475448, N = 117). Homens tiveram uma associação negativa com a matemática, portanto menor que a das mulheres (média = 0.2236359, desvio padrão = 0.4850899, N = 38). Houve portanto uma considerável diferença entre homens e mulheres (diferença das médias -0.2430539, 95% CI [-0.4173037, -0.05494632]). A partir desta amostra, estimamos que:

  • Mulheres têm uma associação positiva mais forte, entretanto, não é claro se essa diferença é grande, moderada ou pequena. É necessário coletar mais dados para determinar se a diferença é relevante ou negligenciável.

Além disso, é importante observar que os resultados são baseados em uma amostra específica e que coletar mais dados poderia ajudar a confirmar ou refutar essa estimativa.

Realize novas análises sobre IAT usando as abordagens a seguir

Realize a análise e compare as conclusões obtidas nos dois casos experimentados:

1. Bootstraps a partir de uma bibliotece (exemplo acima)

Aplicar Bootstrap

library(ggplot2)
library(boot)

# Função para calcular a diferença das médias entre duas amostras
diferenca_medias <- function(data, indices) {
  x <- data[indices, "d_art"][data[indices, "sex"] == "f"]
  y <- data[indices, "d_art"][data[indices, "sex"] == "m"]
  mean(x) - mean(y)
}

# Amostras
amostra_f <- iat %>% filter(sex == "f")
amostra_m <- iat %>% filter(sex == "m")

# Número de iterações bootstrap
num_iterations <- 4000

# Realiza o bootstrap
iat <- na.omit(iat)
boot_resultados <- boot(data = iat, statistic = diferenca_medias, R = num_iterations)

# Cálculo dos limites do intervalo de confiança
intervalo_confianca <- boot.ci(boot_resultados, type = "bca")

# Obtém os limites inferiores e superiores do intervalo de confiança
limite_inferior <- intervalo_confianca$bca[4]
limite_superior <- intervalo_confianca$bca[5]

# Converter os resultados do bootstrap para um data frame
bootstrap_resultados <- data.frame(Diferenca.das.Medias = boot_resultados$t)

intervalo_confianca
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 4000 bootstrap replicates
## 
## CALL : 
## boot.ci(boot.out = boot_resultados, type = "bca")
## 
## Intervals : 
## Level       BCa          
## 95%   ( 0.0665,  0.4313 )  
## Calculations and Intervals on Original Scale
# Gerar o histograma utilizando ggplot2
ggplot(bootstrap_resultados, aes(x = Diferenca.das.Medias)) +
  geom_histogram(binwidth = 0.01, fill = "lightblue", color = "black") +
  geom_vline(xintercept = limite_inferior, linetype = "dashed", color = "red", size = 0.5) +
  geom_vline(xintercept = limite_superior, linetype = "dashed", color = "red", size = 0.5) +
  labs(title = "Distribuição das Diferenças das Médias",
       x = "Diferença das Médias",
       y = "Frequência de reamostragens") +
  theme(plot.title = element_text(hjust = 0.5)) +
  scale_x_continuous(breaks = seq(0, 0.5, by = 0.1),
                     labels = seq(0, 0.5, by = 0.1))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Com base nesses resultados:

  • A diferença média entre as amostras de sexo feminino e masculino é estimada como a média das diferenças obtidas nas reamostragens bootstrap.
  • O intervalo de confiança calculado indica uma faixa plausível para a diferença média real entre as duas populações. Os valores fora desse intervalo podem ser considerados estatisticamente significativos.
  • O histograma mostra a distribuição das diferenças das médias nas reamostragens bootstrap, permitindo visualizar a variabilidade dessas diferenças e identificar tendências ou padrões.

2. Bootstraps implementados por você (justifique o método de IC com bootstraps escolhido)

Para comparar a diferença entre as médias das duas amostras (mulheres e homens), utilizaremos o Intervalo de Confiança para a Diferença com método BCA. Eu escolhi o método de intervalo de confiança com bootstraps para a diferença das médias utilizando a técnica de correção de viés e aceleração (BCa), devido à sua robustez e flexibilidade. Optei por esse método porque os dados não seguem uma distribuição específica, e o BCa não faz suposições sobre a distribuição subjacente. Além disso, a correção de viés e a incorporação da aceleração no BCa permitem obter estimativas mais precisas da diferença das médias, levando em conta a assimetria e reduzindo o impacto de outliers. Portanto, o método BCa é a escolha adequada para estimar o intervalo de confiança da diferença das médias,

2. Aplicar bootstrap manualmente

# Função para calcular o intervalo de confiança para a diferença das médias usando o método BCa manualmente
intervalo_diferenca_medias_bca_manual <- function(x, y, nivel_confianca = 0.95) {
  diff_medias <- mean(x) - mean(y)
  
  # Estatísticas bootstrap
  num_iterations <- 4000
  mean_diff_boot <- numeric(num_iterations)
  
  for (i in 1:num_iterations) {
    bootstrap_sample_f <- sample(x, replace = TRUE)
    bootstrap_sample_m <- sample(y, replace = TRUE)
    mean_diff_boot[i] <- mean(bootstrap_sample_f) - mean(bootstrap_sample_m)
  }
  
  # Estatística bootstrap original
  orig_stat <- diff_medias
  
  # Estimativa do viés
  bias_est <- mean(mean_diff_boot) - orig_stat
  
  # Aceleração
  acceleration <- sum((mean_diff_boot - mean(mean_diff_boot))^3) / (6 * sum((mean_diff_boot - mean(mean_diff_boot))^2)^(3/2))
  
  # Parâmetro de aceleração ajustado
  accel_adjust <- 1 / (1 + acceleration * bias_est)
  
  # Limites do intervalo de confiança ajustados
  quantile_alpha <- quantile(mean_diff_boot, c((1 - nivel_confianca) / 2, (1 + nivel_confianca) / 2))
  
  limite_inferior <- 2 * orig_stat - quantile_alpha[2]
  limite_superior <- 2 * orig_stat - quantile_alpha[1]
  
  return(list(diferenca_medias = diff_medias, limite_inferior = limite_inferior, limite_superior = limite_superior, nivel_confianca = nivel_confianca, bootstrap_sample = mean_diff_boot))
}

# Cálculo do intervalo de confiança para a diferença das médias usando o método BCa manualmente
resultado_bca_manual <- intervalo_diferenca_medias_bca_manual(amostra_f$d_art, amostra_m$d_art)

# Exibir os resultados
cat("Diferença das médias:", resultado_bca_manual$diferenca_medias, "\n")
## Diferença das médias: 0.2430539
cat("Intervalo de Confiança BCa (", 100 * resultado_bca_manual$nivel_confianca, "%): [", resultado_bca_manual$limite_inferior, ",", resultado_bca_manual$limite_superior, "]\n")
## Intervalo de Confiança BCa ( 95 %): [ 0.06052342 , 0.4183544 ]
# Criação do data frame com os resultados do bootstrap
bootstrap_df <- data.frame("Diferenca.das.Medias" = resultado_bca_manual$bootstrap_sample)
# Gerar o histograma utilizando ggplot2 e incluir o intervalo de confiança
ggplot(bootstrap_df, aes(x = Diferenca.das.Medias)) +
  geom_histogram(binwidth = 0.01, fill = "lightblue", color = "black") +
  geom_vline(xintercept = resultado_bca_manual$limite_inferior, linetype = "dashed", color = "red", size = 0.5) +
  geom_vline(xintercept = resultado_bca_manual$limite_superior, linetype = "dashed", color = "red", size = 0.5) +
  labs(title = "Distribuição das Diferenças das Médias (BCa)",
       x = "Diferença das Médias",
       y = "Frequência de reamostragens") +
  theme(plot.title = element_text(hjust = 0.5)) +
  scale_x_continuous(breaks = seq(0, 0.5, by = 0.1),
                     labels = seq(0, 0.5, by = 0.1))

Ao aplicar o bootstrap, podemos estimar de que as duas amostras tendem a apresentar médias próximas. A distribuição dos erros amostrais obtida por meio do bootstrap mostra que a maioria das diferenças das médias está concentrada em torno de um valor central, indicando uma menor variação. Isso sugere que a diferença entre as médias das duas amostras é consistente e não se desvia significativamente do valor central observado.