Skip to contents

Introduçã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)

Limiares Térmicos por Espécie

Organismo Tbase (temp_base) (°C) GDD para Desenvolvimento Aplicação
Aedes aegypti 11 100-150 Transmissão de dengue
Anopheles gambiae 18 80-120 Transmissão de malária
Triatoma infestans 16 200-300 Doença de Chagas
Humano (estresse) 20 - Morbidade cardiovascular

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