Sobre Implicit Association Tests (IAT) – Olhe o README do repositório.

IAT: 0.15, 0.35, and 0.65 are considered small, medium, and large levels of bias for individual scores. Positive means bias towards arts / against Math.

Exemplo de 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: 179
## Columns: 5
## $ session_id  <chr> "2421401", "2421408", "2421415", "2421419", "2421535", "24…
## $ referrer    <chr> "tamu", "tamu", "tamu", "tamu", "tamu", "tamu", "tamu", "t…
## $ sex         <ord> f, m, f, f, f, f, f, f, f, f, m, f, f, m, m, f, m, m, f, f…
## $ d_art       <dbl> 0.66404173, 0.28330852, 0.91158827, 0.40696666, 0.14532187…
## $ 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 per session.
## 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))
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.1841804

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.1841804
## $ bias      <dbl> 0.001572201
## $ std.error <dbl> 0.07049543
## $ conf.low  <dbl> -0.3295758
## $ conf.high <dbl> -0.05036369
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)

Atividade

Base de dados utilizada

Foi utilizada a base do laboratório TAMU (Texas A&M University), com N = 179 participantes (58 homens e 121 mulheres, após exclusão de casos indicados por iat_exclude).

Resultados e conclusões
desc = iat %>% 
    group_by(sex) %>% 
    summarise(media = mean(d_art), dp = sd(d_art), n = n())
desc

Em média, as mulheres tiveram uma associação implícita com a matemática negativa e media (média 0.42, desv. padrão 0.465, N = 121). Vale lembrar que valor positivo aqui significa viés a favor das artes e contra a matemática, e que 0.15, 0.35 e 0.65 são os limiares de fraco, médio e forte pra escore individual. Os homens também tiveram associação negativa, mas menor que a das mulheres (média 0.236, desv. padrão 0.452, N = 58), ficando até abaixo do limiar de viés fraco. Ou seja, deu uma diferença pequena pra moderada entre os grupos (diferença das médias m - f = -0.184, 95% CI [-0.330, -0.035] pelo bootstrap BCa). Com esses dados, dá pra estimar que as mulheres têm uma associação negativa com a matemática um pouco mais forte que a dos homens, com a diferença provavelmente ficando entre 0.03 e 0.33 ponto na escala do IAT. Isso é o suficiente pra dizer que a diferença existe e vai sempre na mesma direção (o IC não passa pelo zero em nenhum dos métodos testados mais abaixo), mas não dá pra chamar essa diferença de grande, é mais uma diferença modesta.

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

Comparação entre: (1) bootstrap via biblioteca (exemplo acima, método BCa) e (2) bootstrap implementado por mim, sem usar boot::boot/boot.ci, usando os métodos Percentil, Básico (pivotal) e Normal (corrigido por viés).

1. Bootstrap manual: reamostragem

Reamostramos com reposição o próprio conjunto de dados (mesmo tamanho \(n\) da amostra original) \(R\) vezes, e a cada repetição calculamos a diferença \(\hat\theta^* = \bar{d}_m^* - \bar{d}_f^*\).

set.seed(2026)

t0 <- desc %>% filter(sex == "m") %>% pull(media) -
      desc %>% filter(sex == "f") %>% pull(media)
t0
## [1] -0.1841804
um_bootstrap <- function(dados) {
    idx <- sample(seq_len(nrow(dados)), size = nrow(dados), replace = TRUE)
    boot_dados <- dados[idx, ]
    agrupado <- boot_dados %>% 
        group_by(sex) %>% 
        summarise(media = mean(d_art))
    m <- agrupado %>% filter(sex == "m") %>% pull(media)
    f <- agrupado %>% filter(sex == "f") %>% pull(media)
    m - f
}

R <- 2000
reps <- map_dbl(1:R, ~ um_bootstrap(iat))

t_estrela <- mean(reps)
se_estrela <- sd(reps)
bias <- t_estrela - t0

tibble(t0 = t0, t_estrela = t_estrela, bias = bias, se_estrela = se_estrela)
tibble(diff = reps) %>% 
    ggplot(aes(x = diff)) + 
    geom_histogram(binwidth = .02, fill = "darkgrey") + 
    geom_vline(xintercept = t0, color = "blue") + 
    geom_vline(xintercept = t_estrela, color = "darkgreen", linetype = "dashed") + 
    labs(x = "Diferença m - f (réplicas bootstrap)", y = "contagem",
         title = "Distribuição das réplicas bootstrap (linha azul = t0 amostral)")

