2023/01/31 (updated: 2024-08-19)

Causalidade

Causalidade

  • Estabelecer relações de causa e efeito é uma questão central para qualquer ciência, economia não é exceção.
  • Bolsa família induz a um maior número de filhos? Reduzir a maioridade penal diminui a criminalidade? Aumentar o salário mínimo aumenta o desemprego? Aumentar os juros reduz a inflação? Pagar mais aos professores melhora a educação?
  • Questões como essas são comuns em dissertações, teses e artigos publicados por economistas.
  • Como saber a resposta?

Causalidade

  • Uma tentação comum é acreditar que se um resultado segue uma política, então o resultado aconteceu por causa da política.
  • É como tomar um comprimido para uma dor e depois de um tempo a dor passar. Tendemos a acreditar que foi por conta do comprimido. Como saber se foi mesmo?

Causalidade

  • Para isso teríamos de conhecer um universo alternativo onde não tomamos o comprimido. Se nesse universo a dor também tivar passado, então não podemos afirmar que o comprimido fez a dor passar. Talvez a dor fosse de curta duração.
  • Infelizmente não temos os poderes do Dr. Estranho e não podemos sair visitando universos alternativos. O que máximo podemos fazer é comparar o que aconteceu com pessoas que tomaram e não tomaram o comprimido.
  • Naturalmente essas comparações precisam levar em conta as características de quem tomou o comprimido (fez o tratamento) e quem não tomou o comprimido (controle).

Causalidade

  • Esse universo alternativo é chamado de contrafactual.
  • Construir contrafactuais é uma etapa fundamental em qualquer pesquisa que busque estabelecer relações de causalidade.

Causalidade

  • Para conduzir essa discussão é útil colocar um exemplo.
  • Existe discriminação racial no mercado de trabalho? É fato que existem diferenças em taxa de desemprego e salários entre grupos étnicos, mas não seriam essas diferenças decorrentes de, por exemplo, diferenças nos níveis de educação?
  • Para responder essa pergunta foi feito um experimento, a descrição e os resultados do experimento podem ser encontrado em Mariannne Bertrand e Sendhil Mullainathan; Are Emiliy and Gregg more employable than Lakisha e Jamal? A field experiment on labor market discrimination; American Economic Review, 2004.

Causalidade

  • O experimento consistiu em responder anúncio de empregos publicados em jornais com currículos de candidatos fictícios.
  • Os currículos eram diferentes apenas pelos nomes dos candidatos à vaga de emprego, os outros dados eram iguais.
  • Em alguns currículos foram colocados nomes típicos de afro-americanos, como Lakisha Washington e Jamal Jones, em outros foram usados nomes típicos de americanos brancos, como Emily Walsh e Greg Baker.
  • Os pesquisadores compararam o retorno dos currículos, especificamente se os nomes tipicamentes de americanos brancos receberam mais ofertas de emprego do que nomes costumeiramente associados a afro-americanos.

Causalidade

  • Para analisar os dados no R vamos precisar de carregar os pacotes tidyverse e os dados em resume.csv
library(tidyverse)
resume <- read.csv("resume.csv")

Causalidade

  • Para começar vamos “olhar” os dados
str(resume)
## 'data.frame':    4870 obs. of  4 variables:
##  $ firstname: chr  "Allison" "Kristen" "Lakisha" "Latonya" ...
##  $ sex      : chr  "female" "female" "female" "female" ...
##  $ race     : chr  "white" "white" "black" "black" ...
##  $ call     : int  0 0 0 0 0 0 0 0 0 0 ...

Causalidade

  • Os dados em resume são exemplos de dados experimentais. Dados experimentais são obtidos em uma pesquisa experimental desenhada de forma que uma variável de tratamento, ou variável de interesse causal, é manipulada de modo a examinar o efeito desta variável em uma variável de resultado.
  • No experimento a variável de tratamento é a raça do candidato fictício (race) e a variável de resultado é ser chamado ou não para o emprego (call).

Causalidade

  • Uma pesquisa experimental examina como um tratamento afeta de forma causal um resultado aplicando diferentes valores ao tratamento para diferentes observações e medindo os valores correspondentes da variável de resultado.

Causalidade

  • Existem várias funções que nos permitem “olhar” os dados, entre elas: head(), mostra as primeiras linhas, tail(), mostra as últimas linhas e glimpse() uma substituta do tidyverse para a função str() do R básico.

Causalidade

head(resume)
##   firstname    sex  race call
## 1   Allison female white    0
## 2   Kristen female white    0
## 3   Lakisha female black    0
## 4   Latonya female black    0
## 5    Carrie female white    0
## 6       Jay   male white    0

Causalidade

tail(resume)
##      firstname    sex  race call
## 4865   Lakisha female black    0
## 4866    Tamika female black    0
## 4867     Ebony female black    0
## 4868       Jay   male white    0
## 4869   Latonya female black    0
## 4870    Laurie female white    0

Causalidade

glimpse(resume)
## Rows: 4,870
## Columns: 4
## $ firstname <chr> "Allison", "Kristen", "Lakisha", "Latonya", "Carrie", "Jay",…
## $ sex       <chr> "female", "female", "female", "female", "female", "male", "f…
## $ race      <chr> "white", "white", "black", "black", "white", "white", "white…
## $ call      <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …

Causalidade

  • Outra função útil para conhecer uma base de dados é a summary()
summary(resume)
##   firstname             sex                race                call        
##  Length:4870        Length:4870        Length:4870        Min.   :0.00000  
##  Class :character   Class :character   Class :character   1st Qu.:0.00000  
##  Mode  :character   Mode  :character   Mode  :character   Median :0.00000  
##                                                           Mean   :0.08049  
##                                                           3rd Qu.:0.00000  
##                                                           Max.   :1.00000

Causalidade

  • Nossa primeira questão é saber quantos currículos com nomes afro-americanos receberam uma oferta de emprego.
race.call.summary <- resume %>%
  group_by(race, call) %>%
  count()

race.call.summary

Causalidade

## # A tibble: 4 × 3
## # Groups:   race, call [4]
##   race   call     n
##   <chr> <int> <int>
## 1 black     0  2278
## 2 black     1   157
## 3 white     0  2200
## 4 white     1   235

Causalidade

  • A tabela de contigência é uma matriz onde cada elemento mostra o número de observações referentes à linha e coluna do elemento.
race.call.tab <- race.call.summary %>%
  pivot_wider(names_from = call, values_from = n)

race.call.tab
## # A tibble: 2 × 3
## # Groups:   race [2]
##   race    `0`   `1`
##   <chr> <int> <int>
## 1 black  2278   157
## 2 white  2200   235

Causalidade

  • A função rename() permite dar nomes mais informativos às colunas.
race.call.tab.names <- race.call.tab %>%
  rename(no_callback = "0", callback = "1")

race.call.tab.names
## # A tibble: 2 × 3
## # Groups:   race [2]
##   race  no_callback callback
##   <chr>       <int>    <int>
## 1 black        2278      157
## 2 white        2200      235

Causalidade

  • A tabela anterior mostra que os nomes associados a americanos brancos receberam mais ofertas de emprego do que os nome associados a afro-americanos. Antes de tirar qualquer conclusão é preciso saber quantos curriculos foram enviados com cada tipo de nome.
