Utilizando o pacote microdatasus para realizar estudos epidemiológicos com dados do SUS

Pacote

De acordo com palavras dos autores, o pacote microdatasus se trata de um “algoritmo capaz de realizar o download e o pré-processamento de microdados fornecidos pelo Departamento de Informática do SUS (DATASUS) para diversos sistemas de informações em saúde para a linguagem de programação estatística R”1, o artigo ainda lista as bases disponíveis de cada sistema de informação do DATASUS e sua frequência de atualização:

Sim, é possível realizar o download manual destas bases de dados e sua importação direta pelo R, veja um exemplo. Porém, imagine que você deseja avaliar internações por infarto agudo do miocárdio atendidas em hospitais de Minas Gerais durante um perído de 10 anos. Como a base do SIH é mensal você teria que realizar o download de 120 bases individuais e depois unificar todas elas. Aqui entra a vantagem do pacote microdatasus ao automatizar todo este processo.

Instalação

Até a data da publicação deste tutorial o pacote não se encontrava nos repositórios oficiais do R, por isso, sua instalação precisa ser realizada pelo método recomendado pelo autor:

install.packages("remotes")
remotes::install_github("rfsaldanha/microdatasus")

Produzi dois tutoriais que podem te ajudar, eles estão disponíveis no YouTube aqui e aqui.

Estudo Ecológico

Objetivo: Avaliar a tendência temporal da taxa de mortalidade por infarto agudo do miocárdio na população residente de Mato Grosso entre 2017 e 2021.

#-------- Pacotes

library(tidyverse)
library(microdatasus)
library(hrbrthemes)

#-------- Download

dados <- fetch_datasus(information_system = "SIM-DO",                     # Sigla conforme tabela acima
                       year_start = 2017,                                 # Ano de início do estudo
                       year_end = 2021,                                   # Ano final do estudo
                       uf = "MT",                                         # Remover esta linha caso queira todo Brasil
                       vars = c("DTOBITO", "CODMUNRES", "CAUSABAS"))      # Remover esta linha caso queira todas as variáveis

#-------- Processamento

dados <- dados |> 
  mutate(DTOBITO = dmy(DTOBITO),                                          # Convertendo a variável para formato correto
         ANO = year(DTOBITO),                                             # Extraindo o ano do óbito
         UF = str_sub(CODMUNRES, end = 2)) |>                             # Extraindo o código da UF 
  filter(UF == "51",                                                      # Filtrando pela UF de interesse
         CAUSABAS == "I219")                                              # CID-10 da causa do óbito

#-------- Estimativa populacional

# Fonte: https://sidra.ibge.gov.br/tabela/6579

pop <- read_delim("https://sidra.ibge.gov.br/geratabela?format=br.csv&name=tabela6579.csv&terr=N&rank=-&query=t/6579/n3/51/v/all/p/last%205/l/,,p%2Bv%2Bt", 
                  skip = 2, delim = ";", n_max = 5, col_names = c("ANO", "VAR", "UF", "POP")) |> select(ANO, POP)

#-------- Cálculo da taxa

taxa <- dados |> 
  group_by(ANO) |>                                                        # Contabilizar por ano
  summarise(OBITO = length(CAUSABAS)) |>                                  # Quantificar o total de óbitos
  left_join(pop, by = "ANO") |>                                           # Reunir os dados da população
  mutate(TAXA = round(OBITO / POP * 100000, digits = 0))                  # Calcular a taxa a cada 100 habitantes com duas casas decimais 

#-------- Gráfico de tendência temporal

ggplot(taxa, aes(y = TAXA, x = ANO)) +
  geom_line(linewidth = 1) +
  geom_point(size = 5) +
  geom_text(aes(label = TAXA), vjust = -1.5) +
  scale_y_continuous(limits = c(0,40)) +
  labs(title = "Taxa de mortalidade por infarto agudo do miocárdio",
       subtitle = "População residente de Mato Grosso",
       y = "Óbitos a cada 100.000 pessoas",
       x = "Ano do óbito") +
  theme(panel.grid.minor.x = element_blank(),
        panel.grid.minor.y = element_blank(),
        axis.title.x = element_text(size = 12),
        axis.title.y = element_text(size = 12))

Conclusão: O risco de óbito por infarto agudo do miocárdio na população matogrossense encontra-se estabilizada entre os anos de 2017 e 2021.

Estudo Transversal

Objetivo: Avaliar o impacto da realização de angioplastia com implante de stent sobre o risco de óbito entre pacientes com idade entre 20 e 80 anos hospitalizados por angina instável em São Paulo entre janeiro e abril de 2023.

#-------- Pacotes

library(tidyverse)
library(microdatasus)
library(hrbrthemes)

#-------- Download

dados <- fetch_datasus(information_system = "SIH-RD",                     # Sigla conforme tabela acima
                       year_start = 2023,                                 # Ano de início do estudo
                       year_end = 2023,                                   # Ano final do estudo
                       month_start = 1,                                   # Mês de início do estudo
                       month_end = 4,                                     # Mês final do estudo
                       uf = "SP")                                         # Remover esta linha caso queira todo Brasil

#-------- Processamento

