5 Realizando o linkage
De posse do SIVEP-Gripe devidamente deduplicado, armazenado no objeto
{sivep_dedup
}, vamos prosseguir fazendo um linkage
com o SIM.
No SIM de Rosas temos uma base de dados sintética somente com as
variáveis: nomes
, nome da mãe
e
data de nascimento
, não existindo uma variável com
identificador único como o número do CPF. Isto fará com que o
linkage entre as bases tenha de ser realizado com menos
informações.
Você deve ter percebido que nas bases de dados exportadas nos sistemas reais, tanto para o SIVEP-Gripe quando para o SIM, existiriam outras variáveis que poderiam nos apoiar neste pareamento de dados, como a evolução do caso e a data da evolução no SIVEP-Gripe, e a data de óbito no SIM junto a causa associada da morte, por exemplo.
Neste exemplo de linkage optamos por introduzir apenas a
causa básica principal (CAUSABAS
) para ilustrar algumas
possibilidades de análise e estimulá-lo a experimentar em seu dia a dia.
Vamos lá!

Atenção
Todos os bancos de dados utilizados para análises neste curso se
encontram no menu lateral “Arquivos” do curso. Lembre-se de fazer o
download do material do curso diretamente do Ambiente Virtual
de Aprendizagem do curso e arquivá-los em um diretório que deverá
indicar para que o R
o localize.
Em um primeiro passo vamos importar os registros fictícios do Sistema
de Informação de Mortalidade (SIM) do Estado de Rosas, uma base de nome
DO_ROSAS.csv
. Não iremos realizar nenhum tipo de filtragem
nesta base, ou seja, utilizaremos o arquivo com todas as suas variáveis.
Você irá observar que o arquivo do SIM de Rosas possuí algumas das
principais causas de morte no estado.
Vamos lá! Copie e cole o código a seguir em seu RStudio
para importar a base de dados de óbitos de Rosas:
# Carregando a base de dados
do_rosas <- read_csv2("Dados/DO_ROSAS.csv")
Conforme vimos neste curso, será necessário fazer a deduplicação da
base para executar o linkage, por isso faremos agora todos os
passos que você aprendeu de uma única vez. Fique atento que agora
teremos somente três campos em compare_pairs()
e, portanto,
o valor select_threshold()
é de no máximo 3 e usaremos aqui
o valor de 2.7, ou seja, 90% de similaridade.
Acompanhe o script a seguir e replique-o em seu
RStudio
:
# Criando um novo objeto de linkage `p5` a partir do objeto `sivep_dedup`
p5 <- sivep_dedup |>
# Realizando a blocagem dos dados pela variável "sexo" com uso da
# função pair_blocking(), e realizando o linkage com objeto do_rosas
pair_blocking(do_rosas, blocking_var = "sexo") |>
# Filtrando os pares para deduplicação com a função
# filter_pairs_for_deduplication()
filter_pairs_for_deduplication() |>
# Comparando os pares das colunas selecionadas com a
# função compare_pairs()
compare_pairs(
by = c("nome", "data_nasc", "nome_mae"),
default_comparator = jaro_winkler(0.9)
) |>
# Calculando o escore de similaridade com a função score_simsum()
score_simsum() |>
# Definindo um ponto de corte de 2.7 com a função select_threshold()
select_threshold(2.7) |>
# Adicionando a variável de identificação a partir da coluna x
add_from_x(nu_not = "nu_notific") |>
# Adicionando a variável de identificação a partir da coluna y
add_from_y(nu_do = "nu_do")

