3. Avaliando a consistência dos dados

A avaliação de consistência dos dados é uma etapa rotineira e essencial do profissional de vigilância em saúde. Nela, os dados são checados para verificação de sua coerência. Esta análise de consistência permite a melhoria no rastreamento e monitoramento das doenças, agravos e outros eventos em saúde pública.

Nesta etapa você permanecerá utilizando o pacote dplyr que está contido no universo do metapacote tidyverse. O pacote dplyr oferece muitos recursos para transformação de bases de dados, seja ela necessária nas colunas (variáveis) ou nas linhas (registros). No quadro abaixo listamos as funções mais utilizadas no pacote dplyr:



Atenção

O pacote dplyr oferece muitos recursos para transformação de bases de dados e suas funções nos remetem a ações comuns, os chamados ‘verbos’.

Lembre-se que o profissional de vigilância do Estado de Rosas necessita avaliar os casos de hepatites virais e, para isso ele precisará examinar os dados e escolher as variáveis adequadas para análise, corrigindo distorções ou informações inadequadas.

O primeiro passo para avaliar a consistência dos dados é importar o banco de dados do Sinan Net {NINDINET.dbf} disponível no menu lateral “Arquivos”, Ambiente Virtual do curso. Aqui chamaremos o objeto da análise de {base}. Observe os comandos abaixo e replique-os em seu RStudio:


# Criando o objeto {`base`} que armazenará o banco de dados {`NINDINET.dbf`}
base <- read.dbf(file = 'Dados/NINDINET.dbf', as.is = TRUE)

Digitando a função glimpse() você conseguirá visualizar a área inicial do banco de dados. Com este comando será possível visualizar o número de linhas da sua tabela (Rows: 27,621), o número de variáveis (Columns: 62), o nome de cada coluna, o tipo de dado da variável e os registros iniciais contidos em cada variável. Veja o script e replique-o em seu RStudio:

# Visualizando o número de linhas e colunas com a função `glimpse()`
glimpse(base)
#> Rows: 27,621
#> Columns: 62
#> $ NU_NOTIFIC <chr> "7671320", "0855803", "8454645", "3282723", "9799526", "727…
#> $ TP_NOT     <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
#> $ ID_AGRAVO  <chr> "A509", "W64", "X58", "A90", "B19", "A90", "A90", "Y09", "A…
#> $ CS_SUSPEIT <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ IN_AIDS    <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ CS_MENING  <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ DT_NOTIFIC <date> 2012-04-11, 2010-09-17, 2010-10-19, 2008-04-14, 2011-06-20…
#> $ SEM_NOT    <chr> "201215", "201037", "201042", "200816", "201125", "200807",…
#> $ NU_ANO     <int> 2012, 2010, 2010, 2008, 2011, 2008, 2007, 2011, 2008, 2011,…
#> $ SG_UF_NOT  <int> 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,…
#> $ ID_MUNICIP <int> 610213, 610213, 610213, 610213, 610213, 610213, 610213, 610…
#> $ ID_REGIONA <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ ID_UNIDADE <int> 256100, 180142, 559191, 180142, 480722, 570404, 319816, 289…
#> $ DT_SIN_PRI <date> 2012-04-05, 2010-09-09, 2010-10-19, 2008-04-11, 2011-04-02…
#> $ SEM_PRI    <chr> "201214", "201036", "201042", "200815", "201113", "200806",…
#> $ DT_NASC    <date> 2012-04-04, 1988-04-23, 1971-03-25, 1928-05-29, 2002-09-18…
#> $ NU_IDADE_N <int> 2001, 4022, 4039, 4079, 4008, 4054, 4032, 4014, 4037, 4011,…
#> $ CS_SEXO    <chr> "M", "M", "M", "F", "M", "F", "F", "F", "F", "F", "M", "M",…
#> $ CS_GESTANT <int> 6, 6, 6, 9, 6, 9, 9, 9, 6, 5, 6, 6, 6, 6, 9, 9, 9, 9, 6, 5,…
#> $ CS_RACA    <int> 4, 1, NA, 4, 4, 9, NA, 1, 9, 4, NA, 9, NA, NA, 9, NA, 1, 9,…
#> $ CS_ESCOL_N <chr> "10", NA, NA, "02", "01", "09", NA, "09", "09", "01", "10",…
#> $ SG_UF      <int> 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,…
#> $ ID_MN_RESI <int> 610213, 610213, 610250, 610213, 610250, 610213, 610213, 610…
#> $ ID_RG_RESI <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ ID_DISTRIT <chr> "05", "05", "05", "01", "01", "04", "05", "04", "01", "04",…
#> $ ID_BAIRRO  <chr> "020", "019", "020", "001", "001", "014", "020", "012", "00…
#> $ ID_LOGRADO <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ ID_GEO1    <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ ID_GEO2    <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ CS_ZONA    <int> 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, …
#> $ ID_PAIS    <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
#> $ NDUPLIC_N  <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ IN_VINCULA <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ DT_INVEST  <date> NA, NA, 2010-10-19, 2008-04-14, 2011-06-20, NA, NA, NA, 20…
#> $ ID_OCUPA_N <chr> NA, NA, NA, NA, "999991", NA, NA, NA, NA, NA, NA, NA, NA, N…
#> $ CLASSI_FIN <int> NA, NA, NA, 5, 1, 8, 8, 1, 1, NA, 8, 1, 8, 8, 1, NA, 1, 8, …
#> $ CRITERIO   <int> NA, NA, NA, 1, NA, NA, NA, NA, 2, NA, NA, 1, NA, NA, 2, NA,…
#> $ TPAUTOCTO  <int> NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, 1, NA, NA, NA, N…
#> $ COUFINF    <int> NA, NA, NA, NA, NA, NA, NA, NA, 61, NA, NA, 61, NA, NA, NA,…
#> $ COPAISINF  <int> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,…
#> $ COMUNINF   <int> NA, NA, NA, NA, NA, NA, NA, NA, 610213, NA, NA, 610213, NA,…
#> $ CODISINF   <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ CO_BAINFC  <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0…
#> $ NOBAIINF   <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ DOENCA_TRA <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ EVOLUCAO   <int> 1, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, 1, NA, NA, NA, NA…
#> $ DT_OBITO   <date> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
#> $ DT_ENCERRA <date> NA, 2010-10-16, 2010-10-19, 2008-06-19, 2011-06-20, 2008-0…
#> $ DT_DIGITA  <date> 2012-11-09, 2010-11-17, 2011-03-14, 2008-04-24, 2011-09-14…
#> $ DT_TRANSUS <date> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
#> $ DT_TRANSDM <date> NA, NA, NA, NA, NA, NA, NA, NA, 2008-07-10, NA, NA, NA, NA…
#> $ DT_TRANSSM <date> 2012-11-13, 2010-11-23, 2011-04-12, 2010-11-16, 2011-09-19…
#> $ DT_TRANSRM <date> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
#> $ DT_TRANSRS <date> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
#> $ DT_TRANSSE <date> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
#> $ NU_LOTE_V  <chr> "2012049", "2010047", "2011015", "2010044", "2011038", "201…
#> $ NU_LOTE_H  <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ CS_FLXRET  <int> 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
#> $ FLXRECEBI  <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
#> $ MIGRADO_W  <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ CO_USUCAD  <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ CO_USUALT  <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…