race.call.tab.names <- race.call.tab.names %>%
  mutate(total_resumes = no_callback + callback,
         callback_prop = callback/total_resumes)

race.call.tab.names
## # A tibble: 2 × 5
## # Groups:   race [2]
##   race  no_callback callback total_resumes callback_prop
##   <chr>       <int>    <int>         <int>         <dbl>
## 1 black        2278      157          2435        0.0645
## 2 white        2200      235          2435        0.0965

Causalidade

  • Os números mostram que 9,65% do curriculos com nomes associados a americanos brancos recebram ofertas de emprego, no caso dos currículos com nomes associados a afro-americanos as ofertas foram recebidas por 6,45% dos currículos enviados.
  • Qual a média de ofertas para todos os curículos enviados?
overall_callback <- resume %>%
  summarize(total_callback_rate = sum(call)/n())

overall_callback
##   total_callback_rate
## 1          0.08049281

Causalidade

  • A análise mostrou que currículos com nomes associados a afro-americanos recebem menos retorno com ofertas de emprego do que currículos com nomes associados a americanos brancos.
  • Embora não seja possível afirmar que o resultado prova a existência de discriminação intencional, o menor número de retornos com oferta de emprego sugere a existência de discriminação racial no mercado de trablaho.
  • A pesquisa mostrou que o mesmo currículo com um nome associado a afro-americanos tem menos probabilidade de receber uma oferta de emprego.

Causalidade

  • Como call é uma variável numérica composta apenas de zero e um, tem uma maneira mais fácil de calcular o percentual de retorno com oferta de emprego, basta tirar a média.
overall_callback <- resume %>%
  summarize(total_callback_rate = mean(call))

overall_callback
##   total_callback_rate
## 1          0.08049281

Causalidade

  • Da mesma forma, podemos obter a média por raça usando a função group_by().
callback_by_race <- resume %>%
  group_by(race) %>%
  summarize(callback_rate = mean(call))

callback_by_race
## # A tibble: 2 × 2
##   race  callback_rate
##   <chr>         <dbl>
## 1 black        0.0645
## 2 white        0.0965

Subconjunto de dados no R

  • A função group_by() utilizada acima e na Unidade 1 nos permite obter informações de um subconjunto de dados. Esse tipo de trabalho é muito comum em análise de dados.
  • Nos próximos slides vamos discutir melhor como trabalhar com subconjunto de dados no R.

Subconjunto de dados no R

  • O ponto de partida são as variáveis e operações lógicas.
  • No R as variáveis lógicas são objetos do tipo logical e assumem valores TRUE ou FALSE
class(TRUE)
## [1] "logical"

Subconjunto de dados no R

  • As variáveis lógicas podem ser convertidas em variáveis inteiras. Nesses casos TRUE equivale a 1 e FALSE a 0.
as.integer(TRUE)
## [1] 1
as.integer(FALSE)
## [1] 0

Subconjunto de dados no R

  • Em vários casos o R vai converter automaticamente variáveis lógicas em inteiras para realizar algumas operações, por exemplo:
x <- c(TRUE, FALSE, TRUE)

mean(x)   #proporção de TRUEs
## [1] 0.6666667
sum(x)    #número de TRUEs
## [1] 2

Subconjunto de dados no R

  • Variáveis lógicas costumam ser produzidas por operadores lógicos, no R o símbolo para E é & e o símobolo para OU é |
  • O valor para E é verdadeiro quando os dois objetos têm valores verdadeiros.
TRUE & TRUE
## [1] TRUE
TRUE & FALSE
## [1] FALSE
FALSE & FALSE
## [1] FALSE

Subconjunto de dados no R

  • Para que OU seja verdadeiro basta que um objeto tenha valor verdadeiro
TRUE | FALSE
## [1] TRUE
FALSE & FALSE
## [1] FALSE
TRUE | TRUE
## [1] TRUE

Subconjunto de dados no R

Subconjunto de dados no R

  • É possível avaliar mais de duas afirmações com os operadores & e |
TRUE & FALSE & TRUE
## [1] FALSE
(TRUE | FALSE) & FALSE
## [1] FALSE

Subconjunto de dados no R

  • É possível avaliar mais de duas afirmações com os operadores & e |
(TRUE | FALSE) & TRUE
## [1] TRUE
TRUE | (FALSE & FALSE)
## [1] TRUE

Subconjunto de dados no R

  • Também podemos avaliar vetores de variáveis lógicas.
TF1 <- c(TRUE, FALSE, FALSE)
TF2 <- c(TRUE, FALSE,TRUE)

TF1 | TF2
## [1]  TRUE FALSE  TRUE
TF1 & TF2
## [1]  TRUE FALSE FALSE

Subconjunto de dados no R

  • Operadores relacionais avaliam a relação entre dois valores.
    • maior que: >
    • maior ou igual a: >=
    • menor que: <
    • menor ou igual a: <=
    • igual a: ==
    • não igual a: !=
  • Operadores relacionais retornam valores lógicos

Subconjunto de dados no R

4 > 3
## [1] TRUE
"Hello" == "hello"
## [1] FALSE

Subconjunto de dados no R

"Hello" == "Hello"
## [1] TRUE
"Hello" != "hello"
## [1] TRUE

Subconjunto de dados no R

  • Operadores relacionais podem ser usados com vetores.
x <- c(3,2,1,-2,-1)
x >= 2
## [1]  TRUE  TRUE FALSE FALSE FALSE
x != 1
## [1]  TRUE  TRUE FALSE  TRUE  TRUE

Subconjunto de dados no R

  • Operadores relacionais podem ser combinados com operadores lógicos.
(x > 0) & (x <= 2)
## [1] FALSE  TRUE  TRUE FALSE FALSE
(x > 2) | (x <= -1)
## [1]  TRUE FALSE FALSE  TRUE  TRUE

Subconjunto de dados no R

  • Como o R “força” a leitura de objetos lógicos como inteiros do tipo 0,1 podemos usar média e soma para calcular a proporção e o número de TRUEs em aplicações de operadores relacionais,
x.int <- (x > 0) & (x <= 2)
sum(x.int)
## [1] 2
mean(x.int)
## [1] 0.4

Subconjunto de dados no R

  • A função filter() do pacote tidyverse usa operadores relacionais. Podemos usar essa função para calcular o retorno com ofertas de empregos apenas para nomes associados a afro-americanos.
resume %>%
  filter(race == "black") %>%
  summarize(mean(call))
##   mean(call)
## 1 0.06447639

Subconjunto de dados no R

  • Podemos criar um novo data frame apenas com nomes associados a afro-americanos.
resumeB <- filter(resume, race == "black")
mean(resumeB$call)
## [1] 0.06447639
summarize(resumeB, mean(call))
##   mean(call)
## 1 0.06447639

Subconjunto de dados no R

  • Também podemos criar um data frame filtrando por raça e sexo.
resumeBf <- filter(resume, race == "black" & sex == "female")
head(resumeBf)
##   firstname    sex  race call
## 1   Lakisha female black    0
## 2   Latonya female black    0
## 3     Kenya female black    0
## 4   Latonya female black    0
## 5     Aisha female black    0
## 6     Aisha female black    0

Subconjunto de dados no R

  • Em análises de dados é comum compararmos médias do resultado de grupos diferentes.
