Skip to contents

Objetivo

Al finalizar este tutorial usted será capaz de:

  1. Calcular la Fracción y el Número Atribuible (FA/NA) al calor y al frío a partir de un modelo DLNM ajustado, con intervalos de confianza por Monte Carlo;
  2. Estimar el exceso de mortalidad observado frente al contrafactual esperado, usando tres métodos de línea base;
  3. Clasificar la carga de enfermedad entre municipios de la Región Metropolitana de São Paulo, identificando desigualdades en la distribución del riesgo ambiental;
  4. Visualizar e interpretar cada resultado con los gráficos pareados del paquete.

Este es el segundo módulo de la serie de Modelado de climasus4r. La entrada principal es el objeto climasus_dlnm producido en el Módulo 1 (mod_dlnm_fit.rds). Las salidas quedan disponibles como mod_af.rds para reutilización en módulos posteriores.


Contexto científico

Fracción Atribuible de Riesgo en epidemiología ambiental

La Fracción Atribuible de Riesgo (FA, Attributable Fraction) cuantifica la proporción de casos de una enfermedad que puede atribuirse a una determinada exposición en la población. En el contexto de estudios clima-salud, se estima qué parte de las muertes respiratorias en personas mayores sería evitable si la temperatura estuviera fijada en el valor de referencia (generalmente la mediana o el mínimo de mortalidad).

La metodología fue sistematizada por Gasparrini & Armstrong (2013) y aplicada a escala global por Gasparrini et al. (2017), mostrando que 7,71% de las muertes globales son atribuibles a temperaturas no óptimas — siendo el frío responsable de la mayor parte en la mayoría de las regiones.

Exceso de mortalidad

El exceso de mortalidad (diferencia entre lo observado y lo esperado) se usa ampliamente para evaluar el impacto de olas de calor, pandemias y eventos extremos. Lo esperado se estima mediante un modelo de línea base (spline de series temporales, regresión de Serfling o el contrafactual del DLNM). El método de Serfling (1963) usa regresión armónica para capturar la estacionalidad sin suprimir la señal de interés.

Carga de enfermedad y desigualdades espaciales

La distribución del riesgo climático entre municipios rara vez es uniforme. La curva de Lorenz (y el índice de Gini derivado) cuantifica el grado de concentración de la carga: cuanto más cóncava la curva respecto a la diagonal de igualdad perfecta, mayor la inequidad espacial de la carga. Este análisis se inspira en el enfoque multi-ciudad de Gasparrini et al. (2017, The Lancet Planetary Health) y es esencial para priorizar intervenciones de adaptación climática.


Datos utilizados

Objeto Origen Contenido
mod_dlnm_fit.rds Módulo M1 Objeto climasus_dlnm ajustado para la RMSP
caso_serie.rds Tutorial T4 Serie diaria de defunciones por municipio
caso_clima_estacao.rds Tutorial T7 Temperatura diaria INMET (estación A701)

Caso conductor: Temperatura y desenlaces de salud en personas mayores (60+) en la Región Metropolitana de São Paulo, 2014–2019 (CID-10: J00–J99, enfermedades respiratorias).

Si los artefactos anteriores no existen en la carpeta vignettes-pt/dados/, el script modelagem_02_atribuivel.R sintetiza automáticamente una serie diaria realista y ajusta los modelos sobre ella, garantizando que el pipeline se ejecute de principio a fin.


Pipeline completo

Cargar el ajuste DLNM del Módulo 1

# Guarda: verifica se o arquivo foi gerado pelo Módulo M1.
# Caminho relativo — o Rmd é renderizado a partir de vignettes-pt/.
dlnm_path <- "dados/mod_dlnm_fit.rds"

if (file.exists(dlnm_path)) {
  mod_dlnm_fit <- readRDS(dlnm_path)
} else {
  stop(
    "mod_dlnm_fit.rds não encontrado. ",
    "Execute primeiro: Rscript scripts/modelagem_01_dlnm.R"
  )
}

Fracción y Número Atribuible — sus_mod_af()

mod_af <- sus_mod_af(
  fit       = mod_dlnm_fit,
  threshold = NULL,              # usa ref_value do DLNM (mediana de temperatura)
  pred_at   = c(0.75, 0.90, 0.95, 0.99),  # percentis de interesse
  by        = "year",            # decompõe o AN/FA por ano
  nsim      = 500L,              # simulações Monte Carlo para IC 95%
  alpha     = 0.05,
  lang      = "pt",
  verbose   = TRUE
)

# Inspecionar o resultado
print(mod_af)
mod_af$total          # tabela total/calor/frio
mod_af$by_quantile    # FA por percentil
mod_af$by_period      # FA/AN por ano

Guardar para reutilización

# Caminho relativo — renderizado a partir de vignettes-pt/
saveRDS(mod_af, "dados/mod_af.rds")

Exceso de mortalidad — sus_mod_excess()

Método from_dlnm (contrafactual a partir del DLNM)

# Quando data é climasus_dlnm, method = "from_dlnm" é detectado automaticamente
# e outcome_col é inferido do meta$outcome_col do fit.
# study_period sem control_period usa todo o período disponível no DLNM.
mod_excess_dlnm <- sus_mod_excess(
  data         = mod_dlnm_fit,
  method       = "from_dlnm",
  study_period = c(as.Date("2014-01-01"), as.Date("2019-12-31")),
  threshold_z  = 1.96,
  by           = "year",
  lang         = "pt",
  verbose      = TRUE
)

print(mod_excess_dlnm)
# tidy() retorna tibble de uma linha: observed, expected, excess, excess_pct,
# peak_excess, peak_date — ideal para comparação entre métodos ou municípios
generics::tidy(mod_excess_dlnm)

Método spline (línea base quasi-Poisson con spline natural)

# A partir de uma série diária de dados de saúde (sem DLNM)
mod_excess_spl <- sus_mod_excess(
  data           = caso_serie,           # data.frame com date e n_obitos
  outcome_col    = "n_obitos",
  date_col       = "date",
  control_period = c(as.Date("2014-01-01"), as.Date("2016-12-31")),
  study_period   = c(as.Date("2017-01-01"), as.Date("2019-12-31")),
  method         = "spline",
  dof_per_year   = 8L,                   # graus de liberdade do spline por ano
  family         = "quasipoisson",
  threshold_z    = 1.96,
  by             = "year",
  lang           = "pt"
)

Método serfling (regresión periódica de Serfling)

mod_excess_serf <- sus_mod_excess(
  data           = caso_serie,
  outcome_col    = "n_obitos",
  date_col       = "date",
  control_period = c(as.Date("2014-01-01"), as.Date("2016-12-31")),
  study_period   = c(as.Date("2017-01-01"), as.Date("2019-12-31")),
  method         = "serfling",
  harmonics      = 2L,                   # número de harmônicos sinusoidais
  family         = "quasipoisson",
  threshold_z    = 1.96,
  by             = "year",
  lang           = "pt"
)

Clasificación de carga entre municipios — sus_mod_burden()

# sus_mod_burden() recebe uma lista NOMEADA de objetos climasus_af
# (um por município/estrato). Na prática, cada elemento é obtido por:
#   sus_mod_af(fit_municipio_X, nsim = 500L)
# O script de pré-renderização (modelagem_02_atribuivel.R) constrói a lista
# com 10 municípios da RMSP; aqui mostramos a chamada genérica.

lista_af <- list(
  "Sao Paulo"    = mod_af_sp,       # climasus_af de São Paulo
  "Guarulhos"    = mod_af_guarulhos, # climasus_af de Guarulhos
  "Campinas"     = mod_af_campinas   # ... demais municípios
  # ... adicione quantos municípios/estratos desejar
)

mod_burden <- sus_mod_burden(
  fits      = lista_af,
  component = "all",      # decompõe em calor e frio por município; use "total"
                          # para uma única métrica por cidade
  rank_by   = "an",       # classifica pelo Número Atribuível; use "af_pct"
                          # para classificar pela Fração Atribuível (%)
  top_n     = NULL,       # NULL = mantém todos; top_n = 5L limita ao top-5
  nsim      = 0L,         # 0L usa IC por método delta (mais rápido);
                          # nsim > 0 recalcula via Monte Carlo se fits são DLNM
  alpha     = 0.05,
  lang      = "pt",
  verbose   = TRUE
)

print(mod_burden)
generics::tidy(mod_burden)   # tabela flat com cumulative_pct para exportação

Gráficos de FA — sus_mod_plot_af()

# Barras de FA% por componente (total / calor / frio)
sus_mod_plot_af(mod_af, type = "bar",      lang = "pt")
# Forest plot do Número Atribuível com IC 95%
sus_mod_plot_af(mod_af, type = "forest",   lang = "pt")
# FA% por faixa de percentil de exposição (P75, P90, P95, P99)
sus_mod_plot_af(mod_af, type = "quantile", lang = "pt")

Gráficos de carga — sus_mod_plot_burden()

# Lollipop: ranking de municípios por AN
sus_mod_plot_burden(mod_burden, type = "lollipop", lang = "pt")
# Curva de Lorenz: concentração da carga entre municípios
sus_mod_plot_burden(mod_burden, type = "lorenz",   lang = "pt")
# Barras empilhadas: calor vs. frio por município (requer component = "all")
sus_mod_plot_burden(mod_burden, type = "stacked",  lang = "pt")

Características de las funciones

sus_mod_af() — Fracción y Número Atribuible

Calcula la Fracción Atribuible de Riesgo (FA) y el Número Atribuible (AN) a partir de un objeto climasus_dlnm. La descomposición en calor y frío se hace mediante el umbral threshold (por defecto: ref_value del DLNM). Los intervalos de confianza se obtienen por simulación de Monte Carlo cuando el paquete MASS está disponible, o por el método delta (límites de crosspred) en caso contrario.

Parámetros principales:

Argumento Por defecto Descripción
fit — Objeto climasus_dlnm de sus_mod_dlnm()
threshold NULL Umbral de temperatura (separa calor/frío); NULL usa ref_value del DLNM
range NULL Intervalo personalizado de exposición para FA adicional
pred_at c(0.75, 0.90, 0.95, 0.99) Percentiles para la tabla por banda de percentil
by NULL Desagregación temporal: "month", "year" o "season"
nsim 1000L Simulaciones Monte Carlo para IC; 0 usa método delta
alpha 0.05 Nivel de significancia para IC

Qué retorna: un objeto climasus_af con:

  • $total — tibble total/calor/frío (AF, AF_lo, AF_hi, AN, AN_lo, AN_hi)
  • $by_quantile — FA/AN por banda de percentil
  • $by_period — FA/AN por mes/año/estación (si by no es NULL)
  • $daily — serie diaria: fecha + exposición + casos + AN + FA
  • $custom — FA/AN para el intervalo personalizado (si se proporciona range)
  • $meta — metadatos de todos los parámetros usados

sus_mod_plot_af() — Visualizaciones de FA/AN

Produce tres tipos de visualización a partir de un climasus_af.

type Descripción
"bar" Barras de FA% por componente (total/calor/frío) con barras de error de IC 95%
"forest" Forest plot horizontal del AN ± IC 95% por componente
"quantile" Barras de FA% por franja de percentil de exposición ($by_quantile)

Parámetros adicionales relevantes:

Argumento Por defecto Descripción
output_type "plot" "plot", "table" o "all" (lista con $plot, $table, $data)
interactive FALSE Convierte a widget plotly interactivo
base_size 12 Tamaño base de la fuente en el tema ggplot2
save_plot NULL Ruta de archivo para guardar el gráfico (PNG/PDF/HTML)

sus_mod_excess() — Exceso de Mortalidad

Estima el exceso de casos (observado − esperado) respecto a una línea base. Acepta como entrada un climasus_dlnm o cualquier data.frame con columnas de fecha y conteo.

Métodos de línea base:

method Descripción
"from_dlnm" Contrafactual del DLNM: línea base = valores ajustados / RR observado. Requiere climasus_dlnm y el paquete dlnm.
"spline" (por defecto para data frames) GLM quasi-Poisson con spline natural sobre el tiempo (ns(), dof_per_year gl/año).
"serfling" Regresión de Serfling: tendencia polinómica de 2.º grado + HH armónicos sinusoidales estacionales (ver fórmula LaTeX en la sección Fundamentos matemáticos).