Atenção
Caso seu computador possua memória RAM inferior a 16 GB você poderá encontrar lentidão no processamento dos scripts deste curso. Sim, pode demorar alguns minutos até que se possa obter o output desejado.
Se possuir outros programas, aplicativos ou abas da internet abertos, feche-os! Assim você consumirá menos memória.
Pronto! Com o objeto {p5
} que criamos com a base do SIM
deduplicada, identificaremos agora quantos linkages entres os
dois bancos foram encontrados. Para isso filtramos as variáveis
utilizando a função select()
igual a TRUE
.
Acompanhe o script a seguir e replique-o em seu
RStudio
:
# Criando objeto com identificação do linkage entre os dois bancos
ident <- p5 |>
# Transformando em um objeto de tabela no formato tibble
as_tibble() |>
# Filtrando as linhas de acordo com a variável select
filter(select)
# Visualizando o número de linhas no objeto ident
nrow(ident)
#> [1] 2417
Observe que ao utilizar o comando nrow(ident)
obtivemos
um resulto indicando que temos 2.417 registros de óbitos no SIVEP-Gripe
de Rosas. Agora vamos fazer uma etapa semelhante à utilizada
anteriormente para saber quantos óbitos estão registradas no SIM de
Rosas.
Acompanhe o script a seguir e replique-o em seu
RStudio
:
loc_do <- do_rosas |>
# Filtrando os números da Declaração de Óbito (do) presentes no objeto ident
# com uso da função filter()
filter(nu_do %in% ident$nu_do)
# Visualizando o número de linhas no objeto loc_do
nrow(loc_do)
#> [1] 2410
Você deve ter percebido que com o dado que manipulamos foi possível descobrir à priori que o SIM contém 2.410 óbitos. Ou seja, encontramos 7 óbitos a mais comparando o SIVEP-Gripe ao SIM. Dessa forma, podemos inferir que estes registros adicionais poderão ser, provavelmente, óbitos que não foram relatados no SIM mas estão no SIVEP-Gripe.
Vamos agora, dar mais um passo e inspecionar a Classificação
Internacional de Doenças (CID-10) contida na variável
CAUSABAS
desses registros identificados! Acompanhe o
script a seguir e replique-o em seu RStudio
:
# Calculando a tabela de frequência de CIDs com a função table()
table(loc_do$CAUSABAS)
#>
#> B342 B972 C159 C679 G20 I10 I251 I619 J129 J189 N390 R99 U071
#> 2390 2 1 1 1 1 1 1 1 4 2 2 3
Podemos ver no output acima que mais de 99% dos registros linkados entre o SIVEP-Gripe e o SIM têm como causa básica o CID-10 = B342 (covid-19) e apenas 20 registros possuíam outros CID-10s.
Aqui estamos levando em conta as datas de internação no SIVEP-Gripe e a data do óbito registrada no SIM, o que seria extremamente importante visto que alguns óbitos de pessoas que estiveram internadas podem ter ocorrido por outras causas não relacionadas à internação registrada no SIVEP-Gripe.
Então vamos praticar! Listaremos a seguir os registros que não foram
linkados mas que possuem o CID10 = B342 registrados no SIM como
causa básica. Acompanhe o script a seguir e replique-o em seu
RStudio
:
# Criando uma nova tabela com o nome nao_loc
nao_loc <- do_rosas |>
# Filtrando por registros que não foram *linkados e com CID B342 com o uso da
# função filter()
filter(!(nu_do %in% ident$nu_do) & CAUSABAS == 'B342')
# Visualizando a tabela criada com o uso da função kable()
kable(nao_loc)
Tabela 11: Registros
Pronto. Agora precisamos utilizar o nome completo dos registros que ainda não foram localizados para buscá-los no SIVEP-Gripe.
Acompanhe o script a seguir e replique-o em seu
RStudio
:
sivep_dedup |>
# Filtrando os nomes presentes na tabela nao_loc com o uso da função filter()
filter(nome %in% nao_loc$nome) |>
# Visualizando a tabela criada com o uso da função kable()
kable()

Atenção
Caso seu computador possua memória RAM inferior a 16 GB você poderá encontrar lentidão no processamento dos scripts deste curso. Sim, pode demorar alguns minutos até que se possa obter o output desejado.
Se possuir outros programas, aplicativos ou abas da internet abertos, feche-os! Assim você consumirá menos memória.
Note acima que a pessoa de nome igual a “Gustavo Barros Barbosa”
aparece três vezes em uma lista sendo que em duas vezes trata-se de
duplicidade. Podemos inferir, neste caso, avaliando as variáveis
nome da mãe
e CPF
, que a terceira menção
trata-se de outra pessoa, ou seja, é apenas um homônimo.
É interessante observar que essa duplicidade não foi detectada na
deduplicação do SIVEP-Gripe, possivelmente porque havia um
NA
em um dos registros. Os NA
poderiam ser
detectados e tratados antes da deduplicação, por exemplo, e caso sejam
muitos você pode optar por não usar essa informação como chave de
cruzamento entre bancos melhorando a sua acurácia de linkage.
Outra opção é ser mais permissivo com os pontos de coorte do banco de
dados e aplicar uma melhor similaridade na deduplicação
(simsum
).
Um linkage nunca é perfeito pode-se inclusive calcular a sensibilidade e especificidade de um pipeline de linkage que vai ser empregado desde que se tenha um padrão para comparação que pode ser uma revisão manual nos dados proveniente do linkage ou ainda um linkage manual de uma amostra. Para maiores detalhes consulte: