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: 113
## Columns: 5
## $ session_id  <chr> "2401243", "2401244", "2401246", "2401249", "2401250", "24…
## $ referrer    <chr> "brasilia", "brasilia", "brasilia", "brasilia", "brasilia"…
## $ sex         <ord> m, m, f, f, f, m, f, m, m, f, f, f, f, f, m, m, f, m, f, m…
## $ d_art       <dbl> 0.1480913, 0.6285349, 0.4977736, 0.3999447, 0.8314632, 1.1…
## $ 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")

RESPOSTA:

Distribuição para sex = “m”:

Distribuição para sex = “f”:

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

RESPOSTA:

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.

RESPOSTAS:

Qual a diferença na amostra
iat %>% 
    group_by(sex) %>% 
    summarise(media = mean(d_art))
## # A tibble: 2 × 2
##   sex   media
##   <ord> <dbl>
## 1 m     0.400
## 2 f     0.570

RESPOSTAS:

  • Os dados indicam que, em média, a variável d_art tem valores maiores para o grupo feminino (f) comparado ao grupo masculino (m).

  • Esta diferença é quantificada pelas médias 0.5703113 (feminino) e 0.3997566 (masculino).

iat_custom <- iat %>% 
    group_by(sex) %>% 
    summarise(media = mean(d_art), desvio = sd(d_art), N = n());

iat_custom
## # A tibble: 2 × 4
##   sex   media desvio     N
##   <ord> <dbl>  <dbl> <int>
## 1 m     0.400  0.516    48
## 2 f     0.570  0.423    65

RESPOSTAS:

MASCULINO - A média dos valores de d_art para os homens é aproximadamente 0.399.

  • O desvio padrão dos valores de d_art para os homens é aproximadamente 0.516, indicando a variabilidade dos dados em torno da média.

  • Há 48 observações (indivíduos) no grupo masculino.

FEMININO - A média dos valores de d_art para as mulheres é aproximadamente 0.570.

  • O desvio padrão dos valores de d_art para as mulheres é aproximadamente 0.422, indicando a variabilidade dos dados em torno da média.

  • Há 65 observações (indivíduos) no grupo feminino.

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.1705546

RESPOSTAS:

  • A diferença calculada é negativa (-0.1705546), o que indica que a média de d_art para o grupo masculino é menor do que a média de d_art para o grupo feminino.

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.1705546
## $ bias      <dbl> -0.0008454712
## $ std.error <dbl> 0.09257269
## $ conf.low  <dbl> -0.3527367
## $ conf.high <dbl> 0.01162218

RESPOSTAS:

  • O intervalo de confiança de 95% para a diferença de médias entre os sexos “m” e “f” vai de -0.3497 a 0.0133. Como este intervalo inclui 0, não temos evidências suficientes para afirmar que há uma diferença significativa entre os grupos com base neste nível de confiança.
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")

RESPOSTAS:

  • O gráfico mostra que a diferença média estimada do IAT entre homens e mulheres é de aproximadamente -0.171, mas devido ao intervalo de confiança amplo que inclui zero, não podemos afirmar com segurança que essa diferença seja estatisticamente significativa. Este resultado sugere que, apesar da diferença observada, pode não haver uma diferença real na população, e a variação observada pode ser devida ao acaso.
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)

RESPOSTAS:

  • Os dois gráficos juntos fornecem uma visão abrangente: a distribuição dos dados por sexo e a comparação estatística da diferença de médias, mostrando que, apesar da diferença observada nas médias, não há evidências estatísticas suficientes para afirmar que há uma diferença significativa na população.

Conclusão

Preencha os resultados e conclusões abaixo

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.570 desv. padrão = 0.422, N = 65).

Homens tiveram uma associação negativa com a matemática, portanto menor que a das mulheres (média 0.399, des. padrão 0.516, N = 48).

Houve portanto uma pequena diferença entre homens e mulheres (diferença das médias -0,17, 95% CI [-0.347, 0.014]).

  • A partir desta amostra, estimamos que pode não haver uma diferença entre sexos, ou se ela existir, ela provavelmente é pequena em qualquer das direções.

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 biblioteca (exemplo acima):

Intervalo de confiança (IC) da média de IAT, na amostra de homens em Brasília. Será calculado separadamente o IC do homem e da mulher.A biblioteca utilizada é a boot.

library(boot)

#Definindo a função theta_homens
theta_homens = function(d, i) { #Define uma função que recebe dois argumentos, d (o data frame) e i (índices para as amostras bootstrap).
    homens = iat %>%            
        filter(sex == "m") %>%   # Filtra o data frame iat para incluir apenas as observações do sexo masculino.
        slice(i) %>%             # Seleciona as linhas do data frame filtrado de acordo com os índices i, que são gerados durante o procedimento bootstrap.
        summarise(media_homens = mean(d_art))   #Calcula a média da variável d_art para os homens.
    homens %>% pull(media_homens)    # Extrai a média calculada como um valor único.           
}

homens_booted <- boot(data = iat, 
                      statistic = theta_homens, 
                      R = 2000)

homens_ci = tidy(homens_booted, 
          conf.level = .95,
          conf.method = "bca", #método bca (Bias-Corrected and Accelerated) para calcular os intervalos de confiança.
          conf.int = TRUE)

homens_ci = cbind(homens_ci, sex = "m", desvio_padrao = (homens_ci$conf.high-homens_ci$conf.low)/2)
glimpse(homens_ci)
## Rows: 1
## Columns: 7
## $ statistic     <dbl> 0.3997566
## $ bias          <dbl> 0.003856136
## $ std.error     <dbl> 0.07585161
## $ conf.low      <dbl> 0.239266
## $ conf.high     <dbl> 0.5409586
## $ sex           <chr> "m"
## $ desvio_padrao <dbl> 0.1508463

Intervalo de confiança (IC) da média de IAT, na amostra de mulheres em Brasília:

library(boot)

theta_mulheres = function(d, i) {
    mulheres = iat %>%
        filter(sex == "f") %>%
        slice(i) %>%
        summarise(media_mulheres = mean(d_art))
    mulheres %>% pull(media_mulheres)
}

mulheres_booted <- boot(data = iat, 
                      statistic = theta_mulheres, 
                      R = 2000)

mulheres_ci = tidy(mulheres_booted, 
          conf.level = .95,
          conf.method = "bca",
          conf.int = TRUE)

mulheres_ci = cbind(mulheres_ci, sex = "f", desvio_padrao = (mulheres_ci$conf.high-mulheres_ci$conf.low)/2)
glimpse(mulheres_ci)
## Rows: 1
## Columns: 7
## $ statistic     <dbl> 0.5703113
## $ bias          <dbl> -0.0005952318
## $ std.error     <dbl> 0.05202349
## $ conf.low      <dbl> 0.4626931
## $ conf.high     <dbl> 0.6663161
## $ sex           <chr> "f"
## $ desvio_padrao <dbl> 0.1018115

Comparação do IC da média de IAT, entre as amostras calculadas acima de homens e mulheres em Brasilia:

library(boot)

#Criação do dataframe mf_cis
mf_cis = rbind(homens_ci, mulheres_ci)

#Criação do Gráfico com ggplot2
mf_cis %>% 
    ggplot(aes(x = sex, ymin = conf.low, y = statistic, ymax = conf.high)) +
    geom_linerange(linewidth=2) +
    geom_point(color="red", size = 5) +
    geom_hline(yintercept = c(0.15, 0.35, 0.65), linetype = "dashed", color = "darkgreen")

RESPOSTA:

  • As mulheres, em média, têm uma associação implícita (medida pelo IAT) com a matemática mais negativa do que os homens.

  • No entanto, os intervalos de confiança para as médias de d_art se sobrepõem, indicando que a diferença observada pode não ser estatisticamente significativa. Isso significa que não há evidência suficiente para afirmar que as médias de d_art são realmente diferentes entre homens e mulheres com um alto nível de confiança.


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

O método utilizado foi o bootstrap percentil. Este método envolve a criação de várias sub-amostras (no caso, 2000) a partir dos dados originais através de reamostragem com reposição. A partir dessas sub-amostras, foram calculadas as médias para homens e mulheres. As distribuições dessas médias bootstrap foram então usadas para determinar os percentis (2,5% e 97,5%) que definem os limites do intervalo de confiança. Este método é robusto porque não assume uma distribuição específica para os dados e oferece uma estimativa precisa dos intervalos de confiança com base nas propriedades empíricas das amostras reamostradas.

Definir a função theta para calcular a média de uma amostra, agrupada pelo sexo femino e masculino.

# Definição da funcao
funcao_theta = function(df) {

# agrupamento e calculo da media
    agrupado = df %>%
        group_by(sex) %>% 
        summarise(media = mean(d_art))
}

Cálculo da média da amostra de homens e mulheres, utilizando a função theta, agrupada pelo sexo:

# Chamada da funcao
THETA = funcao_theta(iat)

# Filtro para sex masculino
THETA_M = (THETA %>% filter(sex == "m") %>% pull(media))

# Filtro para sex feminino
THETA_F = (THETA %>% filter(sex == "f") %>% pull(media))

# Média geral da amostra
THETA 
## # A tibble: 2 × 2
##   sex   media
##   <ord> <dbl>
## 1 m     0.400
## 2 f     0.570

RESPOSTAS:

  • Essas médias indicam que, em média, o valor de interesse é menor para homens do que para mulheres no conjunto de dados analisado.

Definir a função para gerar uma amostra bootstrap da média, agrupada por sexo:

# Função my_bootstrap
my_bootstrap <- function(df){
    
# Filtragem dos dados por sexo
  dados_m = df %>% filter(sex == "m") %>% pull(d_art)
  dados_f = df %>% filter(sex == "f") %>% pull(d_art)

# Geração de amostras bootstrap
  boot_m <- sample(dados_m,size = NROW(dados_m),replace = T)
  boot_f <- sample(dados_f, size = NROW(dados_f), replace = T)

# Cálculo das médias das amostras bootstrap
  return(c(media_m = mean(boot_m), media_f = mean(boot_f)))
}

RESPOSTAS:

  • A função my_bootstrap serve para gerar amostras bootstrap das médias de homens e mulheres a partir de um conjunto de dados original. Esse processo permite calcular intervalos de confiança e avaliar a variabilidade das estimativas das médias de forma robusta, usando a técnica de bootstrap.

Criar 2000 sub-amostras da media, com bootstrap, agrupada pelo sexo:

# Geração das amostras bootstrap
set.seed(12345)

# Geração de múltiplas amostras bootstrap
amostras <- replicate(2000, my_bootstrap(iat), simplify = FALSE)

# Combinação dos resultados
amostras <- do.call(rbind, amostras)
amostras <- as.data.frame(amostras)

# Visualização da distribuição das amostras bootstrap:
hist_m <- amostras %>%
  ggplot(aes(x = media_m)) +
  geom_histogram(binwidth = .01,
                 colour = "black",
                 fill = "blue") + 
  labs(title = "Distribuição bootstraps (Homens)")

hist_f <- amostras %>%
  ggplot(aes(x = media_f)) +
  geom_histogram(binwidth = .01,
                 colour = "black",
                 fill = "yellow") + 
  labs(title = "Distribuição bootstraps (Mulheres)")

grid.arrange(hist_m, hist_f, ncol = 2)

RESPOSTA:

  • A distribuição das médias para os homens é aproximadamente simétrica, com a maioria das médias concentradas em torno de 0,4. Há uma dispersão menor em direção aos extremos, com algumas médias próximas de 0,2 e outras próximas de 0,6.

  • A distribuição das médias para as mulheres também é aproximadamente simétrica, mas centrada em torno de 0,55. Há uma dispersão menor nas extremidades, com algumas médias próximas de 0,4 e outras próximas de 0,7.

  • As distribuições indicam que, em média, as mulheres em Brasília têm uma associação implícita com a matemática mais alta (em torno de 0,55) em comparação aos homens (em torno de 0,4).

Criar amostras de diferenças de médias entre homens e mulheres:

# Visualização da distribuição dos erros amostrais:
hist_erro_m <- amostras %>%
  ggplot(aes(x = media_m - THETA_M)) +
  geom_histogram(binwidth = .01,
                 colour = "black",
                 fill = "blue") + 
  labs(title = "Distribuição Erro Amostral (Homens)", x = "Diferença de Médias (M - THETA_M)")

hist_erro_f <- amostras %>%
  ggplot(aes(x = media_f - THETA_F)) +
  geom_histogram(binwidth = .01,
                 colour = "black",
                 fill = "yellow") + 
  labs(title = "Distribuição Erro Amostral (Mulheres)", x = "Diferença de Médias (F - THETA_F)")

grid.arrange(hist_erro_m, hist_erro_f, ncol = 2)

RESPOSTA:

  • Calcular o Intervalo de Confiança (IC) para homens e mulheres, com C = 95% e, consequentemente, os limites inferior e superior da margem de erro (quantis: 2.5 (-) e 97.5 (+)).

  • Estamos investigando a associação implícita com a matemática entre mulheres e homens em Brasília, medida pelo IAT. No item 1, utilizamos o método BCA para bootstrap com um intervalo de confiança de 95%. Agora, vamos reproduzir os resultados utilizando nosso próprio método (my_bootstrap), mantendo o mesmo intervalo de confiança, para verificar se há alguma mudança significativa em nossas conclusões.

Cálculo do intervalo de confiança bootstrap percentis para as médias de homens e mulheres:

# Cálculo dos intervalos de confiança bootstrap
intervalo_m = amostras %>% 
  mutate(erro_m = media_m - THETA_M) %>% 
  summarise(erro_m_i = quantile(erro_m, .025), 
            erro_m_s = quantile(erro_m, .975)) %>%
  mutate(valor_m_i = THETA_M + erro_m_i, 
         valor_m_s = THETA_M + erro_m_s) %>%
  mutate(desvio_padrao_m = (valor_m_s-valor_m_i)/2)

intervalo_f = amostras %>% 
  mutate(erro_f = media_f - THETA_F) %>% 
  summarise(erro_f_i = quantile(erro_f, .025), 
            erro_f_s = quantile(erro_f, .975)) %>%
  mutate(valor_f_i = THETA_F + erro_f_i, 
         valor_f_s = THETA_F + erro_f_s) %>%
  mutate(desvio_padrao_f = (valor_f_s-valor_f_i)/2)