Bf_callback <- filter(resume, race == "black" & sex == "female") %>%
  summarize(callback_rate = mean(call)) %>%
  pull()
Bf_callback
## [1] 0.06627784
Bm_callback <- filter(resume, race == "black" & sex == "male") %>%
  summarize(callback_rate = mean(call)) %>%
  pull()
Bm_callback
## [1] 0.0582878

Subconjunto de dados no R

Wf_callback <- filter(resume, race == "white" & sex == "female") %>%
  summarize(callback_rate = mean(call)) %>%
  pull()
Wf_callback
## [1] 0.09892473
Wm_callback <- filter(resume, race == "white" & sex == "male") %>%
  summarize(callback_rate = mean(call)) %>%
  pull()
Wm_callback
## [1] 0.08869565

Subconjunto de dados no R

  • Diferenças
Wf_callback - Bf_callback
## [1] 0.03264689
Wm_callback - Bm_callback
## [1] 0.03040786

Subconjunto de dados no R

  • Os números mostram que o tanto homens quanto mulheres com nomes associados a americanos brancos recebem um maior retorno com ofertas de emprego.

Subconjunto de dados no R

  • Podemos fazer esse mesmo exercício de forma menos trabalhosa se usarmos melhor os recursos do tidyverse.
racial_gaps_by_sex <- resume %>%
  group_by(race,sex) %>%
  summarize(callback = mean(call)) %>%
  pivot_wider(names_from = race, values_from = callback) %>%
  mutate(race_gap = white - black)

Subconjunto de dados no R

Subconjunto de dados no R

  • Vamos “quebrar” o código acima para entender o que foi feito.
resume %>%
  group_by(race,sex) %>%
  summarize(callback = mean(call))
## # A tibble: 4 × 3
## # Groups:   race [2]
##   race  sex    callback
##   <chr> <chr>     <dbl>
## 1 black female   0.0663
## 2 black male     0.0583
## 3 white female   0.0989
## 4 white male     0.0887

Subconjunto de dados no R

resume %>%
  group_by(race,sex) %>%
  summarize(callback = mean(call)) %>%
  pivot_wider(names_from = race, values_from = callback)
## # A tibble: 2 × 3
##   sex     black  white
##   <chr>   <dbl>  <dbl>
## 1 female 0.0663 0.0989
## 2 male   0.0583 0.0887

Subconjunto de dados no R

resume %>%
  group_by(race,sex) %>%
  summarize(callback = mean(call)) %>%
  pivot_wider(names_from = race, values_from = callback) %>%
  mutate(race_gap = white - black)
## # A tibble: 2 × 4
##   sex     black  white race_gap
##   <chr>   <dbl>  <dbl>    <dbl>
## 1 female 0.0663 0.0989   0.0326
## 2 male   0.0583 0.0887   0.0304

Subconjunto de dados no R

  • Em algumas situações queremos que o R tome determinada ação sob a condição que uma afirmação seja verdadeira e outra ação se a afirmação for falsa. É o que chamamos de declaração condicional.
  • A função if_else() permite trabalhar com declarações condicionais.

Subconjunto de dados no R

  • Criar uma variável binária com 1 caso seja mulher com nome associado a afrom-americanos e 0 caso contrário.
resume <- resume %>%
  mutate(BlackFemale = if_else(race == "black" & sex == "female", 1, 0))

Subconjunto de dados no R

Subconjunto de dados no R

  • Deu certo? Nunca é demais testar.
nrow(resumeBf)
## [1] 1886
nrow(resumeBf) == resume %>% summarize(bf = sum(BlackFemale))
##        bf
## [1,] TRUE

Subconjunto de dados no R

  • Vamos usar a função if_else() para criar uma variável categórica, ou um fator, onde cada categoria corresponde a uma combinação de raça e sexo.
resume_fact <- resume %>%
  mutate(type = if_else(race == "black" & sex == "female", "BlackFemale", ""),
         type = if_else(race == "black" & sex == "male", "BlackMale", type),
         type = if_else(race == "white" & sex == "female", "WhiteFemale", type),
         type = if_else(race == "white" & sex == "male", "WhiteMale", type))

Subconjunto de dados no R

Subconjunto de dados no R

  • Funcionou, mas o código ficou meio confuso e código confuso é convite para erros. A função case_when() nos permite criar a mesma variável um código mais claro.
resume <- resume %>%
  mutate(type = case_when(race == "black" & sex == "female" ~ "BlackFemale",
                          race == "black" & sex == "male" ~ "BlackMale",
                          race == "white" & sex == "female" ~ "WhiteFemale",
                          race == "white" & sex == "male" ~ "WhiteMale"))

Subconjunto de dados no R

Subconjunto de dados no R

  • Vamos olhar com mais cuidado para a variável type.
  • Como desejado a variável guarda as categoris, mas o R não considera a variável um fator.
class(resume_fact$type)
## [1] "character"
summary(resume_fact$type)
##    Length     Class      Mode 
##      4870 character character

Subconjunto de dados no R

  • A função as.factor() diz para o R transformar uma variável em um fator.
resume <- resume %>%
  mutate(type = as.factor(type))
class(resume$type)
## [1] "factor"

Subconjunto de dados no R

  • Como a função group_by() não trabalha apenas com fatores, é comum que usuários do tidyverse não se preocupem em usar objetos da classe factor ou da classe character, mas para o R faz diferença.
levels(resume$type)
## [1] "BlackFemale" "BlackMale"   "WhiteFemale" "WhiteMale"
summary(resume$type)
## BlackFemale   BlackMale WhiteFemale   WhiteMale 
##        1886         549        1860         575

Efeito causal e contrafactual

  • Inferência causal é a compração entre o factual (o que de fato aconteceu) e o contrafactual (o que teria acontecido em outras condições).
  • Repare na primeira observação da base de dados.
slice(resume, 1)
##   firstname    sex  race call BlackFemale        type
## 1   Allison female white    0           0 WhiteFemale

Efeito causal e contrafactual

  • O factual é que um potencial empregador recebeu um currículo com um nome associado a mulheres brancas e não retornou uma oferta de emprego.
  • A questão para causalidade é saber qual seria a reação do empregador se o nome fosse tipicamente associado a afro-americanos.
  • Como o mesmo currículo não foi mandado para o mesmo potencial empregador com outro nome não temos como saber a resposta.

Efeito causal e contrafactual

  • Da mesma forma, o desemprego aumentar após uma elevação do salário mínimo não permite afirmar que elevação do salário mínimo causou o aumento do desemprego. Precisaríamos saber o que teria acontecido com o desemprego sem o aumento da salário mínimo.
  • Outro exemplo, para afirmar que fazer economia na UnB causa um aumento no salário precisaríamos saber qual seria o salário caso o sujeito não tivesse feito economia na UnB.
  • Universos paralelos…

Efeito causal e contrafactual

  • Para avaliar como uma variável de tratamento, \(T\), afeta uma variável de resultado, \(Y\), precisamos conhecer dois potenciais resultados:
    • Valor de \(Y\) na presença do tratamento, denote por \(Y(T=1)\), ou simplesmente \(Y(1)\).
    • Valor de \(Y\) na ausência do tratamento, \(Y(T=0)\) ou \(Y(0)\).
  • O problema é que conhecemos \(Y(0)\) ou \(Y(1)\), não os dois.

Efeito causal e contrafactual

  • De fato, conhecemos \(Y(0)\) ou \(Y(1)\) para cada observação da amostra, ou seja, para cada observação \(i\) conhecemos \(Y_i(0)\) ou \(Y_i(1)\).
  • O efeito causal do tratamento para a observação \(i\) é dado por \(Y_i(1) - Y_i(0)\), como só conhemos um dos possíveis resultados temos de estimar o outro.
  • Essas estimações dependem de hipóteses, a credibilidade de um inferência causal está fundada na plausibilidade das hipóteses usadas na estimação.

Efeito causal e contrafactual

  • Para cada observação \(i\) podemos definir o efeito causal de um tratamento binário \(T_i\) como a diferença entre os resultados potenciais, \(Y_i(1) - Y_i(0)\), onde \(Y_i(1)\) representa o resultado obtido com o tratamento, \(T_i = 1\), e \(Y_i(0)\) representa o resultado sem o tratamento, \(T_i = 0\).
  • O problema fundamental da inferência causal é que só observamos um dos dois potenciais resultados.

Controle aleatório (RCT)

  • Como estimar o efeito causal?
  • A forma mais aceita de estimar o efeito causal é por meio de um experimento controlado aleatório, experimento controlado randomizado ou RCT (do inglês ramdomized controlled trial).
  • Em um RCT os integrantes do grupo de tratamento são escolhidos de forma aleatória.

Controle aleatório (RCT)

  • O efeito de tratamento médio da amostra, SATE, do inglês sample average treatment effect, é definido como a média amostral dos efeitos individuais do tratamento, \(Y_i(1) - Y_i(0)\),

\[SATE=\frac{1}{n}\sum_{i=1}^n\left[Y_i(1)-Y_i(0)\right]\] onde \(n\) é o tamanho da amostra.

Controle aleatório (RCT)

  • Como só conhecemos \(Y_i(1)\) ou \(Y_i(0)\) para um determinado \(i\), o \(SATE\) não é observado.
  • O estimador por diferença de médias, difference-in-means estimator estima o \(SATE\) como a diferença entre a média do grupo de tratamento e a média do grupo de controle.

Controle aleatório (RCT)

  • Quanto maior a semelhança entre o grupo de tratamento e o de controle nas características que não consistam do tratamento, melhor será o estimador por diferença de médias para estimar o efeito causal.
  • Daí a importância da distribuição aleatória para tratamento e controle. Essa forma de distribuição faz com que os grupos sejam semelhantes em todos os aspectos (salvo o tratamento), dito de outra forma, os grupos de tratamento e controle, em média, são idênticos nas características pré-tratamento.
  • A distribuição aleatória entre tratamento e controle isola o efeito causal do tratamento de outros possíveis fatores que podem influenciar o resultado.

Controle aleatório (RCT)

  • Em um RCT cada unidade é designada de forma aleatória para o grupo de tratamento ou controle. Desta forma, o RCT faz com que as diferenças nos resultados entre tratamento e controle sejam devidas ao tratamento, já que, em média, os grupos são identicos nas caracterísiticas pré-tratamento.

Controle aleatório (RCT)

  • validade interna: validade da conclusão relativa a causalidade
  • validade externa: o quanto a conclusão pode ser generalizada para além dos participantes do estudo.

Controle aleatório (RCT)

  • O ponto forte do RCT é a validade interna, o ponto fraco é a validade externa.
  • Isso acontece por conta da escolha dos participantes (pode ter um viés), das condições do experimento, etc.

Controle aleatório (RCT)

  • Nosso próximo exemplo será um estudo a respeito de pressão social e participação eleitoral.
  • O experimento consistiu em mandar get-out-the-vote, GOTV mensagens (cartões estimulando o voto) durante uma primária em Michigan e observar se receber essas mensagens afetou a decisão de ir votar. Nos EUA a participação dos indivíduos na eleição é uma informação pública.
  • A discussão pode ser encontrada em: Alan S. Gerber, Donald P. Green e Christopher W. Larimer. Social pressure and voter turnout: evidence from a large-scale field experiment. American Political Science Review, 2008.

Controle aleatório (RCT)

  • O grupo de tratamento recebeu uma carta avisando que informaria à vizinhança os nomes de quem votou e de quem não votou (naming and shaming).
  • O grupo de controle não recebeu carta alguma.
  • Para refirnar o estudo, um grupo recebeu uma carta básica pedindo para votar, sem ameaças de exposição.
  • Em estudos controlados há o risco do indivíduo mudar de comportamento por saber que está sendo observado (efeito Hawthorne), para tratar desse tema alguns indivíduos receberam carta informando que estavam sendo estudados.

Controle aleatório (RCT)

...

Controle aleatório (RCT)

...

Controle aleatório (RCT)

...

Controle aleatório (RCT)

...

Controle aleatório (RCT)

  • Três grupos de tratamento:
    • Uma das cartas com pressão social (neighbors)
    • Mensagem com dever cívico (civic duty)
    • Efeito Hawthorne

Controle aleatório (RCT)

social <- read.csv("social.csv")
head(social)
##      sex yearofbirth primary2004   messages primary2006 hhsize
## 1   male        1941           0 Civic Duty           0      2
## 2 female        1947           0 Civic Duty           0      2
## 3   male        1951           0  Hawthorne           1      3
## 4 female        1950           0  Hawthorne           1      3
## 5 female        1982           0  Hawthorne           1      3
## 6   male        1981           0    Control           0      3

Controle aleatório (RCT)

  • Variáveis
    • hhsize: tamanho da família do eleitor
    • messages: tipo de mensagem que recebeu
    • sex: sexo do eleitor
    • yearofbirth: ano do nascimento
    • primary 2004: se votou nas primárias de 2004
    • primary 2006: se votou nas primárias de 2006

Controle aleatório (RCT)

str(social)
## 'data.frame':    305866 obs. of  6 variables:
##  $ sex        : chr  "male" "female" "male" "female" ...
##  $ yearofbirth: int  1941 1947 1951 1950 1982 1981 1959 1956 1968 1967 ...
##  $ primary2004: int  0 0 0 0 0 0 0 0 0 0 ...
##  $ messages   : chr  "Civic Duty" "Civic Duty" "Hawthorne" "Hawthorne" ...
##  $ primary2006: int  0 0 1 1 1 0 1 1 0 0 ...
##  $ hhsize     : int  2 2 3 3 3 3 3 3 2 2 ...

Controle aleatório (RCT)

summary(social)
##      sex             yearofbirth    primary2004       messages        
##  Length:305866      Min.   :1900   Min.   :0.0000   Length:305866     
##  Class :character   1st Qu.:1947   1st Qu.:0.0000   Class :character  
##  Mode  :character   Median :1956   Median :0.0000   Mode  :character  
##                     Mean   :1956   Mean   :0.4014                     
##                     3rd Qu.:1965   3rd Qu.:1.0000                     
##                     Max.   :1986   Max.   :1.0000                     
##   primary2006         hhsize     
##  Min.   :0.0000   Min.   :1.000  
##  1st Qu.:0.0000   1st Qu.:2.000  
##  Median :0.0000   Median :2.000  
##  Mean   :0.3122   Mean   :2.184  
##  3rd Qu.:1.0000   3rd Qu.:2.000  
##  Max.   :1.0000   Max.   :8.000

