---
title: "Geography and epidemiological analysis"
author: "Renato Prado Siqueira"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Geography and epidemiological analysis}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, comment = "#>")
library(datasus)
```

## Overview

The package includes an offline IBGE territorial reference and
dependency-free helpers for common epidemiological calculations. These tools
can be used with data retrieved through `datasus` or with any data frame that
uses compatible identifiers.

## Territorial reference

Inspect the current hierarchy at region, state or municipality level:

```{r territories}
datasus_territorios("regiao")
head(datasus_territorios("uf"))
head(datasus_territorios("municipio", uf = "MS"))
```

DATASUS commonly uses six-digit municipality codes, while IBGE publishes a
seven-digit identifier. Normalize either form explicitly:

```{r normalize-codes}
normalizar_codigo_ibge(
  c("500270", "500370"),
  nivel = "municipio",
  formato = "ibge"
)
```

`validar_codigo_ibge()` reports whether identifiers belong to the current
reference:

```{r validate-codes}
validar_codigo_ibge(c("5002704", "5003702", "9999999"))
```

## Add geography to observations

Use `adicionar_territorio()` to attach municipality, state and region
information without changing row order:

```{r add-geography}
events <- data.frame(
  codigo = c("500270", "500370"),
  ano = c(2025L, 2025L),
  casos = c(18L, 7L)
)

events <- adicionar_territorio(events, codigo = "codigo")
events
```

The bundled hierarchy describes current territorial units. Historical
observations are not automatically redistributed after boundary changes.

## Make missing combinations explicit

Absent municipality-period combinations can be created before calculating
rates or plotting a panel:

```{r complete-geography, eval=FALSE}
panel <- completar_territorios(
  events,
  codigo = "codigo",
  periodo = "ano",
  uf = "MS",
  periodos = 2023:2025,
  preencher = list(casos = 0)
)
```

Choose the territorial universe and periods explicitly. An absent record is
not always equivalent to a true zero.

## Join population denominators

`juntar_populacao()` requires unique population keys, preserves observation
order and reports unmatched rows by default:

```{r population-join}
cases <- data.frame(
  codigo_municipio = c("5002704", "5003702"),
  ano = c(2025L, 2025L),
  casos = c(18L, 7L)
)
population <- data.frame(
  codigo_municipio = c("5002704", "5003702"),
  ano = c(2025L, 2025L),
  habitantes = c(925000, 95000)
)

analysis <- juntar_populacao(
  cases,
  population,
  por = c(
    codigo_municipio = "codigo_municipio",
    ano = "ano"
  ),
  coluna_populacao = "habitantes",
  nome = "habitantes"
)
analysis
```

## Rates, proportions and case fatality

Vector helpers are useful for direct calculations:

```{r vector-rates}
calcular_taxa(
  eventos = c(10, 25),
  populacao = c(10000, 20000)
)

intervalo_taxa(
  eventos = 10,
  populacao = 10000,
  confianca = 0.95
)
```

The grouped indicator engine aggregates counts before calculating the
estimate. This is preferable to averaging rates calculated for individual
rows:

```{r grouped-rates}
taxa_incidencia(
  analysis,
  casos = "casos",
  populacao = "habitantes",
  grupo = "ano",
  confianca = 0.95
)

outcomes <- data.frame(
  ano = c(2024L, 2024L, 2025L, 2025L),
  casos = c(50, 30, 45, 35),
  obitos = c(2, 1, 1, 2)
)
letalidade(
  outcomes,
  obitos = "obitos",
  casos = "casos",
  grupo = "ano",
  confianca = 0.95
)
```

`proporcao()` and `taxa_mortalidade()` use the same grouped interface.

## Epidemiological calendar and moving averages

```{r epi-calendar}
semana_epidemiologica(
  as.Date(c("2025-01-01", "2025-12-31", "2026-01-01"))
)

head(calendario_epidemiologico(2026))

media_movel(
  c(2, 5, 3, 8, 7, 6, 9),
  janela = 3,
  parcial = TRUE
)
```

## Direct age standardization

The package supplies WHO 2000--2025, Segi and Scandinavian standard
populations:

```{r standard-populations}
head(populacao_padrao("oms"))
```

Pass age-specific counts and populations to `padronizar_idade()`:

```{r age-standardization, eval=FALSE}
standardized <- padronizar_idade(
  eventos = deaths_by_age$obitos,
  populacao = deaths_by_age$habitantes,
  idade = deaths_by_age$faixa_etaria,
  populacao_padrao = populacao_padrao("oms"),
  grupo = deaths_by_age$ano,
  confianca = 0.95
)
```
