PARTE 2: Integração de Dados Climáticos e de Saúde
Guia Prático::sus_climate_aggregate()
Max Anjos
09 May, 2026
Source:vignettes/parte2_clima_agg.Rmd
parte2_clima_agg.RmdIntrodução
Tutorial Completo — Este tutorial abrange desde as
estratégias temporais básicas até as mais avançadas da função
sus_climate_aggregate(), a engine matemática e
epidemiológica do climasus4r responsável por alinhar dados
de saúde (DATASUS) com séries temporais meteorológicas (INMET).
Entradas da Função (Inputs)
Para que a integração ocorra, você precisa fornecer dois objetos
climasus_df prontos:
| Argumento | Descrição | Requisito de stage nos Metadados |
|---|---|---|
health_data |
Dados de saúde do DATASUS já agregados espacialmente. | Deve estar no estágio "spatial" (saída de
sus_spatial_join()). |
climate_data |
Dados meteorológicos do INMET sem falhas. | Deve estar no estágio "climate" (saída de
sus_climate_inmet() e ou
sus_climate_fill()). |
climate_var |
Quais variáveis climáticas pegar (ex:
"tair_dry_bulb_c", "rainfall_mm"). Padrão:
"all". |
- |
temporal_strategy |
Uma das 10 estratégias detalhadas no tutorial anterior. | - |
climate_region |
"auto", "tropical",
"subtropical", ou "temperate". Adapta
parâmetros automaticamente. |
- |
window_days |
Inteiro. Necessário para moving_window,
degree_days, e estratégias de excedência/pesos. |
- |
lag_days |
Inteiro (ou vetor). Necessário para discrete_lag e
distributed_lag. |
- |
offset_days |
Vetor de 2 inteiros (ex: c(7, 14)). Necessário para
offset_window. |
- |
Atenção: A função irá abortar com mensagens em
português, inglês ou espanhol (parâmetro lang) se os
metadados indicarem que os dados não passaram pelas etapas corretas do
pipeline. Isso evita vieses silenciosos na sua análise.
Parte 1: Preparação dos Dados de Saúde (SIM-DO)
1.1 Importação e Limpeza dos Dados de Óbito
O pipeline abaixo processa dados do Sistema de Informação sobre Mortalidade (SIM) para o estado do Amazonas no ano de 2023.
# ============================================================================
# PIPELINE COMPLETO DE PROCESSAMENTO DOS DADOS DE SAÚDE
# ============================================================================
library(climasus4r)
df_sim <- sus_data_import(
uf = "AM", # Amazonas
year = 2023, # Ano completo
system = "SIM-DO", # SIM Declaração de Óbito
use_cache = TRUE, # Usar cache para evitar re-download
verbose = TRUE
) |>
# Limpeza de encoding (acentos, caracteres especiais)
sus_data_clean_encoding() |>
# Padronização de colunas (nomes, tipos, formatos)
sus_data_standardize(lang = "pt") |>
# Filtro por CID - doenças respiratórias (J00-J99)
sus_data_filter_cid(disease_group = "respiratory") |>
# Criação de variáveis derivadas
sus_data_create_variables(
create_age_groups = TRUE, # Grupos etários
age_breaks = c(60, 70, 80, 90, Inf), # Faixas para idosos
age_labels = c("60-69", "70-79", "80-89", "90+"),
create_calendar_vars = TRUE, # Mês, semana, dia da semana
create_climate_vars = TRUE, # Variáveis climáticas derivadas
climate_region = "Norte", # Região Norte do Brasil
lang = "pt"
) |>
# Filtros demográficos
sus_data_filter_demographics(
sex = c("Masculino", "Feminino"), # Ambos os sexos
age_range = c(65, Inf) # Apenas idosos (65+)
) |>
# Agregação temporal (diária)
sus_data_aggregate(
date_col = NULL, # Usa data do óbito automaticamente
complete_dates = FALSE, # Não completar datas faltantes
time_unit = "day", # Agregação diária
lang = "pt"
)
# Visualizar metadados do objeto
sus_meta(df_sim)
# Resumo estatístico
summary(df_sim)Interpretação dos Resultados: - O objeto
df_sim contém a contagem diária de óbitos por doenças
respiratórias - População alvo: idosos (65+ anos) no Amazonas - Período:
1º de janeiro a 31 de dezembro de 2023
Parte 2: Agregação Espacial
2.1 Join Espacial com Malha Municipal
A função sus_spatial_join() atribui a cada óbito as
coordenadas geográficas do município de ocorrência.
# ============================================================================
# AGREGAÇÃO ESPACIAL AO NÍVEL MUNICIPAL
# ============================================================================
sf_sim_spatial <- sus_spatial_join(
df = df_sim,
level = "munic", # Nível municipal (vs. "state" ou "health_region")
lang = "pt"
)
# Verificar metadados (agora com componente espacial)
sus_meta(sf_sim_spatial)Nota: O objeto agora é um sf (simple
features) com geometria dos municípios.
Parte 3: Dados Climáticos (INMET)
3.1 Download, Pré-processamento e Preenchimento de falhas
Baixamos dados meteorológicos das estações do INMET no Amazonas.
# ============================================================================
# DOWNLOAD DOS DADOS DO INMET
# ============================================================================
df_inmet_raw <- sus_climate_inmet(
years = 2023, # Mesmo ano dos dados de saúde
uf = "AM" # Apenas estações no Amazonas
)
# Verificar estações baixadas
unique(df_inmet_raw$station_name)
# ============================================================================
# IMPUTAÇÃO DE DADOS FALTANTES
# ============================================================================
df_inmet <- sus_climate_fill_inmet(
df_inmet_raw,
target_var = "all", # Imputar todas as variáveis climáticas
parallel = TRUE, # Processamento paralelo (mais rápido)
run_evaluation = FALSE # Pular avaliação detalhada
)
# Para acelerar os exemplos, podemos salvar/ler os dados processados no formato ultra rápido parquet
# sus_data_export(df_inmet, "df_inmet_AM_2023_filled.parquet")
# sus_data_export(sf_sim_spatial, "df_sim_AM_2023_spatial.parquet")
# Carregar dados pré-processados (se disponível)
# df_inmet <- sus_data_read("df_inmet_AM_2023_filled.parquet")
# sf_sim_spatial <- sus_data_read("df_sim_AM_2023_spatial.parquet")Parte 4: Estratégias de Agregação Climática com sus_climate_aggregate()
4.1 Estratégia Exact (Match Exato)
Objetivo: Associar a temperatura do mesmo dia do óbito. Aplicação: Eventos agudos como hipertermia, AVC, infarto.
# ============================================================================
# EXACT: Temperatura do mesmo dia
# ============================================================================
df_exact <- sus_climate_aggregate(
health_data = sf_sim_spatial,
climate_data = df_inmet,
climate_var = "tair_dry_bulb_c", # Temperatura de bulbo seco (°C)
temporal_strategy = "exact",
lang = "pt",
verbose = TRUE
)
# Verificar nova coluna
names(df_exact)
summary(df_exact$tair_dry_bulb_c)
# Análise rápida: relação entre temperatura e óbitos
library(ggplot2)
df_exact %>%
ggplot(aes(x = tair_dry_bulb_c, y = n_obitos)) +
geom_point(alpha = 0.5) +
geom_smooth(method = "loess", color = "red") +
labs(
title = "Relação entre Temperatura e Óbitos (Mesmo Dia)",
x = "Temperatura (°C)",
y = "Número de Óbitos"
) +
theme_minimal()Variáveis do INMET Suportadas Pressão Atmosférica: patm_mb (Média), patm_max_mb (Máxima), patm_min_mb (Mínima)
Temperatura do Ar: tair_dry_bulb_c (Bulbo Seco), tair_max_c (Máxima), tair_min_c (Mínima)
Ponto de Orvalho: dew_tmean_c (Média), dew_tmax_c (Máxima), dew_tmin_c (Mínima)
Umidade Relativa: rh_mean_porc (Média), rh_max_porc (Máxima), rh_min_porc (Mínima)
Vento: ws_2_m_s (Velocidade), ws_gust_m_s (Rajada), wd_degrees (Direção)
Diversos: rainfall_mm (Chuva), sr_kj_m2 (Radiação Solar)
4.2 Estratégia Discrete Lag (Defasagem Discreta)
Objetivo: Avaliar o efeito da temperatura em diferentes defasagens, identificando o período crítico de exposição.
# ============================================================================
# DISCRETE LAG: Temperatura 7, 14 e 21 dias antes
# ============================================================================
df_discrete_lag <- sus_climate_aggregate(
health_data = sf_sim_spatial,
climate_data = df_inmet,
climate_var = "tair_dry_bulb_c",
temporal_strategy = "discrete_lag",
lag_days = c(7, 14, 21), # Três defasagens distintas
lang = "pt",
verbose = TRUE
)
# Verificar colunas criadas
names(df_discrete_lag)
# Comparar correlações em diferentes defasagens
correlations <- data.frame(
lag = c(0, 7, 14, 21),
correlation = c(
cor(df_exact$tair_dry_bulb_c, df_exact$n_obitos, use = "complete.obs"),
cor(df_discrete_lag$lag7_tair_dry_bulb_c, df_discrete_lag$n_obitos, use = "complete.obs"),
cor(df_discrete_lag$lag14_tair_dry_bulb_c, df_discrete_lag$n_obitos, use = "complete.obs"),
cor(df_discrete_lag$lag21_tair_dry_bulb_c, df_discrete_lag$n_obitos, use = "complete.obs")
)
)
print(correlations)Interpretação: Os valores da correlação entre defasagem e temperatura são apenas ilustrativos e refletem o período usado nesse tutorial.
4.3 Estratégia Distributed Lag (Matriz para DLNM)
Objetivo: Criar matriz de defasagens para modelos DLNM. Aplicação: Modelagem não-linear de efeitos defasados.
# ============================================================================
# DISTRIBUTED LAG: Matriz de defasagens 0 a 21
# ============================================================================
df_distributed <- sus_climate_aggregate(
health_data = sf_sim_spatial,
climate_data = df_inmet,
climate_var = "tair_dry_bulb_c",
temporal_strategy = "distributed_lag",
lag_days = 21, # Defasagem máxima (0 a 21)
lang = "pt",
verbose = TRUE
)
# Verificar estrutura da matriz
head(df_distributed)DLNM: A matriz gerada servirá de entrada para o modelo DLNM (pacote dlnm). O climasus4r disponibilizará, em breve, novas funcionalidades de modelagem e visualização dos resultados.
4.4 Estratégia Moving Window (Janela Móvel)
Objetivo: Média da temperatura nos últimos 14 dias. Aplicação: Efeito acumulado de exposição prolongada.
# ============================================================================
# MOVING WINDOW: Média dos últimos 14 dias
# ============================================================================
df_moving <- sus_climate_aggregate(
health_data = sf_sim_spatial,
climate_data = df_inmet,
climate_var = "tair_dry_bulb_c",
temporal_strategy = "moving_window",
window_days = 14, # Janela de 14 dias
min_obs = 0.7, # Mínimo de 70% de dados válidos
lang = "pt",
verbose = TRUE
)
# Comparar temperatura diária vs média móvel
df_compare <- df_exact %>%
dplyr::select(date, tair_dry_bulb_c) %>%
dplyr::left_join(
df_moving %>% dplyr::select(date, tair_dry_bulb_c_mean_w14),
by = "date", relationship = "many-to-many"
) %>%
tidyr::pivot_longer(-date, names_to = "metric", values_to = "temperature")
ggplot(df_compare, aes(x = date, y = temperature, color = metric)) +
geom_line(alpha = 0.7) +
labs(
title = "Temperatura Diária vs. Média Móvel (14 dias)",
x = "Data",
y = "Temperatura (°C)",
color = "Métrica"
) +
theme_minimal()4.5 Estratégia Offset Window (Janela Deslocada)
Objetivo: Isolar período de incubação (excluindo dias recentes). Aplicação: Dengue, Zika, outras doenças com período de incubação.
# ============================================================================
# OFFSET WINDOW: Média entre 14 e 7 dias antes (ignora última semana)
# ============================================================================
df_offset <- sus_climate_aggregate(
health_data = sf_sim_spatial,
climate_data = df_inmet,
climate_var = "tair_dry_bulb_c",
temporal_strategy = "offset_window",
offset_days = c(7, 14), # Janela [t-14, t-7]
min_obs = 0.7,
lang = "pt",
verbose = TRUE
)
head(df_offset)Interpretação: Esta variável representa a exposição no período que exclui a semana imediatamente anterior ao óbito, útil para isolar efeitos de longo prazo de exposições agudas.
4.6 Estratégia Degree Days (Graus-Dia)
Objetivo: Acumular calor acima de uma temperatura base. Aplicação: Desenvolvimento de vetores (Aedes aegypti), estresse térmico.
# ============================================================================
# DEGREE DAYS: GDD acumulado nos últimos 21 dias (base 20°C)
# ============================================================================
df_gdd <- sus_climate_aggregate(
health_data = sf_sim_spatial,
climate_data = df_inmet,
temporal_strategy = "degree_days",
window_days = 21, # Período de acumulação
temp_base = 20, # Temperatura base (humano)
gdd_temp_var = "tair_dry_bulb_c",
min_obs = 0.7,
lang = "pt",
verbose = TRUE
)
head(df_gdd)
# Exemplo com temperatura base para Aedes aegypti (11°C)
df_gdd_aedes <- sus_climate_aggregate(
health_data = sf_sim_spatial,
climate_data = df_inmet,
temporal_strategy = "degree_days",
window_days = 21,
temp_base = 11, # Base para Aedes aegypti
gdd_temp_var = "tair_dry_bulb_c",
lang = "pt",
verbose = TRUE
)
head(df_gdd_aedes)4.7 Estratégia Seasonal (Sazonal)
Objetivo: Analisar padrões sazonais. Aplicação: Estudos ecológicos, tendências de longo prazo.
# ============================================================================
# SEASONAL: Médias por estação do ano
# ============================================================================
df_seasonal <- sus_climate_aggregate(
health_data = sf_sim_spatial,
climate_data = df_inmet,
temporal_strategy = "seasonal",
lang = "pt",
verbose = TRUE
)
head(df_seasonal)4.8 Estratégia Threshold Exceedance (Excedência de Limiar)
Objetivo: Contar dias com temperaturas extremas. Aplicação: Ondas de calor, eventos extremos de precipitação.
# ============================================================================
# THRESHOLD EXCEEDANCE: Dias com Tmax > 35°C nos últimos 7 dias
# ============================================================================
df_threshold <- sus_climate_aggregate(
health_data = sf_sim_spatial,
climate_data = df_inmet,
climate_var = "tair_max_c",
temporal_strategy = "threshold_exceedance",
window_days = 7,
threshold_value = 35,
threshold_direction = "above", # Contar dias ACIMA do limiar
min_obs = 0.7,
lang = "pt",
verbose = TRUE
)
head(df_threshold)4.9 Estratégia Weighted Window (Janela Ponderada)
Objetivo: Aplicar pesos decrescentes aos dias da janela. Aplicação: Modelar decaimento biológico da exposição.
# ============================================================================
# WEIGHTED WINDOW: Média ponderada com diferentes funções de peso
# ============================================================================
# Caso 1: Pesos lineares (automáticos)
df_wlin <- sus_climate_aggregate(
health_data = sf_sim_spatial,
climate_data = df_inmet,
climate_var = "tair_dry_bulb_c",
temporal_strategy = "weighted_window",
window_days = 7,
weights = NULL, # Decaimento linear automático
min_obs = 0.7,
lang = "pt",
verbose = TRUE
)
head(df_wlin)
# Caso 2: Pesos exponenciais (decaimento rápido)
lambda <- 0.3
W <- 7
pesos_exp <- exp(-lambda * seq(0, W))
pesos_exp <- pesos_exp / pesos_exp[1] # Normalizar (pico = 1)
df_wexp <- sus_climate_aggregate(
health_data = sf_sim_spatial,
climate_data = df_inmet,
climate_var = "tair_dry_bulb_c",
temporal_strategy = "weighted_window",
window_days = W,
weights = pesos_exp,
min_obs = 0.7,
lang = "pt",
verbose = TRUE
)
head(df_wexp)
# Caso 3: Pesos gaussianos (pico no meio da janela)
mu <- 3 # Pico no dia t-3
sigma <- 1.5 # Largura da janela
pesos_gaus <- exp(-((seq(0, W) - mu)^2) / (2 * sigma^2))
pesos_gaus <- pesos_gaus / max(pesos_gaus)
df_wgaus <- sus_climate_aggregate(
health_data = sf_sim_spatial,
climate_data = df_inmet,
climate_var = "tair_dry_bulb_c",
temporal_strategy = "weighted_window",
window_days = W,
weights = pesos_gaus,
min_obs = 0.7,
lang = "pt",
verbose = TRUE
)
head(df_wgaus)🎉 Conclusão
A função sus_climate_aggregate() eleva o
climasus4r de um simples pacote de limpeza de dados para
uma ferramenta de inferência epidemiológica.
Ao alinhar a nomenclatura com o padrão da comunidade R
(moving_window), fornecer uma ferramenta matemática única
para períodos de incubação (offset_window), e introduzir
estratégias avançadas como threshold_exceedance e
weighted_window, este pacote garante que suas conclusões
sobre “Como o clima afeta a saúde no Brasil” sejam metodologicamente
irrefutáveis e prontas para publicação em periódicos de alto
impacto.
🌲 Tem feedback ou sugestões?
Você tem alguma ideia de melhoria ou encontrou algum erro? Clique no botão abaixo para abrir uma nova issue no GitHub e compartilhar suas sugestões diretamente conosco.
Abrir issue no GitHub