Controle aleatório (RCT)

  • Calcular a participação de cada grupo.
turnout_by_message <- social %>%
  group_by(messages) %>%
  summarize(turnout = mean(primary2006))

Controle aleatório (RCT)

Controle aleatório (RCT)

  • Calcular a diferença entre a participação de cada grupo e a participação do grupo de controle.
turnout_diffs <- turnout_by_message %>%
  pivot_wider(names_from = messages, values_from = turnout) %>%
  mutate(diff_Civic_Duty = `Civic Duty` - Control,
         diff_Hawthorne = Hawthorne - Control,
         diff_Neighbors = Neighbors - Control) %>%
  select(diff_Civic_Duty, diff_Hawthorne, diff_Neighbors)

Controle aleatório (RCT)

Controle aleatório (RCT)

  • Os eleitores que receberam mensagens com pressão social tiveram uma participação 8,1% acima da dos eleitores do grupo de controle.
  • Os eleitores que receberam mensagens avisando que estavam sendo estudados tiveram uma participação 2,6% acima da dos eleitores do grupo de controle, mas menor que a dos eleitores que receberam pressão social. Parece que há efeito Hawthorne.
  • os eleitores que foram lembrados do dever cívico de votar tiveram participação 1,8% da dos eleitores do grupo de controle, foi o menor efeito.

Controle aleatório (RCT)

  • Para que distribuição aleatória dos eleitores entre os diversos grupos seja adequada é de se esperar que não existam diferenças signficativas nas variáveis pré-tratamento: tamanho da família, idade e participação nas primárias de 2004.

Controle aleatório (RCT)

social %>%
  mutate(age = 2006 - yearofbirth) %>%
  group_by(messages) %>%
  summarize(age_avg = mean(age),
            primary2004_avg = mean(primary2004),
            hhsize_avg = mean(hhsize))
## # A tibble: 4 × 4
##   messages   age_avg primary2004_avg hhsize_avg
##   <chr>        <dbl>           <dbl>      <dbl>
## 1 Civic Duty    49.7           0.399       2.19
## 2 Control       49.8           0.400       2.18
## 3 Hawthorne     49.7           0.403       2.18
## 4 Neighbors     49.9           0.407       2.19

Estudos com dados observados

  • Em ciências sociais é muito difícil realizar RCTs. Problemas éticos, de logísticas, de custos e/ou legais costumam tornar tais experimentos impossíveis. Em alguns casos a própria natureza do tema pesquisado impossibilita experimentos controlados, pense, por exemplo, na macroeconomia.
  • A alternativa é trabalhar com dados observados e buscar por experimentos naturais.
  • Em termos de validade interna estudos com dados observados perdem muito para RCTs, por outro lado, a validade externa de estudos com dados observados pode ser superior à dos resultados obtidos com RCTs.

Estudos com dados observados

  • Um exemplo clássico de estudo com dados observados tratou do impacto do salário mínimo no desemprego. Naturalmente não tinha como pesquisadores mudarem o salário mínimo em regiões aleatórias para tentar fazer um RCT. A alternativa foi buscar dados observados em um experimento natural.
  • Em 1992 o estado americano de Nova Jersey (NJ) aumentou o salário mínimo de $4,25 para $5,05 dólares por hora. Na Pesilvânia (PA), estado vizinho, não houve aumento de salário mínimo.

Estudos com dados observados

  • Os autores pegaram dados de emprego em cadeias de fast-food em NJ e PA e, usando NJ como tratamento e PA como controle, avlaliaram a difereça no emprego entre NJ e PA antes de depois do aumento do salário mínimo em NJ.
  • O estudo se encontra em: David Card e Alan Krueger. Minimum wages and employement: a case study of the fast-food industry in New Jersey and Pennsylvania. American Economic Review, 1994.

Estudos com dados observados

  • Para reproduzir partes do trabalho em Card e Krueger (1994) vamos carregar os dados.
minwage <- read.csv("minwage.csv")
glimpse(minwage)
## Rows: 358
## Columns: 8
## $ chain      <chr> "wendys", "wendys", "burgerking", "burgerking", "kfc", "kfc…
## $ location   <chr> "PA", "PA", "PA", "PA", "PA", "PA", "PA", "PA", "PA", "PA",…
## $ wageBefore <dbl> 5.00, 5.50, 5.00, 5.00, 5.25, 5.00, 5.00, 5.00, 5.00, 5.50,…
## $ wageAfter  <dbl> 5.25, 4.75, 4.75, 5.00, 5.00, 5.00, 4.75, 5.00, 4.50, 4.75,…
## $ fullBefore <dbl> 20.0, 6.0, 50.0, 10.0, 2.0, 2.0, 2.5, 40.0, 8.0, 10.5, 6.0,…
## $ fullAfter  <dbl> 0.0, 28.0, 15.0, 26.0, 3.0, 2.0, 1.0, 9.0, 7.0, 18.0, 5.0, …
## $ partBefore <dbl> 20.0, 26.0, 35.0, 17.0, 8.0, 10.0, 20.0, 30.0, 27.0, 30.0, …
## $ partAfter  <dbl> 36, 3, 18, 9, 12, 9, 25, 32, 39, 10, 20, 4, 13, 20, 15, 19,…

Estudos com dados observados

  • Variáveis:
    • chain: nome da cadeia de fast-food
    • location: localização do restaurante (centralNJ, northNJ, shoreNJ, southNJ, PA)
    • wageBefore: salário antes do aumento do salário mínimo em NJ
    • wageAfter: salário depois do aumento do salário mínimo em NJ
    • fullBefore: número de empregados em tempo integral antes do aumento do salário mínimo em NJ
    • fullAfter: número de empregados em tempo integral depois do aumento do salário mínimo em NJ
    • partBefore: número de empregados em tempo parcial antes do aumento do salário mínimo em NJ
    • partAfter: número de empregados em tempo parcial depois do aumento do salário mínimo em NJ

Estudos com dados observados

summary(minwage)
##     chain             location           wageBefore      wageAfter    
##  Length:358         Length:358         Min.   :4.250   Min.   :4.250  
##  Class :character   Class :character   1st Qu.:4.250   1st Qu.:5.050  
##  Mode  :character   Mode  :character   Median :4.500   Median :5.050  
##                                        Mean   :4.618   Mean   :4.994  
##                                        3rd Qu.:4.987   3rd Qu.:5.050  
##                                        Max.   :5.750   Max.   :6.250  
##    fullBefore       fullAfter        partBefore      partAfter    
##  Min.   : 0.000   Min.   : 0.000   Min.   : 0.00   Min.   : 0.00  
##  1st Qu.: 2.125   1st Qu.: 2.000   1st Qu.:11.00   1st Qu.:11.00  
##  Median : 6.000   Median : 6.000   Median :16.25   Median :17.00  
##  Mean   : 8.475   Mean   : 8.362   Mean   :18.75   Mean   :18.69  
##  3rd Qu.:12.000   3rd Qu.:12.000   3rd Qu.:25.00   3rd Qu.:25.00  
##  Max.   :60.000   Max.   :40.000   Max.   :60.00   Max.   :60.00

