//styles, look here: https://cdnjs.com/libraries/highlight.js/9.12.0

October 7, 2018

1220 palavras 6 mins

Usando dados da RAIS e Análise de Sobrevivência para entender desemprego

Negros estão mais sujeitos à rotatividade de trabalhos? Se sim, isso se explica por variáveis observáveis como escolaridade ou não? E mulheres? Essas são questões muito comuns entre economistas do trabalho e podem ser atacadas de várias maneiras. Uma delas, que eu acho particularmente interessante, é com Análise de Sobrevivência.

Análise de Sobrevivência é um termo bem amplo para descrever modelos que servem para explorar tempo até que um evento de interesse aconteça. Até onde eu sei esse tipo de técnica nasceu em pesquisas clínicas, para melhor entender efeitos de certos tratamentos contra câncer. Hoje é aplicado por cientistas sociais em análise de eventos, por engenheiros para entender melhor falha e confiabilidade de sistemas e por economistas, principalmente para estudar desemprego.

Curvas de Kaplan-Meier, um pouco de teoria

A função de sobrevivência, doravante \(S(t)\), é um mapa que relaciona momento de tempo \(t\) à probabilidade de não acontecimento de um evento. A função hazard - acho que “risco” seja uma tradução apropriada? - relaciona a probabilidade de um evento acontecer no momento \(t\). Esse evento pode ser morte do paciente, uma revolução, falha de um sistema mecânico ou, no nosso caso, desemprego.

Uma das ferramentas iniciais de Análise de Sobrevivência é a Curva de Kaplan-Meier. A Curva KM tem a seguinte forma funcional:

\[S(t_i) = S(t_{i-1})(1-\frac{d_i}{n_i})\]

Onde \(n_i\) é o número de empregados até \(t_i\), \(d_i\) é o número de demissões em \(t_i\). Antes de computar isso, vamos explorar nossa amostra.

Amostra

Vamos usar dados anonimizados da RAIS de 2017, mais especificamente do Acre. Já tive o trabalho de limpa-los e deixei o arquivo .Rds disponível no repositório do AZUL no github. Você pode puxar os dados diretamente do repositório para o R e deixo como exercício ao leitor o código que faz isso (se quiser o código porque não está conseguindo eu estou sempre disponível).

Vamos explorar a amostra.

library(ggplot2)
library(dplyr)
library(scales)

dim(dados)
## [1] 177358     54
dados %>%
  ggplot(aes(x = Idade)) +
  geom_histogram(fill = "#325ce7", binwidth = 1) 

dados %>%
  ggplot(aes(x = salario)) +
  geom_histogram(aes(y=..density..), fill = "#325ce7", binwidth = 50) +
  scale_y_continuous(labels = percent) +
  xlim(0, 10000)

dados %>%
  ggplot(aes(x = salario, fill = sexo)) +
  geom_histogram(binwidth = 50) +
  xlim(0, 10000)

dados %>%
  ggplot(aes(x = salario, fill = Graduacao)) +
  geom_histogram(binwidth = 50) +
  xlim(0, 10000)

dados %>%
  ggplot(aes(x = salario)) +
  geom_histogram(fill = "#325ce7", binwidth = 50) +
  xlim(0, 10000)+
  facet_wrap(~etnia)

dados %>%
  ggplot(aes(x = salario)) +
  geom_histogram(aes(y=..density..), fill = "#325ce7", binwidth = 150) +
  scale_y_continuous(labels = percent) +
  xlim(0, 10000)+
  facet_wrap(~setor)

Agora podemos começar a brincar mais e tentar encaixar curvas de sobrevivência aqui. Temos ferramentas para estima-las no pacote survival e podemos visualiza-las com o pacote survminer que implementa uma viz baseada em ggplot2.

library(survival)

fit_sexo = survfit(Surv(tempo_emprego, demissao) ~ sexo, data = dados)
fit_setor = survfit(Surv(tempo_emprego, demissao) ~ setor, data = dados)
fit_ensinosuperior = survfit(Surv(tempo_emprego, demissao) ~ Graduacao, data = dados)
fit_etnia = survfit(Surv(tempo_emprego, demissao) ~ etnia, data = dados)

library(survminer)

ggsurvplot(fit_sexo, conf.int = TRUE,
          palette = c("#91aded", "#e1476b"))

ggsurvplot(fit_setor, conf.int = TRUE)

ggsurvplot(fit_ensinosuperior, conf.int = TRUE)

ggsurvplot(fit_etnia, conf.int = TRUE)

Como esperado, trabalhadores agrícolas tem empregos mais curtos, diplomas de ensino superior normalmente levam a empregos mais longos e negros têm rotatividade maior.

O teste log-rank