Você deve ter observado que o comando glimpse(base) retornou três tipos de dados das colunas estudadas: <chr>, <date> e <int>. Os dados do tipo <chr> são letras ou textos como “a” “b” “c” “d”, os do tipo <date> se referem a datas como “2012-11-13” “2010-11-23” e os dados do tipo <int> se referem a números gerais como “2001” “7” “22”.

Será muito importante que no processo de utilização do R você fique atento ao tipo de dado das tabelas utilizadas.


3.1 Selecionado as variáveis que serão analisadas

Você deve verificar que o objeto {base} foi criado a partir do arquivo {NINDINET.dbf}, que possui 62 variáveis. No entanto, para o exercício de análise do Estado de Rosas utilizaremos apenas as variáveis de interesse. Assim faremos um exercício neste tópico no qual reduziremos as colunas desta tabela para apenas 6 colunas com as variáveis epidemiológicas necessárias: Data da notificação (DT_NOTIFIC), Data de nascimento (DT_NASC), Sexo (CS_SEXO), Raça/cor (CS_RACA), Código do município de residência (ID_MN_RESI) e Código do CID10 do agravo notificado (ID_AGRAVO).

Para esta ação utilizaremos a função select(), que tem por objetivo selecionar variáveis de interesse para serem analisadas. Os argumentos principais da função select() são:

  • a tabela de origem dos dados (data.frame, tibble, etc),
  • os nomes das colunas que devem ser selecionadas.

Após aplicá-la, você terá como resultado uma tabela apenas com as variáveis escolhidas, ou seja, um recorte contendo todos os registros (linhas e/ou valores) do banco de dados, porém apenas com as seis variáveis (colunas) selecionadas.

Vamos praticar! Criaremos uma nova tabela apenas com seis variáveis escolhidas que chamaremos de {base_menor}. Esta tabela armazenará o objeto {base} que possui o banco de dados NINDINET ({NINDINET.dbf}) com as notificações do Estado de Rosas. Execute o seguinte comando e replique-o em seu RStudio:

# Criando a tabela {`base_menor`} e selecionado colunas específicas
base_menor <- select(base, DT_NOTIFIC, DT_NASC, CS_SEXO, CS_RACA, ID_MN_RESI, 
ID_AGRAVO)

Agora, visualize em seu console as primeiras linhas de sua nova tabela, executando o comando. Replique-o em seu RStudio:

# Utilizando a função `head()` para visualizar colunas específicas da tabela 
# {`base_menor`}
head(base_menor)
#>   DT_NOTIFIC    DT_NASC CS_SEXO CS_RACA ID_MN_RESI ID_AGRAVO
#> 1 2012-04-11 2012-04-04       M       4     610213      A509
#> 2 2010-09-17 1988-04-23       M       1     610213       W64
#> 3 2010-10-19 1971-03-25       M      NA     610250       X58
#> 4 2008-04-14 1928-05-29       F       4     610213       A90
#> 5 2011-06-20 2002-09-18       M       4     610250       B19
#> 6 2008-02-12 1953-08-01       F       9     610213       A90

Observe que a sua nova tabela possui apenas as colunas indicadas pela função select().


3.2 Simplificando o fluxo de análises

Ao utilizar uma linguagem de programação como R para analisar dados, quase sempre precisaremos reaproveitar o resultado de uma análise anterior para realizar a análise seguinte, ou seja, utilizamos o output de um código anterior como o argumento principal de uma próxima análise. Esta ação é importante, pois tornará seu código menor e mais prático, evitando erros de análises quando precisamos repetir comandos já utilizados.

Observe no script abaixo como utilizaremos o output da função select(), que selecionamos algumas colunas, para visualizar as primeiras linhas usando a função head(). Estamos aninhando estas funções e, assim, termos o mesmo resultado. Replique este comando em seu RStudio:

# Criando a tabela {`base_menor`} selecionado colunas específicas
base_menor <- select(base, DT_NOTIFIC, DT_NASC, CS_SEXO, CS_RACA, ID_MN_RESI, 
ID_AGRAVO)

# Utilizando a função `head()` aninhada com a função `select()`
head(select(base, DT_NOTIFIC, DT_NASC, CS_SEXO, CS_RACA, ID_MN_RESI, ID_AGRAVO))

Em análises como a que estamos trabalhando, à medida que necessitamos realizar ações, o código fica maior e podemos nos perder entre tantas vírgulas, nomes de funções e parênteses. Como solução, no R podemos utilizar uma proposta de sintaxe (forma curta de escrever os comandos) implementada pela utilização de operadores chamados pipes, conforme descreve a tabela abaixo:



Nos exemplos deste curso iremos utilizar o operador |>, por dispensar o carregamento de pacotes! É importante destacar que o seu uso foi implementado a partir da versão 4.1 do R. Em códigos produzidos antes desta versão, será comum você encontrar o operador %>%, sendo necessário carregar o pacote magrittr ou o conjunto de pacotes pelo tidyverse.

Utilizando estes pipes (|> ou %>% ) podemos encadear diferentes operações em que o objeto à esquerda do pipe (o output anterior) será utilizado como o primeiro argumento da função à direita do pipe, sem que seja necessário digitá-la novamente (isto é, o primeiro argumento é omitido).

Observe o script abaixo, em que criaremos o objeto {base_menor}, a partir do data.frame {base} utilizando o pipe (|>).Replique estas linhas em seu RStudio:

# Criando o objeto {`base_menor`} a partir do objeto {`base`} e
# inserindo o pipe `|>` para encadear a seleção de variáveis
base_menor <- base |>
              select(DT_NOTIFIC, DT_NASC, CS_SEXO, CS_RACA, ID_MN_RESI, ID_AGRAVO)

Perceba que agora o objeto {base} ficou antes do operador |> e, em seguida, utilizamos a função select(), fornecendo diretamente os argumentos que viriam na sequência, isto é, o nome das colunas a serem selecionadas.

Agora acrescente a função head() para visualizar o resultado da operação. Replique o script abaixo em seu RStudio:

# Criando a {`base_menor`}
base_menor <- base |>
  
  # Selecionando as variáveis que queremos utilizar com a função `select()`
  select(DT_NOTIFIC, DT_NASC, CS_SEXO, CS_RACA, ID_MN_RESI, ID_AGRAVO) |>
  
  # Acrescentando a função `head()` ao final do código após um pipe `|>` 
  head()

# Visualizando a o objeto {`base_menor`} criado com as primeiras linhas selecionadas
# pela função `head()` e com colunas específicas, selecionadas pela função `select()`
base_menor
#>   DT_NOTIFIC    DT_NASC CS_SEXO CS_RACA ID_MN_RESI ID_AGRAVO
#> 1 2012-04-11 2012-04-04       M       4     610213      A509
#> 2 2010-09-17 1988-04-23       M       1     610213       W64
#> 3 2010-10-19 1971-03-25       M      NA     610250       X58
#> 4 2008-04-14 1928-05-29       F       4     610213       A90
#> 5 2011-06-20 2002-09-18       M       4     610250       B19
#> 6 2008-02-12 1953-08-01       F       9     610213       A90

Como visto, os comandos acima selecionaram as colunas de interesse: Data da notificação (DT_NOTIFIC), Data de nascimento (DT_NASC), Sexo (CS_SEXO), Raça/cor (CS_RACA), Código do município de residência (ID_MN_RESI), Código do CID10 do agravo notificado (ID_AGRAVO) e, então, apresentam em seu console as linhas iniciais da tabela gerada.

Acompanhe as próximas seções deste módulo em que utilizaremos o pipe (|>) para analisar dados de vigilância em saúde.