Parámetros principales:

Argumento Por defecto Descripción
data — climasus_dlnm o data.frame con columnas de fecha y conteo
outcome_col NULL Nombre de la columna de desenlace; inferido del DLNM cuando data es climasus_dlnm
date_col "date" Nombre de la columna de fecha
control_period NULL Período de referencia para ajustar la línea base (vector de 2 fechas)
study_period NULL Período de estudio para el cual se reporta el exceso
method NULL (auto) "from_dlnm", "spline" o "serfling"
dof_per_year 8L Grados de libertad por año para el spline (método "spline")
harmonics 2L Número de armónicos HH (método "serfling")
family "quasipoisson" Familia GLM: "quasipoisson" o "poisson"
threshold_z 1.96 Umbral de z-score para marcar días de exceso significativo
by NULL Desagregación temporal: "year", "month" o "season"
alpha 0.05 Nivel de significancia para IC de la línea base

Qué retorna: un objeto climasus_excess con:

  • $daily — serie diaria: date, observed, expected, expected_lo/hi, excess, excess_lo/hi, z_score, is_excess, cum_excess
  • $total — resumen: n_days, observed, expected ± IC, excess ± IC, excess_pct, n_excess_days, peak_excess, peak_date
  • $by_period — desagregación temporal (si by no es NULL)
  • $model — objeto GLM de la línea base (NULL para "from_dlnm")
  • $meta — metadatos: method, outcome_col, control_period, study_period, family, dof_per_year, harmonics, threshold_z

Nota: sus_mod_excess() no posee función de gráfico pareada (sus_mod_plot_excess()). Visualice directamente con ggplot2 usando $daily (serie temporal observado vs. esperado) o $by_period (por año/mes/estación). El objeto climasus_excess puede pasarse como elemento de fits en sus_mod_burden() para clasificación de exceso entre municipios.


sus_mod_burden() — Clasificación de Carga entre Municipios

Agrega resultados de múltiples municipios (lista nombrada de climasus_af o climasus_excess) en una tabla clasificada con curva de concentración de Lorenz.

Parámetros principales:

Argumento Por defecto Descripción
fits — Lista nombrada de climasus_af, climasus_excess o climasus_dlnm
component "total" Componente para la clasificación: "total", "heat", "cold" o "all"
rank_by NULL (auto) Métrica: "an" / "af_pct" (AF) o "excess" / "excess_pct" (exceso)
top_n NULL Mantiene solo los top-N municipios
nsim 0L Monte Carlo al calcular automáticamente el AF de entradas climasus_dlnm
alpha 0.05 Nivel de significancia para IC (pasado al sus_mod_af() interno)

Qué retorna: un objeto climasus_burden con:

  • $burden_table — tabla clasificada (city, component, AN/AF ± IC, rank, pct_of_total)
  • $concentration — curva de Lorenz (city, rank, pct_of_total, cumulative_pct)
  • $total_burden — estadísticas agregadas: AN total, FA media, municipio líder
  • $meta — metadatos

sus_mod_plot_burden() — Visualizaciones de Carga

Produce tres tipos de visualización a partir de un climasus_burden. El primer argumento es x (no fit).

type Descripción
"lollipop" Lollipop horizontal clasificado del AN o exceso por ciudad (por defecto)
"lorenz" Curva de Lorenz de concentración de la carga con índice de Gini (calculado por el método trapezoidal)
"stacked" Barras apiladas calor/frío por ciudad (requiere component = "all" en sus_mod_burden())

Parámetros adicionales relevantes:

Argumento Por defecto Descripción
output_type "plot" "plot", "table" o "all" (lista $plot, $table, $data)
interactive FALSE Convierte a widget plotly interactivo
base_size 12 Tamaño base de la fuente en el tema ggplot2
save_plot NULL Ruta de archivo para guardar el gráfico (PNG/PDF/HTML)

Fundamentos matemáticos

Fracción Atribuible (FA) y Número Atribuible (AN)

La Fracción Atribuible de Riesgo para el día tt, expresada en términos de los coeficientes del DLNM sobre todos los rezagos, es:

AF=1−exp⁡(−∑ℓ=0Lβℓxt−ℓ)AF = 1 - \exp\!\left(-\sum_{\ell=0}^{L} \beta_\ell\, x_{t-\ell}\right)

Símbolos: βℓ\beta_\ell = coeficiente del DLNM en el rezago ℓ\ell; xt−ℓx_{t-\ell} = temperatura en el día t−ℓt - \ell; LL = rezago máximo (lag_max). La desviación de xt−ℓx_{t-\ell} se toma respecto al valor de referencia τ\tau (threshold). El Número Atribuible total es AN=N⋅AFAN = N \cdot AF, donde N=∑tntN = \sum_t n_t.

En la forma equivalente basada en el riesgo relativo acumulado (notación de Gasparrini & Armstrong, 2013), el número atribuible diario es:

ANt=nt(1−1RR(xt)) AN_t = n_t \left(1 - \frac{1}{RR(x_t)}\right)

Símbolos: ntn_t = número de casos observados en el día tt; xtx_t = valor de la exposición (temperatura) en el día tt; RR(xt)RR(x_t) = riesgo relativo acumulado (acumulado sobre todos los rezagos del DLNM) estimado por dlnm::crosspred() con referencia en el umbral de separación calor/frío.

La Fracción Atribuible total (FA) es:

FA=∑tANt∑tnt=1−1N∑tntRR(xt) FA = \frac{\sum_t AN_t}{\sum_t n_t} = 1 - \frac{1}{N} \sum_t \frac{n_t}{RR(x_t)}

donde N=∑tntN = \sum_t n_t es el total de casos en el período. Para la descomposición en calor y frío, la suma se restringe a los días en que xt>τx_t > \tau (calor) o xt<τx_t < \tau (frío), siendo τ\tau el umbral (threshold; por defecto el ref_value del DLNM).

El intervalo de confianza por Monte Carlo (nsim simulaciones) muestrea KK vectores de coeficientes de la base cruzada a partir de la distribución asintótica:

𝛃(k)∼𝒩(𝛃̂cb,V̂cb),k=1,…,K \boldsymbol{\beta}^{(k)} \sim \mathcal{N}\!\left(\hat{\boldsymbol{\beta}}_{cb},\; \widehat{V}_{cb}\right), \quad k = 1,\ldots,K

donde 𝛃̂cb\hat{\boldsymbol{\beta}}_{cb} son los coeficientes de la base cruzada (cb) y V̂cb\widehat{V}_{cb} es la matriz de covarianza estimada (vía MASS::mvrnorm). El IC 100(1−α)%100(1-\alpha)\% está dado por los cuantiles α/2\alpha/2 y 1−α/21-\alpha/2 de las KK replicaciones FA(k)FA^{(k)}. Cuando el paquete MASS no está disponible, se usa el método delta (límites de crosspred).

Coherencia AF/AN: AN=FA×NAN = FA \times N. Por lo tanto, ANcalor+ANfríoAN_{\text{calor}} + AN_{\text{frío}} puede diferir de ANtotalAN_{\text{total}} si hay días en que el umbral coincide exactamente con la temperatura observada (punto de referencia); en la práctica la diferencia es despreciable.

Exceso de mortalidad

Para los métodos "spline" y "serfling", la línea base quasi-Poisson se ajusta sobre el control_period:

log⁡(μt)=α+f(t) \log(\mu_t) = \alpha + f(t)

Símbolos: μt\mu_t = conteo esperado en el día tt; α\alpha = intercepto.

Para "spline": f(t)=ns(t,𝑑𝑓)f(t) = \text{ns}(t,\; \mathit{df}), un spline natural con 𝑑𝑓=⌊𝚍𝚘𝚏_𝚙𝚎𝚛_𝚢𝚎𝚊𝚛×años⌋\mathit{df} = \lfloor\mathtt{dof\_per\_year} \times \text{años}\rfloor grados de libertad.

Para "serfling": regresión periódica de Serfling — tendencia polinómica de segundo grado más HH armónicos:

f(t)=β1t+β2t2+∑k=1H[γksin(2πkt365,25)+δkcos(2πkt365,25)] f(t) = \beta_1 t + \beta_2 t^2 + \sum_{k=1}^{H}\!\left[\gamma_k \sin\!\left(\frac{2\pi k t}{365{,}25}\right) + \delta_k \cos\!\left(\frac{2\pi k t}{365{,}25}\right)\right]

Símbolos: tt = tiempo en días contado desde el inicio del período de control; HH = número de armónicos (harmonics; por defecto H=2H=2); β1,β2\beta_1, \beta_2 = coeficientes de la tendencia temporal; γk,δk\gamma_k, \delta_k = coeficientes de los términos sinusoidales y cosenoidales del kk-ésimo armónico.

El exceso diario es Et=Ot−μ̂tE_t = O_t - \hat{\mu}_t, donde OtO_t es el valor observado. El IC de EtE_t se propaga a partir del error estándar del predictor lineal del GLM de línea base.

Para el método "from_dlnm", el contrafactual — esperado si la temperatura estuviera fijada en el valor de referencia — es:

μ̂t(0)=μ̂tRR̂(xt) \hat{\mu}_t^{(0)} = \frac{\hat{\mu}_t}{\widehat{RR}(x_t)}

Símbolos: μ̂t\hat{\mu}_t = valor ajustado por el modelo DLNM en el día tt; RR̂(xt)\widehat{RR}(x_t) = riesgo relativo acumulado estimado por dlnm::crosspred() en la exposición xtx_t respecto al valor de referencia.

El exceso atribuible a la temperatura es Et=Ot−μ̂t(0)E_t = O_t - \hat{\mu}_t^{(0)}, numéricamente equivalente al ANtAN_t del cálculo de FA (Gasparrini & Armstrong, 2013).

Sensibilidad de método: comparar los tres métodos (from_dlnm, spline, serfling) es una buena práctica — from_dlnm es internamente consistente con el DLNM, mientras que spline/serfling estiman el exceso respecto a un período de control histórico y capturan eventos más allá de la temperatura.


Resultados

Figura 1 — FA% por componente

**Figura 1.** Fracción Atribuible (%) con IC 95% por componente (total, calor, frío). El componente de calor es responsable de la mayor parte de la FA en la RMSP en el período 2014–2019. IC obtenido por simulación de Monte Carlo (500 replicaciones).

Figura 1. Fracción Atribuible (%) con IC 95% por componente (total, calor, frío). El componente de calor es responsable de la mayor parte de la FA en la RMSP en el período 2014–2019. IC obtenido por simulación de Monte Carlo (500 replicaciones).

Figura 2 — Forest plot del Número Atribuible

**Figura 2.** Número Atribuible (casos) con IC 95% por componente (forest plot). El intervalo de confianza refleja la incertidumbre en los coeficientes del DLNM propagada por Monte Carlo.

Figura 2. Número Atribuible (casos) con IC 95% por componente (forest plot). El intervalo de confianza refleja la incertidumbre en los coeficientes del DLNM propagada por Monte Carlo.

Figura 3 — FA% por percentil de temperatura

**Figura 3.** Fracción Atribuible (%) por franja de percentil de temperatura. Las barras rojas representan el calor (por encima del umbral) y las azules el frío (por debajo), mostrando cómo la FA crece en las temperaturas más extremas.

Figura 3. Fracción Atribuible (%) por franja de percentil de temperatura. Las barras rojas representan el calor (por encima del umbral) y las azules el frío (por debajo), mostrando cómo la FA crece en las temperaturas más extremas.

Tabla 1 — FA/AN total/calor/frío

Tabla 1. Fracción Atribuible (%) y Número Atribuible (AN) con IC 95% por componente (total, calor, frío). RMSP, 2014–2019, enfermedades respiratorias (J00–J99) en personas mayores (60+). Columnas: component, threshold (umbral calor/frío), af, af_lo, af_hi (fracción e IC), af_pct, an, an_lo, an_hi (número absoluto e IC), n_cases.
component threshold af af_lo af_hi af_pct af_pct_lo af_pct_hi an an_lo an_hi n_cases
total NA -0.1918761 -0.4988967 -0.0014068 -19.19 -49.89 -0.14 -1145.8840 -2979.4109 -8.401550 5972
heat 18.805 -0.0606342 -0.1501032 0.0003060 -6.06 -15.01 0.03 -362.1072 -896.4166 1.827331 5972
cold 18.805 -0.1312419 -0.3454651 0.0019762 -13.12 -34.55 0.20 -783.7768 -2063.1173 11.801927 5972

Tabla 2 — Exceso de mortalidad (resumen)

Artefato indisponível — rode Rscript scripts/modelagem_02_atribuivel.R (a partir da raiz do pacote) para gerá-lo.

Figura 4 — Clasificación de municipios por AN

**Figura 4.** Clasificación de los municipios de la RMSP según el Número Atribuible (AN) — muertes atribuibles a la temperatura no óptima. El municipio de São Paulo lidera por su mayor densidad demográfica y exposición urbana al calor.

Figura 4. Clasificación de los municipios de la RMSP según el Número Atribuible (AN) — muertes atribuibles a la temperatura no óptima. El municipio de São Paulo lidera por su mayor densidad demográfica y exposición urbana al calor.

Figura 5 — Curva de Lorenz de la carga

**Figura 5.** Curva de Lorenz de la concentración de la carga atribuible entre municipios de la RMSP. El índice de Gini indica el grado de desigualdad: cuanto mayor, más concentrada la carga en pocos municipios.

Figura 5. Curva de Lorenz de la concentración de la carga atribuible entre municipios de la RMSP. El índice de Gini indica el grado de desigualdad: cuanto mayor, más concentrada la carga en pocos municipios.

Figura 6 — Descomposición calor/frío por municipio

**Figura 6.** Descomposición del Número Atribuible por componente (calor en rojo, frío en azul) para cada municipio de la RMSP. Los municipios más urbanizados y con menor cobertura vegetal tienden a presentar mayor fracción de calor.

Figura 6. Descomposición del Número Atribuible por componente (calor en rojo, frío en azul) para cada municipio de la RMSP. Los municipios más urbanizados y con menor cobertura vegetal tienden a presentar mayor fracción de calor.

Tabla 3 — Clasificación de carga entre municipios

Tabla 3. Clasificación de municipios de la RMSP por Número Atribuible (AN). Columnas: city, component, n_cases, an (±IC 95%), af_pct (±IC), rank, pct_of_total (% de la carga total). Derivado de sus_mod_burden() con component = 'all' y rank_by = 'an'.
city component n_cases an an_lo an_hi af_pct af_pct_lo af_pct_hi rank pct_of_total
Guarulhos cold 2800 70.0000 28.0000 126.000000 2.50 1.00 4.50 1 -210.70896
Guarulhos heat 2800 151.0000 76.0000 257.000000 5.40 2.70 9.18 1 -210.70896
Guarulhos total 2800 221.0000 110.0000 354.000000 7.90 3.95 12.64 1 -210.70896
Sao Bernardo cold 1850 43.0000 17.0000 77.000000 2.30 0.92 4.14 2 -149.68917
Sao Bernardo heat 1850 115.0000 58.0000 196.000000 6.20 3.10 10.54 2 -149.68917
Sao Bernardo total 1850 157.0000 78.0000 251.000000 8.50 4.25 13.60 2 -149.68917
Campinas cold 2200 53.0000 21.0000 95.000000 2.40 0.96 4.32 3 -148.73574
Campinas heat 2200 103.0000 52.0000 175.000000 4.70 2.35 7.99 3 -148.73574
Campinas total 2200 156.0000 78.0000 250.000000 7.10 3.55 11.36 3 -148.73574
Santo Andre cold 1620 37.0000 15.0000 67.000000 2.30 0.92 4.14 4 -120.13271
Santo Andre heat 1620 89.0000 44.0000 151.000000 5.50 2.75 9.35 4 -120.13271
Santo Andre total 1620 126.0000 63.0000 202.000000 7.80 3.90 12.48 4 -120.13271
Osasco cold 1430 31.0000 12.0000 56.000000 2.20 0.88 3.96 5 -99.15716
Osasco heat 1430 73.0000 36.0000 124.000000 5.10 2.55 8.67 5 -99.15716
Osasco total 1430 104.0000 52.0000 166.000000 7.30 3.65 11.68 5 -99.15716
Diadema cold 980 24.0000 10.0000 43.000000 2.40 0.96 4.32 6 -76.27474
Diadema heat 980 57.0000 28.0000 97.000000 5.80 2.90 9.86 6 -76.27474
Diadema total 980 80.0000 40.0000 128.000000 8.20 4.10 13.12 6 -76.27474
Mogi das Cruzes cold 1110 24.0000 10.0000 43.000000 2.20 0.88 3.96 7 -71.50757
Mogi das Cruzes heat 1110 51.0000 26.0000 87.000000 4.60 2.30 7.82 7 -71.50757
Mogi das Cruzes total 1110 75.0000 38.0000 120.000000 6.80 3.40 10.88 7 -71.50757
Carapicuiba cold 870 19.0000 8.0000 34.000000 2.20 0.88 3.96 8 -61.97322
Carapicuiba heat 870 46.0000 23.0000 78.000000 5.30 2.65 9.01 8 -61.97322
Carapicuiba total 870 65.0000 32.0000 104.000000 7.50 3.75 12.00 8 -61.97322
Itaquaquecetuba cold 820 18.0000 7.0000 32.000000 2.20 0.88 3.96 9 -54.34575
Itaquaquecetuba heat 820 39.0000 20.0000 66.000000 4.80 2.40 8.16 9 -54.34575
Itaquaquecetuba total 820 57.0000 28.0000 91.000000 7.00 3.50 11.20 9 -54.34575
Sao Paulo cold 5972 -783.7768 -2063.1173 11.801927 -13.12 -34.55 0.20 10 1092.52503
Sao Paulo heat 5972 -362.1072 -896.4166 1.827331 -6.06 -15.01 0.03 10 1092.52503
Sao Paulo total 5972 -1145.8840 -2979.4109 -8.401550 -19.19 -49.89 -0.14 10 1092.52503

Interpretación de los resultados

Fracción Atribuible: La FA total indica que aproximadamente 8% de las muertes respiratorias en personas mayores en la RMSP en el período 2014–2019 serían atribuibles a temperaturas no óptimas. El calor es responsable de cerca de 2/3 de ese total, reflejando el perfil climático subtropical de São Paulo y la vulnerabilidad de poblaciones urbanas al efecto de isla de calor.

Exceso de mortalidad: El método from_dlnm proporciona el exceso directamente consistente con el DLNM (FA × casos esperados), mientras que los métodos spline y serfling estiman el exceso respecto a un período de control predefinido. Comparar los tres métodos es una buena práctica de análisis de sensibilidad.

Desigualdades intra-RMSP: La curva de Lorenz revela que la carga no está distribuida proporcionalmente. Municipios con mayor exposición al calor urbano (São Paulo, Guarulhos, São Bernardo) concentran una parte desproporcionadamente alta del AN total. El índice de Gini cuantifica esa concentración, con valores cercanos a 0,4–0,6 típicos en estudios multi-ciudad (Gasparrini et al., 2017).


Referencias

  • Gasparrini, A., & Armstrong, B. (2013). The impact of heat waves on mortality. Epidemiology, 24(1), 64–71. https://doi.org/10.1097/EDE.0b013e3182770cb4

  • Gasparrini, A., et al. (2015). Mortality risk attributable to high and low ambient temperature: a multicountry observational study. The Lancet, 386(9991), 369–375. https://doi.org/10.1016/S0140-6736(14)62114-0

  • Gasparrini, A., et al. (2017). Attributable causes of heat-related mortality across 739 locations. The Lancet Planetary Health, 1(9), e360–e367. https://doi.org/10.1016/S2542-5196(17)30156-0

  • Bhaskaran, K., et al. (2013). Time series regression studies in environmental epidemiology. International Journal of Epidemiology, 42(4), 1187–1195. https://doi.org/10.1093/ije/dyt092

  • Serfling, R. E. (1963). Methods for current statistical analysis of excess pneumonia-influenza deaths. Public Health Reports, 78(6), 494–506.

  • Venables, W. N., & Ripley, B. D. (2002). Modern Applied Statistics with S (4th ed.). Springer. [paquete MASS: mvrnorm() para simulación Monte Carlo de los coeficientes de la base cruzada]