Como funciona análise de sobrevivência?

Na jurimetria, estudos prospectivos são muito comuns. Esses estudos envolvem a análise de processos judiciais a partir da data de distribuição (data de nascimento), e acompanham os casos até seu desfecho (sentença, acórdão, trânsito em julgado, etc).

Nessas pesquisas, é muito comum que uma parte dos casos analisados ainda esteja ativa no momento da coleta. Como não existe uma data de desfecho, não temos uma forma direta de calcular o tempo até o desfecho. Chamamos esse fenômeno de censura.

A solução mais direta para esse problema seria descartar os casos com informação incompleta. No entanto, isso é uma solução ruim, pois faz com que nossas estimativas subestimem os reais tempos do processo. Isso acontece pois estamos jogando fora a seguinte a informação de que os processos duraram até agora.

É nesses momentos que a modelagem estatística nos salva! A análise de sobrevivência e a análise de confiabilidade são áreas da estatística que lidam com informação censurada. Utilizando técnicas simples e algumas suposições sobre o mecanismo gerador dos dados, é possível levar em conta a informação censurada adequadamente e produzir análises confiáveis, mesmo com informação incompleta.

Por isso, lembre-se: sempre que trabalhar com estudos prospectivos e quiser calcular tempos de processos, considere utilizar modelos de análise de sobrevivência.

Exemplo no R:

library(tidyverse)
library(survival)
# Base de dados do observatório da Insolvência do Rio de Janeiro
# A base completa está disponível apenas para patrocinadores do projeto
da_rj <- obsRJRJ::da_processo_tidy %>%
  transmute(
    # identifica se houve ou não uma decisão de deferimento
    morreu = deferido != "Aguardando decisão" & 
               !is.na(data_decisao_deferimento),
    tempo = case_when(
      # se houve uma decisao, o tempo é calculado diretamente
      morreu ~ as.numeric(data_decisao_deferimento - data_dist),
      # se não, o tempo censurado é calculado 
      # a partir da data de coleta dos dados
      TRUE ~ as.numeric(data_hora - data_dist)
    )
  )

# mediana jogando fora os casos censurados
da_rj %>% 
  filter(morreu) %>% 
  with(median(tempo))
#> [1] 38

# mediana considerando os casos censurados
modelo_surv <- survfit(Surv(tempo, morreu) ~ 1, data = da_rj)
broom::glance(modelo_surv)$median
#> [1] 59.5

Created on 2021-02-09 by the reprex package (v0.3.0)

Se quiser saber mais, essa apresentação das professoras Lane Alencar e Gisela Tunes do IME-USP é bastante instrutiva.