Podemos nos perguntar, no entanto, se existe significância estatística nessas diferenças. Existem evidências para apoiar a tese de que duas curvas de sobrevivência são de fato diferentes? Podemos usar um teste não-paramétrico, o log-rank para responder essa pergunta. Ele é interessante porque não depende de hipóteses sobre a distribuição das curvas de sobrevivência. O procedimento é - tendo como hipótese nula que as duas curvas são iguais - comparar o número observado de eventos em cada grupo com o esperado caso a hipótese nula valesse. O pacote ``survival``` traz uma implementação desse teste.

survdiff(Surv(tempo_emprego, demissao) ~ sexo, data = dados)
## Call:
## survdiff(formula = Surv(tempo_emprego, demissao) ~ sexo, data = dados)
## 
##                    N Observed Expected (O-E)^2/E (O-E)^2/V
## sexo=Feminino  80793    19606    22066       274       532
## sexo=Masculino 96565    26517    24057       251       532
## 
##  Chisq= 532  on 1 degrees of freedom, p= 0

O p-valor do teste, menor que \(2^{-16}\), nos diz que podemos rejeitar a hipótese nula com considerável confiança, encontramos evidências estatisticamente significantes de que de fato as curvas de sobrevivência de homens e mulheres são diferentes. Convido o leitor a repetir o teste com outros recortes em mente.

O modelo de Riscos Proporcionais de Cox

Tendo \(h(t)\) como o risco no momento \(t\), \(h_o(t)\) como o risco base no período, \(\beta\) como um vetor de parâmetros e \(x\) como um vetor de \(k\) variáveis explicativas, esse modelo exprime a função risco da seguinte maneira:

\[h(t) = h_0(t) \times e^{\sum_{i=1}^k \beta_i x_i}\] Podemos estimar o vetor \(\beta\) com regressão linear se aplicarmos logarítimos no modelo, que passa a ser:

\[\ln{h(t)} = \ln{h_0(t)} + \sum_{i=1}^k \beta_i x_i\]

Esse modelo é dito de riscos proporcionais porque a forma funcional que assumimos implica que curvas de riscos de indivíduos são múltiplos umas das outras e que, portanto,não se cruzam. Nesse modelo existe independência temporal na razão de risco de quaisquer dois indivíduos da amostra. Podemos estimar os parâmetros facilmente com survival::coxph.

cox = coxph(Surv(tempo_emprego, demissao) ~ homem + horas + Idade + branco + negro + industria + agricultura + CNPJ + firma_grande + servicos + salario , data = dados)

summary(cox)
## Call:
## coxph(formula = Surv(tempo_emprego, demissao) ~ homem + horas + 
##     Idade + branco + negro + industria + agricultura + CNPJ + 
##     firma_grande + servicos + salario, data = dados)
## 
##   n= 177358, number of events= 46123 
## 
##                    coef  exp(coef)   se(coef)       z Pr(>|z|)    
## homem         4.935e-03  1.005e+00  9.959e-03   0.496   0.6202    
## horas        -1.402e-02  9.861e-01  7.075e-04 -19.822  < 2e-16 ***
## Idade        -5.357e-02  9.478e-01  5.367e-04 -99.804  < 2e-16 ***
## branco       -1.354e-01  8.733e-01  1.975e-02  -6.856 7.09e-12 ***
## negro         1.896e-02  1.019e+00  1.086e-02   1.746   0.0808 .  
## industria    -1.336e+00  2.630e-01  2.409e-02 -55.444  < 2e-16 ***
## agricultura  -4.521e-01  6.363e-01  3.443e-02 -13.131  < 2e-16 ***
## CNPJ          3.218e-01  1.380e+00  3.669e-02   8.770  < 2e-16 ***
## firma_grande -5.104e-01  6.002e-01  1.182e-02 -43.192  < 2e-16 ***
## servicos     -1.213e+00  2.973e-01  1.507e-02 -80.488  < 2e-16 ***
## salario      -2.093e-04  9.998e-01  4.039e-06 -51.805  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##              exp(coef) exp(-coef) lower .95 upper .95
## homem           1.0049     0.9951    0.9855    1.0248
## horas           0.9861     1.0141    0.9847    0.9874
## Idade           0.9478     1.0550    0.9468    0.9488
## branco          0.8733     1.1450    0.8402    0.9078
## negro           1.0191     0.9812    0.9977    1.0411
## industria       0.2630     3.8030    0.2508    0.2757
## agricultura     0.6363     1.5716    0.5948    0.6807
## CNPJ            1.3796     0.7249    1.2838    1.4824
## firma_grande    0.6002     1.6660    0.5865    0.6143
## servicos        0.2973     3.3634    0.2887    0.3062
## salario         0.9998     1.0002    0.9998    0.9998
## 
## Concordance= 0.736  (se = 0.001 )
## Rsquare= 0.175   (max possible= 0.998 )
## Likelihood ratio test= 34183  on 11 df,   p=0
## Wald test            = 29993  on 11 df,   p=0
## Score (logrank) test = 33199  on 11 df,   p=0

Se defirnimos a Razão de Risco \(r_i\) de \(i\)-ésima covariada como \(r_i := e^\beta_i\), então \(r_i > 1\) implica que a \(i\)-ésima covariada leva a um aumento no nível de risco e \(r_i < 1\) a uma diminuição. A tabela acima então deve ser capaz de responder algumas das perguntas que fizemos no primeiro parágrafo.