A distribuição das réplicas parece bem simétrica e parecida com uma normal, e o viés (bias) deu bem pequeno perto de \(t_0\). Isso já é um sinal de que os métodos de IC devem dar valores parecidos entre si.

2. Método Percentil

\[\left(\theta_{(1-\alpha)/2},\ \theta_{1-(1-\alpha)/2}\right)\]

Toma diretamente os percentis 2.5% e 97.5% da distribuição bootstrap.

alpha <- 0.05

perc_lower <- quantile(reps, probs = alpha / 2)
perc_upper <- quantile(reps, probs = 1 - alpha / 2)

c(perc_lower, perc_upper)
##        2.5%       97.5% 
## -0.32760221 -0.03841514

3. Método Básico (pivotal)

\[\left(2t_0 - \theta_{1-(1-\alpha)/2},\ 2t_0 - \theta_{(1-\alpha)/2}\right)\]

Usa a distribuição da diferença entre a réplica e \(t_0\) (mais robusto que o percentil para distribuições com caudas atípicas).

basic_lower <- 2 * t0 - perc_upper
basic_upper <- 2 * t0 - perc_lower

c(basic_lower, basic_upper)
##       97.5%        2.5% 
## -0.32994576 -0.04075868

4. Método Normal (corrigido por viés)

\[t_0 - b \pm z_\alpha \cdot se^\star\]

Assume que a distribuição bootstrap é aproximadamente normal e corrige o intervalo de Wald pelo viés estimado.

z <- qnorm(1 - alpha / 2)

normal_lower <- (t0 - bias) - z * se_estrela
normal_upper <- (t0 - bias) + z * se_estrela

c(normal_lower, normal_upper)
## [1] -0.32798488 -0.03816219

Comparando os quatro métodos

comparacao <- tibble(
    metodo = c("BCa (biblioteca)", "Percentil (manual)", "Básico (manual)", "Normal (manual)"),
    lower = c(ci$conf.low, perc_lower, basic_lower, normal_lower),
    upper = c(ci$conf.high, perc_upper, basic_upper, normal_upper)
)
comparacao
comparacao %>% 
    ggplot(aes(x = fct_rev(metodo), ymin = lower, ymax = upper, y = (lower + upper) / 2)) + 
    geom_pointrange() + 
    geom_hline(yintercept = 0, linetype = "dashed", color = "red") + 
    coord_flip() + 
    labs(x = "", y = "Diferença IAT homens - mulheres (IC 95%)",
         title = "Comparação entre métodos de IC via bootstrap")

Discussão / justificativa da escolha dos métodos

Escolhi o Percentil por ser o mais simples de todos, é a base pros outros dois. O Básico (pivotal) eu peguei porque ele é mais robusto que o percentil quando a distribuição bootstrap tem cauda esquisita ou assimetria. E o Normal entrou pra ter uma comparação com a abordagem mais clássica (tipo Wald), já corrigindo pelo viés. Não fiz o BCa na mão porque ele precisa de um fator de aceleração calculado via jackknife, e isso ficou fora do escopo que eu consegui cobrir aqui. Por isso o BCa só aparece calculado pela biblioteca boot, como referência.

Na prática, os quatro métodos deram praticamente a mesma conclusão. Todos os ICs de 95% ficam inteiramente abaixo de zero, com os limites bem próximos uns dos outros (entre mais ou menos -0.33 e -0.04). Isso faz sentido, já que a distribuição bootstrap saiu bem simétrica e o viés foi baixo, que é justamente quando percentil, básico e normal costumam concordar. Teve uma diferença pequena de amplitude e de posição (o método Básico e o BCa puxaram o limite inferior um pouco mais pra baixo, sinal de uma leve assimetria que sobrou), mas isso não muda a conclusão principal: nessa amostra da TAMU, as mulheres têm uma associação implícita negativa com a matemática consistentemente mais forte que os homens, mesmo que a diferença seja de magnitude pequena pra moderada na escala do IAT.