Estudos com dados observados

  • Eu prefiro trabalhar com fatores, mas vamos seguir o livro.
minwage %>%
  mutate(chain = as.factor(chain),
         location = as.factor(location)) %>%
  summary()

Estudos com dados observados

##         chain          location     wageBefore      wageAfter    
##  burgerking:149   centralNJ: 45   Min.   :4.250   Min.   :4.250  
##  kfc       : 75   northNJ  :146   1st Qu.:4.250   1st Qu.:5.050  
##  roys      : 88   PA       : 67   Median :4.500   Median :5.050  
##  wendys    : 46   shoreNJ  : 33   Mean   :4.618   Mean   :4.994  
##                   southNJ  : 67   3rd Qu.:4.987   3rd Qu.:5.050  
##                                   Max.   :5.750   Max.   :6.250  
##    fullBefore       fullAfter        partBefore      partAfter    
##  Min.   : 0.000   Min.   : 0.000   Min.   : 0.00   Min.   : 0.00  
##  1st Qu.: 2.125   1st Qu.: 2.000   1st Qu.:11.00   1st Qu.:11.00  
##  Median : 6.000   Median : 6.000   Median :16.25   Median :17.00  
##  Mean   : 8.475   Mean   : 8.362   Mean   :18.75   Mean   :18.69  
##  3rd Qu.:12.000   3rd Qu.:12.000   3rd Qu.:25.00   3rd Qu.:25.00  
##  Max.   :60.000   Max.   :40.000   Max.   :60.00   Max.   :60.00

Estudos com dados observados

  • O primeiro passo é saber se os restaurantes seguiram a lei. Para isso vamos olhar o salário antes e depois em NJ e PA.
  • O esperado é um aumento em NJ que não seja observado na PA.

Estudos com dados observados

  • Para realizar essa comparação vamor criar uma variável para restaurantes em NJ.
  • Depois vamos checar quantos restaurantes em NJ e PA pagavam mais que $5,05 antes e depois do aumento do salário mínimo em NJ.

Estudos com dados observados

minwage <- minwage %>%
  mutate(state = if_else(location == "PA", "PA", "NJ"))

new_wage <- 5.05

state_props <- minwage %>%
  mutate(above_min_before = if_else(wageBefore >= new_wage,1,0),
         above_min_after = if_else(wageAfter >= new_wage, 1, 0)) %>%
  group_by(state) %>%
  summarize(prop_before = mean(above_min_before),
            prop_after = mean(above_min_after))

Estudos com dados observados

  • O novo salário mínimo foi seguido pelos restaurantes em NJ, na PA, como esperado, não houve efeito.

Estudos com dados observados

  • A pergunta de interesse é se o aumento do salário mínimo em NJ afetou o emprego. Especificamente queremos saber se os restaurantes trocaram empregados de tempo integral por empregados de tempo parcial para reduzir custos.
  • Vamos tentar responder usando a PA como contrafactual.

Estudos com dados observados

  • O primeiro passo é encontrar a proporção de empregados em tempo integral no total de empregados.
minwage <- minwage %>%
  mutate(totalAfter = fullAfter + partAfter,
         fullPropAfter = fullAfter/totalAfter)

Estudos com dados observados

  • Depois vamos calcular a proporção de empregados em tempo integral no total de empregados em cada estado.
full_prop_by_state <- minwage %>%
  group_by(state) %>%
  summarize(fullPropAfter = mean(fullPropAfter))

Estudos com dados observados

  • Finalmente calculamos a diferença entre os estados
full_prop_by_state %>%
  pivot_wider(names_from = state, values_from = fullPropAfter) %>%
  mutate(diff = NJ - PA)
## # A tibble: 1 × 3
##      NJ    PA   diff
##   <dbl> <dbl>  <dbl>
## 1 0.320 0.272 0.0481

Estudos com dados observados

  • Uma hipótese fundamental em estudos observacionais é que os grupos de tratamento e controle de fato sejam semelhantes em tudo menos o tratamento que será aplicado.
  • No nosso exemplo não temos como garantir que isso seja verdade, é possível que a maior proporção de empregados em tempo integral em NJ decorra de diferenças entre a estrutura da economia de cada estado que não estão relacionadas ao aumento do salário mínimo.
  • Dessa forma não podemos falar em causalidade.

Estudos com dados observados

  • As variáveis pré-tratamento que são associadas a variável de tratamento e a variável de resultado são conhecidas como confundidores (confounders).
  • Varáveis pré-tratamento são realizadas antes do tratamento e, portanto, não sofrem efeito causal do tratamento. Porém, podem influenciar quem vai receber o tratamento e o resultado do tratamento.

Estudos com dados observados

  • A existência dessas variáveis confunde a relação entre tratamento e resultado e podem inviabilizar a inferência causal entre tratamento e resultado.
  • A possibilidade de viés por conta de confundidores é uma preocupação central em estudos de causalidade em ciências sociais.

Estudos com dados observados

...

Estudos com dados observados

  • Uma variável pré-tratamento que é associada com o tratamento e com o resultado é chamada confundidora (confounders) e é fonte de viés de confusão (confoundig bias) na estimação de efeitos causais.
  • A possibilidade da existência de viés de confusão é uma das razões para a máxima de que correlação não é causalidade.

Estudos com dados observados

  • Quando o viés está relacionado a seleção de quem participa do tratamento, muito comum em estudos observacionais, dizemos que ocorre um viés de seleção.
  • Alunos formados pela UnB conseguem bons empregos por conta do tratamento (cursos da UnB) ou por que a UnB seleciona os melhores alunos?
  • Por que um país adota uma certa política e outro não? É possível que as razões que levaram a adoção da política comprometam comparações entre o pais que adotou e países que não adotaram.

Estudos com dados observados

  • Nunca é possível descartar a possibilidade de um estudo com dados observados sofrer com viés de confusão, porém existem maneiras de abordar esse problema, é o que chamamos de controle estatístico.
  • Uma maneira simples de controle estatístico é trabalhar com subconjunto de dados para fazer com que os grupos de tratamento e controle sejam semelhantes.

Estudos com dados observados

  • Por exemplo, a amostra da PA tem um maior número de restaurantes do Burger King do que na amostra de NJ.
  • É possível que a diferença na proproção de empregados em tempo total esteja relacioanada a um estratégia empresarial do Burger King e não a mudança no salário mínimo.

Estudos com dados observados

  • Vamos confirmar que na amostra da PA tem mais Burger King do que na amostra de NJ.
chains_by_state <- minwage %>%
  group_by(state) %>%
  count(chain) %>%
  mutate(prop = n/sum(n)) %>%
  pivot_wider(id_cols=-n, names_from = state, values_from = prop)

Estudos com dados observados

Estudos com dados observados

  • Agora vamos comparar a variação no emprego em tempo integral em cada uma das cadeias de restaurantes, nossa ênfase será no Burger King.
full_prop_by_state_chain <- minwage %>%
  group_by(state, chain) %>%
  summarize(fullPropAfter = mean(fullPropAfter)) %>%
  pivot_wider(names_from = "state", values_from = fullPropAfter) %>%
  mutate(diff = NJ - PA)

Estudos com dados observados

