No SourceForge:
knitr::opts_chunk$set( collapse = TRUE, comment = NULL, fig.path = "man/figures/README-", out.width = "100%" )
Pacote em R para a classificação de códigos da CID-10 (Classificação Internacional de Doenças, 10ª Revisão) segundo a Lista Brasileira de Internações por Condições Sensíveis à Atenção Primária (ICSAP). É particularmente voltado ao trabalho com as bases de dados do Sistema de Informações Hospitalares do SUS, o Sistema Único de Saúde brasileiro. Tais bases (BD-SIH/SUS) contêm os "arquivos da AIH" (RD??????.DBC
), que podem ser expandidos para o formato DBF (RD??????.DBF
), com as informações de cada hospitalização ocorrida pelo SUS num período determinado. Assim, embora o pacote permita a classificação de qualquer listagem de códigos da CID-10, tem também algumas funcionalidades para facilitar o trabalho com os "arquivos da AIH" e, atualmente, do Sistema de Informações sobre Mortalidade (SIM).
A hospitalização por CSAP é um indicador da efetividade do sistema de saúde em sua primeira instância de atenção, uma vez que a internação por tais condições ---pneumonia, infecção urinária, sarampo, diabetes etc.--- só acontecerá se houver uma falha do sistema nesse âmbito de atenção, seja por não prevenir a ocorrência da doença (caso das doenças evitáveis por vacinação, como o sarampo), não diagnosticá-la ou tratá-la a tempo (como na pneumonia ou infeccão urinária) ou por falhar no seu controle clínico (como é o caso da diabete). [@Nedel2011]
O Ministério da Saúde brasileiro estabeleceu em 2008, após amplo processo de validação, uma lista com várias causas de internação hospitalar consideradas CSAP, definindo em portaria a Lista Brasileira. [@MS2008lista;@Alfradique2009] A Lista envolve vários códigos da CID-10 e classifica as CSAP em 19 subgrupos de causa, o que torna complexa e trabalhosa a sua decodificação. Há alguns anos o Departamento de Informática do SUS (DATASUS) incluiu em seu excelente programa de tabulação de dados TabWin a opção de tabulação por essas causas, apresentando sua frequência segundo a tabela definida pelo usuário.
Entretanto, muitas vezes a pesquisa exige a classificação de cada internação individual como uma variável na base de dados. [@Nedel2008] E não conheço outro programa ou script (além do que tive de escrever em minha tese [@NedelTese]) que automatize esse trabalho.
O pacote csapAIH
pode ser instalado no R de diferentes maneiras:
baixando o arquivo em de instalação no SourceForge e depois instalando no R, com a IDE de preferência ou com o comando install.packages("csapAIH_<versão>.tar.gz")
ou install.packages("csapAIH_<versão>.zip")
;
com a função install.packages()
sobre os arquivos de instalação no SourceForge:
# arquivos .tar.gz install.packages("https://sourceforge.net/projects/csapaih/files/<versão>.tar.gz/download", type = "source", repos = NULL) # arquivos .zip install.packages("https://sourceforge.net/projects/csapaih/files/<versão>.zip/download", type = "source", repos = NULL)
ou
remotes
sobre os arquivos-fonte do pacote em desenvolvimento, no GitHub:# install.packages("remotes") # desnecessário se o pacote já estiver instalado remotes::install_github("fulvionedel/csapAIH")
Na sua primeira versão [@Nedel2017], o pacote csapAIH
continha apenas uma função, homônima: csapAIH
.
Na versão 0.0.2, foram acrescentadas as funções descreveCSAP
, desenhaCSAP
e nomesgruposCSAP
, para a representação gráfica e tabular das CSAP pela lista brasileira. Esta versão também permite a leitura de arquivos da AIH em formato .DBC, sem necessidade de prévia expansão a .DBF. Isso é possível pelo uso do pacote read.dbc
, de Daniela Petruzalek (https://cran.r-project.org/web/packages/read.dbc/index.html).
A partir da versão 0.0.3 [@Nedel2019], a função desenhaCSAP
permite o detalhamento do gráfico por categorias de outros fatores do banco de dados, com o uso das funções facet_wrap()
e facet_grid()
, de ggplot2
, e permite ainda o desenho de gráficos com as funções básicas, sem a instalação do pacote ggplot2
. Foi ainda criada uma função para o cálculo da idade nos arquivos da AIH: a função idadeSUS
é usada internamente por csapAIH
e pode ser chamada pelo usuário para calcular a idade sem a necessidade de classificar as CSAP.
Na versão 0.0.4, a função csapAIH
oferece a opção de classificação das CSAP em 20 grupos de causa, conforme proposto no processo de construção da Lista Brasileira [@Alfradique2009]. Essa é a lista sugerida pela Organização Panamericana da Saúde [@OPS2014]. As funções desenhaCSAP
e tabCSAP
têm um argumento para seleção do idioma dos nomes de grupos, em português (pt
, padrão), espanhol (es
) ou inglês (en
).
Foram criadas as funções ler_popbr
e popbr2000_2021
(esta sobre o pacote brpop de @brpopref) para acesso às estimativas populacionais publicadas pelo DATASUS e funções para categorização da idade em faixas etárias. Foi ainda criada uma função (fetchsap
) a partir da função fetchdatasus
do pacote microdatasus
[@Saldanha2019], para ler os arquivos no site FTP do DATASUS e classificar as CSAP em um único comando. Foram criadas outras funções para facilitar o manejo e apresentação de dados em estudos ecológicos, como a categorização da idade em faixas etárias (fxetar_quinq
e fxetar3g
) e a identificação dos diagnósticos de parto (partos
), particularmente para o Brasil e os arquivos do DATASUS, como a listagem das Unidades da Federação do país (ufbr
) e a lista de procedimentos obstétricos em internações por eventos não mórbidos (procobst
).
A ajuda sobre o pacote oferece mais detalhes sobre as funções e seu uso. Veja no manual ou, no R, com ?'csapAIH-package'
.
A leitura de arquivos .DBC exige a instalação prévia do pacote read.dbc
[@readdbc]. Sua falta não impede o funcionamento das demais funções do pacote (inclusive de leitura de arquivos em outro formato). A função desenhaCSAP
tem melhor desempenho com o pacote ggplot2
instalado, mas sua instalação não é necessária para que ela funcione. A função popbr2000_2021
usa o pacote dplyr
, que é importado. O pacote haven
também é importado. Hmisc
não o é mais.
library(dplyr) # facilitar o trabalho library(csapAIH)
É possível classificar as CSAP diretamente a partir de arquivos com extensão .DBC, .DBF, ou .CSV, sem necessidade da leitura prévia dos dados. Para outras extensões de arquivo é necessária a prévia importação dos dados para um objeto de classe data.frame
.
Através de seu site FTP, o DATASUS disponibiliza dados de diferentes Sistemas de Informação em Saúde do SUS, em arquivos comprimidos de extensão DBC. Os arquivos podem ser baixados na página de transferência de arquivos do DATASUS e expandidos para DBF ou CSV (entre várias outras possibilidades de manejo) pelo TabWin, disponível na mesma página. Graças ao pacote read.dbc, de Daniela Petruzalek, também podemos ler os arquivos comprimidos do DATASUS no R, e graças ao pacote microdatasus, de Raphael Saldanha [@Saldanha2019], podemos ler com facilidade esses arquivos na internet, sem necessidade de download.
O código abaixo cria um banco com as informações das AIHs do "ano de competência" 2021 ocorridas no RS e outro com as informações das Declarações de Óbito (DO) de residentes no RS ocorridas em 2021:
# remotes::install_github("rfsaldanha/microdatasus") # desnecessário se o pacote estiver instalado AIHRS2021 <- microdatasus::fetch_datasus(year_start = 2021, 1, 2021, 12, uf = "RS", information_system = "SIH-RD") nrow(AIHRS2021) |> Rcoisas::formatL(digits = 0) # linhas ncol(AIHRS2021) # colunas DORS2021 <- microdatasus::fetch_datasus(year_start = 2021, year_end = 2021, uf = "RS", information_system = "SIM-DO") nrow(DORS2021) |> Rcoisas::formatL(digits = 0) ncol(DORS2021)
Se o arquivo de dados estiver armazenado no computador, basta digitar, entre aspas, o nome do arquivo --- com o "path" se o arquivo estiver em diretório diferente daquele da sessão de trabalho ativa (neste exemplo, num sub-diretório do diretório de trabalho da sessão ativa, chamado 'data-raw').
csap.dbc <- csapAIH("data-raw/RDRS1801.dbc") csap.dbf <- csapAIH("data-raw/RDRS1801.dbf")
sep
.csap.csv <- csapAIH("data-raw/RDRS1801.csv", sep = ",")
A função fetchcsap
facilita o trabalho sobre os arquivos da AIH:
csap.ftp <- fetchcsap('RS', 2018)
Os extratos são iguais:
all.equal(attributes(csap.dbc)$resumo, attributes(csap.dbf)$resumo) all.equal(attributes(csap.dbc)$resumo, attributes(csap.csv)$resumo) all.equal(attributes(csap.ftp)$resumo, attributes(csap.dbc)$resumo)
# Limpar o ambiente de trabalho, renomear um dos bancos de dados: csap <- csap.ftp rm(csap.csv, csap.dbc, csap.dbf, csap.ftp)
read.csv("data-raw/RDRS1801.csv") |> # criar o data.frame csapAIH() |> glimpse()
Mude o argumento sihsus
para FALSE
e indique no argumento cid
qual variável contém os códigos diagnósticos. As variáveis csap
e grupo
(se csapAIH(..., grupos = TRUE, ...)
) são acrescentadas ao final do banco de dados alvo da função.
data("eeh20") # Amostra da "Encuesta de egresos hospitalarios" do Equador, ano 2020 names(eeh20) # Os nomes das variáveis
A variável cau_cie10
(posição r which(names(eeh20) == 'cau_cie10')
) tem o código do diagnóstico de internação. A função csapAIH acrescenta à base duas (se grupo == TRUE
) variáveis, csap
e grupo
, dispostas nas últimas colunas (posição r paste(which(names(eeh20) == 'csap'), "e", which(names(eeh20) == 'grupo'), "respectivamente.")
)
csap.eeh20 <- csapAIH(eeh20, sihsus = FALSE, cid = cau_cie10) names(csap.eeh20) csap.eeh20[c(30,37:38)] |> head(3)
A variável CAUSABAS
tem o código da causa básica do óbito.
De modo semelhante à AIH, as bases de dados da DO também têm a idade codificada e não a verdadeira idade da pessoa. Por exemplo, a variável IDADE
em DORS2021
é um factor
com r nlevels(DORS2021$IDADE)
níveis, em que o primeiro é r levels(DORS2021$IDADE)[1] |> sQuote()
e o último é r levels(DORS2021$IDADE)[nlevels(DORS2021$IDADE)] |> sQuote()
. Neste caso podemos usar a função idadeSUS
para computar a idade, mas como o resultado de idadeSUS
é "um objeto da classe data frame com três variáveis" (v. ?idadeSUS
), necessitamos a função unnest
(de tidyr
) para desagrupar as variáveis antes de inseri-las em DORS2021
. Além disso, foi excluída (com unnest(...)[-2]
) a "faixa etária detalhada", que é a segunda variável no output de idadeSUS
.
DORS2021 <- DORS2021 %>% csapAIH(sihsus = FALSE, cid = CAUSABAS, parto.rm = FALSE) %>% mutate(tidyr::unnest(idadeSUS(DORS2021, sis = "SIM"), cols = c())[-2], fxetar3 = fxetar3g(idade), SEXO = factor(SEXO, levels = c(1,2), labels = c("masc", "fem"))) DORS2021[1:3, (ncol(DORS2021)-5):ncol(DORS2021)]
cids <- aih100$DIAG_PRINC[1:10] cids csapAIH(cids)
Um resumo de importação, apresentado durante a realização do trabalho, é guardado como atributo do banco de dados e pode ser recuperado com as funções attr()
ou attributes()
:
attr(csap, "resumo") # attributes(csap)$resumo
Em tabela para apresentação:
attributes(csap)$resumo |> knitr::kable(format.args = c(big.mark = ".", decimal.mark = ","), col.names = c("Ação", "N", "%", "Objeto") ) |> suppressWarnings()
A função descreveCSAP
gera, a partir de um comando muito simples, uma tabela pronta para apresentação, com as frequências brutas e absolutas das CSAP por grupo de causa.
descreveCSAP(csap)
descreveCSAP(csap) |> knitr::kable(align = c('l', rep('r', 3)))
Entretanto, ao transformar os valores para o formato latino, sua classe se transforma em character
e assim é impossível realizar cálculos com esse output. Além disso, não serve para publicações em inglês. Por isso a função descreveCSAP
permanecerá no pacote mas seu desenvolvimento seguirá em outra função, agora de nome tabCSAP
. Nessa nova função, a apresentação de uma tabela formatada se faz a partir do argumento format = TRUE
. Por padrão esse argumento é FALSE
, o que permite operações matemáticas com os valores da tabela (um data.frame
, na verdade), como veremos em seguida.
A função tabCSAP
permite também a apresentação da tabela em inglês ou espanhol, através do argumento lang
:
tabCSAP(csap$grupo, digits = 1, lang = "en", format = T) |> knitr::kable(align = c('l', rep('r', 3))) tabCSAP(csap$grupo, digits = 1, lang = "es", format = T) |> knitr::kable(align = c('l', rep('r', 3)))
Finalmente, vimos que a função tabCSAP
permite ainda a apresentação da lista em 20 grupos de causa. Assim, se as CSAP foram classificadas em 20 grupos -- usando, por exemplo o argumento lista = "Alfradique"
em csapAIH()
--, essa tabela deve ser apresentada com tabCSAP
e não com descreveCSAP
. Note ainda que, à diferença de descreveCSAP
, tabCSAP
exige o nome da variável com o grupo de causas.
listaOPS <- csapAIH(AIHRS2021, lista = "Alfradique") # descreveCSAP(listaOPS) # Retorna o erro: "O vetor precisa ter os 19 grupos da Lista Brasileira. # Se essa for a lista 'Alfradique' use 'tabCSAP'."" tabCSAP(listaOPS$grupo)
Exemplo: cálculo das taxas brutas de ICSAP por grupo de causa em Cerro Largo, RS, 2021:
O código IBGE (os seis primeiros dígitos) de Cerro Largo é "430520".
Selecionamos as informações sobre residentes de Cerro Largo em nosso banco de dados da AIH em 2021.
claih <- AIHRS2021 %>% filter(MUNIC_RES == "430520") %>% droplevels() %>% csapAIH()
Desde que o DATASUS interrompeu a publicação dos arquivos com as estimativas populacionais por sexo e faixa etária para os municípios brasileiros (último arquivo no FTP é da população em 2012), passou a ser necessária a tabulação no TABNET e posterior leitura dos dados no programa de análise. Ano passado (2022) Raphael Saldanha dispôs-se ao trabalho de fazer as muitas tabulações necessárias e nos brindou outro excelente e muito esperado pacote preenchendo essa lacuna: brpop, com as as estimativas da população por sexo e faixa etária para os municípios brasileiros, de 2000 a 2021 (Nota técnica).
Entretanto, as tabelas no pacote brpop têm o total (a soma da população nas diferentes faixas etárias), e os rótulos das faixas etárias são longos e estão em inglês, por isso resolvi criar outra função (popbr2000_2021
) que retornasse a população com os rótulos em português e apenas com a população estimada em cada faixa etária (sem o total). Assim, a população estimada para Cerro Largo em 2021 foi capturada com o seguinte comando,
clpop <- csapAIH::popbr2000_2021(2021, munic = "430520")
Com o pacote brpop, teríamos de acrescentar o filtro de exclusão da categoria "Total" na faixa etária e os resultados seriam os mesmos, porém com outra estrutura do objeto e outros rótulos de categorias:
clpop %>% group_by(fxetar5, sexo) %>% summarise(pop = sum(pop)) %>% tidyr::pivot_wider(names_from = sexo, values_from = pop) brpop::mun_sex_pop() %>% filter(mun == "430520", year == 2021, age_group != "Total") %>% group_by(age_group, sex) %>% summarise(pop = sum(pop)) %>% tidyr::pivot_wider(names_from = sex, values_from = pop)
cte <- 1e5 tabCSAP(claih$grupo) %>% mutate(taxa = casos / sum(clpop$pop)*cte) %>% knitr::kable(format.args = list(decimal.mark = ",", big.mark = "."), digits = 1, caption = paste("ICSAP em Cerro Largo, RS, 2021. Taxas por", Rcoisas::formatL(cte, digits = 0), "hab."))
gr <- desenhaCSAP(csap, titulo = "auto", onde = "RS", quando = 2018, limsup = .18) gr
Observe que ao estratificar o gráfico mantém a ordenação por frequência da variável em seu todo, sem a estratificação, quando o argumento ordenar = TRUE
(padrão).
rot <- ggplot2::as_labeller(c("masc" = "Masculino", "fem" = "Feminino", "(all)" = "Total")) gr + ggplot2::facet_grid(~ sexo, margins = TRUE, labeller = rot) gr + ggplot2::facet_wrap(~ munres == "431490", labeller = ggplot2::as_labeller(c("FALSE" = "Interior", "TRUE" = "Capital")))
DORS2021 %>% filter(!is.na(SEXO)) %>% desenhaCSAP(x.size = 7, y.size = 8) + ggplot2::facet_grid(SEXO ~ fxetar3)
Veja o manual do pacote em: https://github.com/fulvionedel/csapAIH/blob/master/docs/csapAIH_0.0.4.4.pdf
Agradeço a todxs os usuárixs do pacote, particularmente a quem informa problemas e sugere mudanças, como \@laiovictor e \@igortadeu, e (muito!!) a quem apresenta soluções, como \@denis-or.
E, sempre, meus profundos agradecimentos a
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.