dados <- dados |> 
  mutate(NASC = ymd(NASC),                                                                                # Convertendo para formato date
         DT_INTER = ymd(DT_INTER),                                                                        # Convertendo para formato date
         IDADE = round(as.numeric((DT_INTER - NASC) / 365.25), digits = 2),                               # Calculando idade
         FAIXAET = case_when(IDADE >= 20 & IDADE < 40 ~ "20-39 anos",                                     # Criando faixa etária
                             IDADE >= 40 & IDADE < 60 ~ "40-59 anos",
                             IDADE >= 60 & IDADE <= 80 ~ "60-80 anos"),
         SEXO = case_when(SEXO == "1" ~ "Masculino",                                                      # Rotulando variável categórica
                          SEXO == "3" ~ "Feminino"),
         UTI = case_when(MARCA_UTI == "00" ~ "Não",                                                       # Identificando uso de UTI
                         TRUE ~ "Sim"),
         STENT = case_when(PROC_REA == "0406030030" ~ "Realizou",                                         # Conforme tabela SIGTAP
                           TRUE ~ "Não realizou"),
         STENT = fct_relevel(STENT, c("Não realizou", "Realizou")),
         TEMPOINT = case_when(DIAS_PERM > median(DIAS_PERM) ~ str_glue("> {median(DIAS_PERM)} dias"),     # Categorizando permanência pela mediana
                              TRUE ~ str_glue("<= {median(DIAS_PERM)} dias")),
         MORTE = factor(MORTE,                                                                            # Definindo desfecho como factor
                        levels = c(0, 1),
                        labels = c("Alta", "Óbito")),
         CAR_INT = case_when(CAR_INT == "01" ~ "Eletivo",                                                 # Rotulando variável categórica
                             CAR_INT == "02" ~ "Urgência")) |>                              
  filter(DIAG_PRINC == "I200") |>                                                                         # Filtrando pela causa do óbito
  select(FAIXAET, SEXO, UTI, STENT, TEMPOINT, MORTE, CAR_INT) |>                                          # Selecionando as variáveis de interesse
  drop_na(FAIXAET)                                                                                        # Excluindo pacientes fora da idade de interesse

#-------- Regressão logística

labelled::var_label(dados) <- list(FAIXAET  = "Faixa etária",                                             # Criando rótulos para os nomes das variáveis
                                   SEXO     = "Sexo", 
                                   UTI      = "Utilizou UTI", 
                                   STENT    = "Angioplastia", 
                                   TEMPOINT = "Tempo de internação", 
                                   MORTE    = "Evolução", 
                                   CAR_INT  = "Caráter da internação")

forestmodel::forest_model(glm(MORTE ~ 
                                FAIXAET +
                                SEXO + 
                                UTI + 
                                STENT + 
                                TEMPOINT + 
                                CAR_INT, 
                              family = binomial(), 
                              data = dados))

Conclusão: A realização do procedimento de angioplastia coronariana com implante de stent reduziu o risco de óbito em 78%, independentemente da faixa etária, sexo, utilização de UTI, tempo de internação e caráter da hospitalização.

Estudo Coorte

Objetivo: Estimar a probabilidade de sobrevida hospitalar de 30 dias em idosos internados por pneumonia em Mato Grosso em 2022.

#-------- Pacotes

library(tidyverse)
library(microdatasus)
library(survival)
library(ggsurvfit)

#-------- Download

dados <- fetch_datasus(information_system = "SIH-RD",                     
                       year_start = 2022,                                 
                       year_end = 2022,                                  
                       month_start = 1,                              
                       month_end = 12,                                
                       uf = "MT",
                       vars = c("NASC", "DT_INTER", "DIAS_PERM", 
                                "DIAG_PRINC", "MORTE", "CAR_INT"))

#-------- Processamento

dados <- dados |> 
  mutate(NASC = ymd(NASC),                                                                                
         DT_INTER = ymd(DT_INTER),                                                                       
         IDADE = round(as.numeric((DT_INTER - NASC) / 365.25), digits = 2),
         FAIXAET = case_when(IDADE >= 60 & IDADE < 80 ~ "60-79 anos",                                     
                             IDADE >= 80 & IDADE < 100 ~ "80-99 anos"),
         DIAS_PERM = replace(DIAS_PERM, DIAS_PERM == 0, 1),                               # Esta análise não aceita tempo zero
         CAR_INT = case_when(CAR_INT == "01" ~ "Eletivo",                                                
                             CAR_INT == "02" ~ "Urgência"),
         GRUPO_CID = str_sub(DIAG_PRINC, end = 3)) |>                              
  filter(GRUPO_CID == "J18", 
         IDADE >= 60,
         DIAS_PERM <= 30)

#-------- Curva de Kaplan-Meier global

survfit(Surv(DIAS_PERM, MORTE) ~ 1, data = dados) |> 
  gtsummary::tbl_survfit(probs = 0.5,
                         label_header = "**Mediana (IC95%)**")
Characteristic Mediana (IC95%)
Overall 27 (23, —)
survfit(Surv(DIAS_PERM, MORTE) ~ 1, data = dados) |> 
  ggsurvfit() +
  add_confidence_interval() +
  add_risktable() +
  labs(y = "Probabilidade de sobrevida",
       x = "Dias de permanência")

#-------- Curva de Kaplan-Meier por diagnóstico

survfit2(Surv(DIAS_PERM, MORTE) ~ FAIXAET, data = dados) |> 
  ggsurvfit() +
  add_confidence_interval() +
  add_pvalue("annotation", size = 4) +
  labs(y = "Probabilidade de sobrevida",
       x = "Dias de permanência",
       title = "Probabilidade de sobrevida segundo utilização de UTI")

Conclusão: Metade dos idosos hospitalizados por pneumonia em Mato Grosso no ano de 2022 evoluíram para óbito com 27 dias de internação hospitalar. Idosos com idade entre 80 e 99 anos apresentaram probabilidade de sobrevida estatisticamente menor que idosos com idade entre 60 e 79 anos.


  1. Saldanha RF, Bastos RR, Barcellos C. Microdatasus: pacote para download e pré-processamento de microdados do Departamento de Informática do SUS (DATASUS). Cad. Saúde Pública 2019;35(9) https://www.scielo.br/j/csp/a/gdJXqcrW5PPDHX8rwPDYL7F/?format=pdf&lang=pt↩︎