Estudos com dados observados

  • Repare que em todas as cadeias a proporção de emprego tempo integral é maior em NJ. Especificamente no Burger King o resultado ficou parecido com o encontrado quando não controlamos pelas cadeias de fast-food.
  • Aparentemente as cadeias de fast-food não são um fator de confusão.

Estudos com dados observados

  • É possível que o problema esteja na localização dos restaurantes. Nesse caso lojas perto da PA formariam um grupo de controle mais confiável, pois as economias locais teriam características similares.
  • Para avaliar essa questão vamos concentrar a análise nas localidades norte e sul de NJ, mais próximas da PA, e excluir os restaurantes na área central e na costa.

Estudos com dados observados

...

Estudos com dados observados

prop_by_state_chain_location_subset <- minwage %>%
  filter(!location %in% c("shoreNJ", "centralNJ")) %>%
  group_by(state,chain) %>%
  summarize(fullPropAfter = mean(fullPropAfter)) %>%
  pivot_wider(names_from = state, values_from = fullPropAfter) %>%
  mutate(diff = NJ - PA)

Estudos com dados observados

Estudos com dados observados

  • Mesmo controlando pelas cadeias e por regiões próximas da PA observamos que a proporção de emprego em tempo integral após o aumento do salário mínimo em NJ é maior em NJ do que na PA.
  • Esse tipo de achado reforça a confiança em que o aumento do salário mínimo teve pouco efeito no emprego de tempo integral.

Estudos com dados observados

  • O viés de confusão pode ser reduzido por meio do controle estatístico. Por exemplo, podemos usar o método de subclassificação comparando unidades de tratamento e controle com o mesmo valor para variáveis confundidoras.

Estudos com dados observados

  • Em estudos com dados observados é comum termos observaçoes em diferentes períodos de tempo. Dados desse tipo são chamados de dados longitudinais ou dados em painel. A possibilidade de avaliar a mudança dos dados no tempo torna as comparações entre tratamento e controle mais confiáveis.
  • Na pesquisa do salário mínimo, por exemplo, temos os dados para antes e depois do tratamento (mudança no salário mínimo).
  • Essa informação pré-tratamento permite desenhar melhores estratégias para estimar o efeito causal.

Estudos com dados observados

  • A primeira possibilidade é comparar o antes e depois na unidade tratada, no caso NJ. Essa estratégia é chamada de antes e depois.
  • No lugar de comparar com os restaurantes da PA, a comparação é feita com os mesmos restaurantes de NJ antes e depois da mudança no slário mínimo.

Estudos com dados observados

minwage <- minwage %>%
  mutate(totalBefore = fullBefore + partBefore,
         fullPropBefore = fullBefore/totalBefore)

minwage %>%
  filter(state == "NJ") %>%
  summarize(diff = mean(fullPropAfter) - mean(fullPropBefore))
##         diff
## 1 0.02387474

Estudos com dados observados

  • A comparação antes e depois deu um resultado semelhante a comparação com a PA. A vantagem de comparar antes e depois é que não temos problemas com confundidores relacionados às economias de NJ e PA.
  • Por outro lado, a presença de uma tendência de mudança no tempo pode comprometer a comparação. Por exemplo, suponha que houve um forte crescimento da economia americana no período posterior a mudança no salário mínimo. Nesse caso, o aumento do emprego por conta desse crescimento pode ter mais do que compensado a queda por conta do aumento no salário mínimo. A vida nunca é fácil…
  • A estratégia antes e depois depende da não existência de tendências de mudanças no tempo.

Estudos com dados observados

  • A estratégia de comparar antes e depois examina como a variável de resultado mudou em cada unidade do período anterior ao tratamento para o período posterior ao tratamento. Essa estratégia resolve o problema de confundidores que não mudam no tempo. Porém, a estratégia fica comprometida na presença de confundidores que mudam no tempo.

Estudos com dados observados

  • O estimador de diferenças em diferenças (DiD, do inglês differences in differences) aperfeiçoa o estimador antes e depois tentando eliminar o viés causado por confundidores que mudam no tempo.
  • A hipótese chave é que na ausência do tratamento a variável de resultado no grupo tratado seguiria uma tendência paralela a observada no grupo de controle.

Estudos com dados observados

...

Estudos com dados observados

  • No exemplo, a estratégia DiD consiste em supor que na ausência da elevação do salário mínimo (tratamento), o emprego em tempo integral nos restaurantes de NJ seguiriam a mesma tendência observada na PA.

Estudos com dados observados

  • Com a estratégia DiD, o efeito médio amostral estimado para os restaurantes de NJ é a diferença entre o resultado observado após a mudança no salário mínimo e o resultado no contrafactual criado com a hipótese de tendência paralela.
  • A quantidade de interesse no DiD é chamada de efeito médio amostral do tratamento nas unidades tratadas (SATT, do inglês sample average treatment effectfor the treated).
  • Para estimar o DiD é preciso calcular a diferença antes e depois nas unidades tratadas, no exemplo NJ, e nas unidade de controle, no exemplo PA, e depois calcular a diferença dessas diferenças.

Estudos com dados observados

  • Estimador de diferenças em diferenças: \[DiD = (\bar{Y}^{depois}_{tratamento}-\bar{Y}^{antes}_{tratamento})-(\bar{Y}^{depois}_{controle}-\bar{Y}^{antes}_{controle})\]

Estudos com dados observados

  • Estimador DiD no exemplo (parte 1: antes e depois para cada grupo)
minwage %>%
  group_by(state) %>%
  summarize(diff = mean(fullPropAfter) - mean(fullPropBefore))
## # A tibble: 2 × 2
##   state    diff
##   <chr>   <dbl>
## 1 NJ     0.0239
## 2 PA    -0.0377

Estudos com dados observados

  • Estimador DiD no exemplo (parte 2: diferenças em diferenças)
minwage %>%
  group_by(state) %>%
  summarize(diff = mean(fullPropAfter) - mean(fullPropBefore)) %>%
  pivot_wider(names_from = state, values_from = diff) %>%
  mutate(diff_in_diff = NJ - PA)
## # A tibble: 1 × 3
##       NJ      PA diff_in_diff
##    <dbl>   <dbl>        <dbl>
## 1 0.0239 -0.0377       0.0616

Estudos com dados observados

  • O resultado não suporta a tese que o aumento no salário mínimo leva a um aumento no desemprego, pelo contrário, a estimativa por DiD sugere que o aumento do salário mínimo em NJ levou a um pequeno aumento na proporção de empregados em tempo integral.
  • A estimativa por DiD é maior do que a estimativa “antes e depois” uma vez que reflete a queda da proporção de empregados em tempo integral na PA.

Estudos com dados observados

  • O estimador DiD se torna problemático quando temos razões para desconfiar que a tendência das unidade tratadas na ausência do tratamento (contrafactual) não seria paralela a tendência observada nas unidades de controle.
  • No exemplo, seria o caso se fosse registrado um fenômeno que só ocorreu na PA e que poderia afetar o emprego em tempo integral.
  • Não é fácil determinar se essas tendências seriam ou não paralelas na ausência do tratamento, afinal não observamos o contrafactual, mas é possível fazer um esforço de pesquisa para “defender” essa hipótese. Por exemplo, com mais dados, talvez fosse possível testar se no passado o emprego na PA e em NJ seguiram tendências paralelas.