# Construção dos gráficos
hist_comp_m <- hist_m +
    geom_vline(xintercept = c(intervalo_m$valor_m_i), linetype = "dashed", color = "darkorange") +
    geom_vline(xintercept = c(THETA_M), size=2, color = "red") +
    geom_vline(xintercept = c(intervalo_m$valor_m_s), linetype = "dashed", color = "darkgreen")
## 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.
hist_comp_f <-hist_f +
    geom_vline(xintercept = c(intervalo_f$valor_f_i), linetype = "dashed", color = "darkorange") +
    geom_vline(xintercept = c(THETA_F), size=2, color = "red") +
    geom_vline(xintercept = c(intervalo_f$valor_f_s), linetype = "dashed", color = "darkgreen")

grid.arrange(hist_comp_m, hist_comp_f, ncol = 2)

RESPOSTA:

o método de intervalo de confiança com bootstrap, especificamente o percentil bootstrap. O processo envolve:

  • Geração de múltiplas amostras bootstrap a partir dos dados originais.

  • Cálculo das médias bootstrap.

  • Cálculo dos erros amostrais em relação ao valor verdadeiro (THETA_M e THETA_F).

  • Determinação dos quantis 2.5% e 97.5% dos erros amostrais para construir os intervalos de confiança.

  • Este método é robusto e amplamente utilizado para estimar intervalos de confiança quando a distribuição da estatística de interesse é desconhecida ou complexa.

# Criação do dataframe masculino 
intervalo_m_mycis = data.frame(sex = "m", statistic=THETA_M, conf.low=intervalo_m$valor_m_i, conf.high=intervalo_m$valor_m_s)

# Criação do dataframe feminino
intervalo_f_mycis = data.frame(sex = "f", statistic=THETA_F, conf.low=intervalo_f$valor_f_i, conf.high=intervalo_f$valor_f_s)

# Unindo os dataframes dos dois sexos
my_mf_cis = rbind(intervalo_m_mycis, intervalo_f_mycis)

glimpse(my_mf_cis)
## Rows: 2
## Columns: 4
## $ sex       <chr> "m", "f"
## $ statistic <dbl> 0.3997566, 0.5703113
## $ conf.low  <dbl> 0.2521724, 0.4687708
## $ conf.high <dbl> 0.5447155, 0.6709123
my_mf_cis %>% 
    ggplot(aes(x = sex, ymin = conf.low, y = statistic, ymax = conf.high)) +
    geom_linerange(linewidth=2) +
    geom_point(color="red", size = 5) +
    geom_hline(yintercept = c(0.15, 0.35, 0.65), linetype = "dashed", color = "darkgreen")

Realizando a própria função bootstrap para calcular a diferença das médias:

# Diferença da média da amostra
THETA_DIF_MF = THETA_M - THETA_F

# Função bootstrap
my_dif_bootstrap <- function(df){
  dados_m = df %>% filter(sex == "m") %>% pull(d_art)
  dados_f = df %>% filter(sex == "f") %>% pull(d_art)
  boot_m <- sample(dados_m,
                   size = NROW(dados_m),
                   replace = T)
  boot_f <- sample(dados_f,
                   size = NROW(dados_f),
                   replace = T)
  return(mean(boot_m) - mean(boot_f))
}

# Criação de 2000 sub-amostras
set.seed(54321)
amostras_dif = tibble(i = 1:2000) %>% 
  mutate(media_dif = map_dbl(i, ~ my_dif_bootstrap(iat)))

intervalo_dif = amostras_dif %>% 
  mutate(erro_dif = media_dif - THETA_DIF_MF) %>% 
  summarise(erro_dif_i = quantile(erro_dif, .025), 
            erro_dif_s = quantile(erro_dif, .975)) %>%
  mutate(valor_dif_i = THETA_DIF_MF + erro_dif_i, 
         valor_dif_s = THETA_DIF_MF + erro_dif_s) %>%
  mutate(desvio_padrao_dif = (valor_dif_s-valor_dif_i)/2)

# IC 95%
intervalo_dif_mycis = data.frame(statistic=THETA_DIF_MF, conf.low=intervalo_dif$valor_dif_i, conf.high=intervalo_dif$valor_dif_s, desvio.padrao = intervalo_dif$desvio_padrao_dif)
intervalo_dif_mycis %>% 
    ggplot(aes(x = "Diferenças da Média", ymin = conf.low, y = statistic, ymax = conf.high)) +
    geom_linerange(linewidth=2) +
    geom_point(color="red", size = 5)

RESPOSTA:

Após a análise, observou-se uma mudança mínima apenas confirmamos a conclusão inicial.