Estatísticas descritivas

  • Até agora usamos os valores médios das variáveis de resultado como medida de interesse, mas podemos usar outras métricas, por exemplo, a mediana.
  • Para terminar essa unidade vamos ver como podemos usar algumas estatísticas para descrever a distribuição de uma variável.

Estatísticas descritivas

  • Quantis: dividem um conjunto de observações em grupos com base na magnitude da variável.
    • mediana: divide as observações em dois grupos, o primeiro com a metade dos dados com menores valores e o segundo com metade dos dados com maiores valores.
    • quartis: dividem em quatro grupos, o primeiro com os 25% menores valores, o segundo com os 25% seguintes, o terceiro com os próximos 25% e o quarto com os 25% maiores.
    • decis: dez grupos, cada um com 10% da amostra do menor para o maior.
    • centis: cem grupos , cada um com 1% da amostra do menor para o maior.

Estatísticas descritivas

  • A função median() calcula a mediana de um conjunto de observações.
x1 <- seq(1,5, by=1)
median(x1)
## [1] 3
x2 <- seq(1,10, by=1)
median(x2)
## [1] 5.5
x3 <- seq(0,1000, by=1)
median(x3)
## [1] 500

Estatísticas descritivas

  • A função quantile() calcula os quartis de um conjunto de observações. Para outros quantis é preciso definir o argumento probs.
#Quartis
quantile(x3)
##   0%  25%  50%  75% 100% 
##    0  250  500  750 1000
#Decis
quantile(x3, probs=seq(0,1,0.1))
##   0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
##    0  100  200  300  400  500  600  700  800  900 1000

Estatísticas descritivas

  • Média e mediana medem o centro de uma distribuição, porém a média é mais sensível a valores extremos.
x <- c(1,3,4,10,82)
x
## [1]  1  3  4 10 82
mean(x)
## [1] 20
median(x)
## [1] 4

Estatísticas descritivas

  • Média e mediana dos salários antes e depois.
mean(minwage$wageBefore)
## [1] 4.617709
median(minwage$wageBefore)
## [1] 4.5
mean(minwage$wageAfter)
## [1] 4.993855
median(minwage$wageAfter)
## [1] 5.05

Estatísticas descritivas

  • A função summary() retorna média, máximo, mínimo, mediana e demais quartis de variáveis numéricas.
minwage %>%
  filter(state == "NJ") %>%
  select(wageBefore, wageAfter) %>%
  summary()
##    wageBefore     wageAfter    
##  Min.   :4.25   Min.   :5.000  
##  1st Qu.:4.25   1st Qu.:5.050  
##  Median :4.50   Median :5.050  
##  Mean   :4.61   Mean   :5.081  
##  3rd Qu.:4.87   3rd Qu.:5.050  
##  Max.   :5.75   Max.   :5.750

Estatísticas descritivas

  • A diferença entre o terceiro e primeiro quartil é chamada de intervalo interquartil (IQR, do inglês interquartile range). O IQR contém 50% dos dados de uma amostra e é usado como medida de disperção.
  • A função IQR() calcula o intervalo interquartil.

Estatísticas descritivas

minwage %>%
  filter(state == "NJ") %>%
  select(wageBefore, wageAfter) %>%
  summarize(wageBeforeIQR = IQR(wageBefore),
            wageAfterIQR = IQR(wageAfter))
##   wageBeforeIQR wageAfterIQR
## 1          0.62            0

Estatísticas descritivas

  • Aparentemente a elevação do salário mínimo concentrou a distribuição do salário em torno da mediana, faz sentido.
  • Para observar melhor essa questão vamos olhar os décis das distribuições de salários antes e depois do aumento.

Estatísticas descritivas

deciles_prob <- seq(from = 0, to = 1, by = 0.1)
deciles_names <- as.character(deciles_prob)

minwage %>%
  filter(state == "NJ") %>%
  select(wageBefore, wageAfter) %>%
  summarize(wageBeforeDecile = quantile(wageBefore, probs = deciles_prob),
            wageAfterDecile = quantile(wageAfter, probs = deciles_prob),
            decile = deciles_names)

Estatísticas descritivas

##    wageBeforeDecile wageAfterDecile decile
## 1              4.25            5.00      0
## 2              4.25            5.05    0.1
## 3              4.25            5.05    0.2
## 4              4.25            5.05    0.3
## 5              4.50            5.05    0.4
## 6              4.50            5.05    0.5
## 7              4.65            5.05    0.6
## 8              4.75            5.05    0.7
## 9              5.00            5.05    0.8
## 10             5.00            5.15    0.9
## 11             5.75            5.75      1

Estatísticas descritivas

  • Para testar o efeito de valores extremos podemos estimar as diferenças em diferenças usando mediana no lugar das médias.
minwage %>%
  group_by(state) %>%
  summarize(diff = median(fullPropAfter) - median(fullPropBefore)) %>%
  pivot_wider(names_from = state, values_from = diff) %>%
  mutate(diff_in_diff = NJ - PA)
## # A tibble: 1 × 3
##       NJ      PA diff_in_diff
##    <dbl>   <dbl>        <dbl>
## 1 0.0250 -0.0120       0.0370

Estatísticas descritivas

  • Além do IQR, é válido apresentar outras duas medidas de dispersão: a raiz da média dos quadrados (RMS, do inglês root-mean-square) e o desvio padrão.
  • o RMS é calculado como a raiz da média dos quadrados das observação, é dado por: \[RMS = \sqrt{\frac{1}{n}\sum_{i=1}^nx_i^2}\]

Estatísticas descritivas

z <- c(-2,-1,0,1,2)
sqrt(sum(z^2)/length(z))
## [1] 1.414214
mean(z)
## [1] 0

Estatísticas descritivas

  • O desvio padrão calcula a raiz da média dos quadrados dos desvios da média, é dado por: \[\mbox{desvio padrão}=\sqrt{\frac{1}{n}\sum_{i=1}^n(x_i - \bar{x})^2}\]
  • Em alguns casos a divisão é feita por \(n-1\) e não por \(n\), mais na frente vamos saber a razão. Por enquanto basta ter em mente que os valores serão próximos quando \(n\) é grande.
  • O quadrado do desvio padrão é chamado de variância.

Estatísticas descritivas

sqrt(sum((z-mean(z))^2)/(length(z)-1))
## [1] 1.581139
sd(z)
## [1] 1.581139
sd(z)^2
## [1] 2.5
var(z)
## [1] 2.5

Estatísticas descritivas

  • A função summarize_at() do tidyverse permite calcular várias estatísiticas de uma forma compacta. A função summarize_at() precisa ser informada das variáveis, isso é feito com a função vars(), e das funções que devem ser aplicada nas variáveis.
  • As funções são passadas para o argumento .funs e devem estar em uma lista que é uma classe do R.
  • Ainda não exploramos as listas, mas é válido saber que é a classe mais ampla do R.

Estatísticas descritivas

minwage %>%
  group_by(state) %>%
  summarize_at(vars(fullPropBefore, fullPropAfter), .funs = list(sd,var))

Estudos com dados observados

Estatísticas descritivas

  • É possível dar nomes as função que serão aplicadas nas variáveis.
minwage %>%
  group_by(state) %>%
  summarize_at(vars(fullPropBefore, fullPropAfter), .funs = list(stdv=sd,variance=var))

Estudos com dados observados