Análise Epidemiológica da Síndrome Respiratória Aguda Grave (SRAG) pós-período Emergência de Saúde da 2019-nCoV (2022–2025)
Autor
Nucleo de Inteligencia e Vigilancia em Saude (NIVS) - SES/SP
Data de Publicação
24 de outubro de 2025
Software: R Core Team (2023). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.
1 Introdução
A Síndrome Respiratória Aguda Grave (SRAG) representa um dos principais agravos monitorados pela vigilância epidemiológica brasileira, reunindo casos graves de infecções respiratórias causadas por diferentes agentes virais, como SARS-CoV-2 (Covid-19), vírus Influenza e vírus sincicial respiratório (VSR).
Após a fase aguda da pandemia de Covid-19, a análise dos dados de SRAG no período pós-2022 tornou-se essencial para compreender a transição do perfil clínico-epidemiológico e a reemergência de outros vírus respiratórios sazonais.
Os dados utilizados neste estudo foram obtidos do Sistema de Informação da Vigilância Epidemiológica da Gripe (SIVEP-Gripe), disponibilizado publicamente no portal OpenDataSUS (Ministério da Saúde), disponível em: https://opendatasus.saude.gov.br/dataset/srag-2021-a-2024.
As informações foram extraídas e integradas a partir da viewvw_sivep_com_drs do Data Warehouse de Vigilância Epidemiológica (DW_NIVS_AUTO) da Secretaria de Estado da Saúde de São Paulo, abrangendo os anos de 2022 a 2025.
2 Objetivos
O presente estudo tem como objetivo caracterizar o comportamento epidemiológico da SRAG no Estado de São Paulo no período pós-pandemia (≥ 2022), com base nos registros do SIVEP-Gripe, contemplando quatro eixos principais de análise:
Perfil epidemiológico — descrever a distribuição dos casos confirmados de SRAG segundo agente etiológico (Influenza, VSR e Covid-19), sexo, faixa etária e raça/cor.
Incidência — estimar a taxa de incidência por 100 mil habitantes, estratificada por sexo, idade e raça/cor, considerando denominadores populacionais anuais.
Gravidade — avaliar a proporção de internações em UTI, uso de suporte ventilatório e taxa de letalidade (óbitos entre casos) segundo agente e perfis demográficos.
Séries temporais — analisar a tendência temporal dos casos a partir da data de início dos sintomas (DT_SIN_PRI), marco epidemiológico padrão para consolidação das semanas epidemiológicas (SEM_PRI).
Essas análises permitem identificar padrões sazonais, diferenças entre agentes virais e potenciais vulnerabilidades demográficas, contribuindo para o planejamento das ações de vigilância e resposta em saúde pública.
O banco de dados utilizado nesta análise contém variáveis que descrevem de forma padronizada as dimensões clínicas, demográficas, laboratoriais e de evolução dos casos registrados no sistema SIVEP-Gripe.
- dt_sin_pri — data do primeiro sintoma; marco temporal para perfil e séries (fonte SIVEP, campo DT_SIN_PRI).
- sem_pri — semana epidemiológica dos sintomas (SS) calculada a partir de DT_SIN_PRI.
- ano — ano civil derivado de dt_sin_pri.
Diagnóstico
- diagnostico — categoria consolidada do agente: Covid-19, Influenza, Vírus sincicial respiratório, SRAG não especificado, SRAG em investigação, Outras etiologias. Baseia-se na classificação final do caso (PCR_VSR, PCR_ADENO, PCR_PARA1, PCR_PARA2, PCR_PARA3, PCR_PARA4, PCR_METAP, PCR_BOCA, PCR_RINO e PCR_OUTRO).
Demografia
- sexo — sexo biológico (M/F; recodificado para Masculino/Feminino/Ignorado).
- evolucao — evolução do caso (1 Cura; 2 Óbito; 3 Óbito outras causas; 9 Ignorado).
- obito — indicador (0/1) derivado da evolução.
- dt_evoluca — data de alta/óbito.
População (denominadores)
- pop_total, pop_00a14, pop_15a64, pop_65emais — população municipal por ano (fonte), unidas por cod_7_mun e ano. Para anos > 2023 aplica-se fallback para 2023 (mantém denominadores para 2024–2025).
Data summary
Name
df_2022_2025_raw
Number of rows
330856
Number of columns
26
_______________________
Column type frequency:
character
17
Date
1
numeric
8
________________________
Group variables
None
Variable type: character
skim_variable
n_missing
complete_rate
min
max
empty
n_unique
whitespace
diagnostico
0
1
8
28
0
6
0
sexo
0
1
1
1
0
3
0
faixa_etaria
0
1
4
7
0
9
0
municipio
0
1
3
26
0
645
0
drs_nome_2022
0
1
5
21
0
17
0
gve_nome
0
1
5
21
0
28
0
hospital
0
1
1
4
0
4
0
uti
0
1
1
4
0
4
0
suporte_ven
0
1
1
4
0
5
0
dt_interna
0
1
4
10
0
1480
0
dt_entuti
0
1
4
10
0
1422
0
dt_saiduti
0
1
4
10
0
1396
0
dt_evoluca
0
1
4
10
0
1392
0
pop_total
0
1
3
8
0
1268
0
pop_00a14
0
1
3
7
0
1164
0
pop_15a64
0
1
3
7
0
1254
0
pop_65emais
0
1
3
7
0
1136
0
Variable type: Date
skim_variable
n_missing
complete_rate
min
max
median
n_unique
dt_sin_pri
0
1
2022-01-02
2025-10-22
2023-03-16
1390
Variable type: numeric
skim_variable
n_missing
complete_rate
mean
sd
p0
p25
p50
p75
p100
hist
raca
0
1.00
2.85
2.83
1
1
1
4
9
▇▂▁▁▂
idade_num
0
1.00
41.66
33.90
-9
5
45
74
123
▇▂▅▆▁
cod_7_mun
0
1.00
3534790.62
17021.78
3500105
3518800
3540804
3550308
3557303
▃▂▂▂▇
cod_17drs
0
1.00
6.35
5.79
1
1
6
11
17
▇▃▁▁▃
sem_pri
0
1.00
22.30
14.55
1
9
21
34
52
▇▆▆▅▃
ano
0
1.00
2023.07
1.14
2022
2022
2023
2024
2025
▇▃▁▃▃
evolucao
12921
0.96
1.37
1.25
1
1
1
1
9
▇▁▁▁▁
obito
0
1.00
0.14
0.34
0
0
0
0
1
▇▁▁▁▁
4 Limpeza e transformação dos dados SRAG 2022-2025
O conjunto de dados SRAG 2022–2025, proveniente do sistema SIVEP-Gripe e disponibilizado pelo OpenDataSUS, reúne registros de casos de Síndrome Respiratória Aguda Grave (SRAG) notificados no período pós-pandêmico. O objetivo principal do pré-processamento foi estruturar uma base padronizada e analiticamente consistente para caracterizar o perfil epidemiológico e clínico dos casos confirmados de Covid-19, Influenza e Vírus Sincicial Respiratório (VSR).
O tratamento inicial incluiu a conversão e validação de variáveis de data, a recodificação de rótulos demográficos e clínicos, e a definição de fatores categóricos para análises reprodutíveis. Foram implementadas rotinas de saneamento, como o tratamento seguro de valores ausentes e a verificação da ordem cronológica entre eventos clínicos (sintoma, internação, UTI e desfecho).
Além disso, foram criadas variáveis derivadas que permitem a mensuração de intervalos temporais — como o tempo entre o início dos sintomas e a internação, a duração da permanência em UTI e o tempo total de hospitalização. Essas métricas possibilitam avaliar gravidade, evolução clínica e eficiência da resposta assistencial entre diferentes agentes etiológicos e perfis populacionais.
O resultado é um banco limpo e consistente (df_2022_2025_clean), que serve de base para a análise descritiva, cálculo de incidência por 100 mil habitantes e geração de séries temporais por semana epidemiológica. Espera-se que essa padronização viabilize comparações interanuais e inter-regionais, além de subsidiar indicadores estratégicos de vigilância em saúde respiratória.
As variáveis de data (dt_sin_pri, dt_interna, dt_entuti, dt_saiduti, dt_evoluca) foram convertidas para o formato Date com tratamento seguro de valores nulos e inconsistentes. Variáveis populacionais (pop_total, pop_00a14, pop_15a64, pop_65emais) foram convertidas para numéricas.
Recodificação de rótulos
Campos categóricos foram harmonizados conforme dicionários oficiais do SIVEP-Gripe:
– sexo → Masculino, Feminino, Ignorado
– raca → Branca, Preta, Amarela, Parda, Indígena, Ignorado
– hospital, uti e suporte_ven → recodificados para respostas binárias ou ordinais
– evolucao → Cura, Óbito, Óbito outras causas, Ignorado
– diagnostico → agente etiológico principal consolidado.
Criação de fatores e padronização textual
Variáveis categóricas foram transformadas em fatores com níveis ordenados, assegurando consistência estatística. Nomes de municípios, GVEs e DRSs foram normalizados em caixa alta, eliminando duplicidades por variação ortográfica.
Regras de qualidade temporal
Foram incluídas verificações de coerência entre datas, resultando em flags de controle (flag_ordem_ok, flag_uti_sem_internacao) que sinalizam possíveis inconsistências na sequência cronológica dos eventos clínicos.
Cálculo de métricas derivadas de tempo (em dias)
Foram criadas as seguintes variáveis derivadas: - dias_sintoma_internacao — do início dos sintomas até a internação.
- dias_internacao_uti — da internação até a entrada em UTI.
- dias_uti — duração da permanência em UTI.
- dias_internacao_total — tempo total entre internação e desfecho.
- dias_sintoma_desfecho — intervalo entre sintoma inicial e desfecho final.
- dias_sintoma_uti — tempo do início dos sintomas até a primeira entrada em UTI.
- dias_pos_uti_desfecho — tempo entre a saída da UTI e o desfecho clínico.
Flags de evento e desfecho
Foram criadas variáveis indicadoras (flag_internacao, flag_uti, flag_desfecho, flag_obito) para facilitar a estratificação de análises e o cálculo de proporções de gravidade e letalidade.
Data summary
Name
df_2022_2025_clean
Number of rows
330856
Number of columns
47
_______________________
Column type frequency:
character
4
Date
5
factor
9
logical
11
numeric
18
________________________
Group variables
None
Variable type: character
skim_variable
n_missing
complete_rate
min
max
empty
n_unique
whitespace
municipio
0
1
3
26
0
645
0
drs_nome_2022
0
1
5
21
0
17
0
gve_nome
0
1
5
21
0
28
0
agente
0
1
8
28
0
6
0
Variable type: Date
skim_variable
n_missing
complete_rate
min
max
median
n_unique
dt_sin_pri
0
1.00
2022-01-02
2025-10-22
2023-03-16
1390
dt_interna
10466
0.97
2011-07-09
2202-06-01
2023-03-18
1479
dt_entuti
236865
0.28
2020-12-01
2202-01-25
2023-04-17
1421
dt_saiduti
273689
0.17
2021-03-11
2025-10-23
2023-04-22
1395
dt_evoluca
27043
0.92
2022-01-02
2025-10-23
2023-03-22
1391
Variable type: factor
skim_variable
n_missing
complete_rate
ordered
n_unique
top_counts
diagnostico
0
1.00
FALSE
6
SRA: 151636, Cov: 104663, Vír: 26413, Inf: 22646
sexo
0
1.00
FALSE
3
Mas: 167611, Fem: 163229, Ign: 16
faixa_etaria
0
1.00
FALSE
9
1 -: 74559, 65 : 62092, > 8: 59096, 5 -: 42416
raca
0
1.00
FALSE
6
Bra: 200461, Par: 66084, Ign: 49244, Pre: 11873
hospital
0
1.00
FALSE
3
Sim: 322561, Não: 4960, Ign: 3335
uti
0
1.00
FALSE
3
Não: 200611, Sim: 95058, Ign: 35187
suporte_ven
0
1.00
FALSE
4
Não: 162734, Não: 90177, Ign: 45128, Inv: 32817
evolucao
12921
0.96
FALSE
4
Cur: 257938, Óbi: 44860, Óbi: 7931, Ign: 7206
semana_epi
0
1.00
FALSE
52
03: 12345, 02: 11949, 01: 10966, 04: 9878
Variable type: logical
skim_variable
n_missing
complete_rate
mean
count
flag_internacao
0
1
0.97
TRU: 320390, FAL: 10466
flag_uti
0
1
0.28
FAL: 236865, TRU: 93991
flag_desfecho
0
1
0.92
TRU: 303813, FAL: 27043
chk_si_in
0
1
0.99
TRU: 329086, FAL: 1770
chk_in_ut
0
1
1.00
TRU: 330856
chk_ut_su
0
1
1.00
TRU: 330856
chk_su_ev
0
1
1.00
TRU: 330856
chk_in_ev
0
1
1.00
TRU: 330856
chk_si_ev
0
1
1.00
TRU: 330856
flag_ordem_ok
0
1
0.99
TRU: 329086, FAL: 1770
flag_uti_sem_internacao
0
1
0.00
FAL: 330017, TRU: 839
Variable type: numeric
skim_variable
n_missing
complete_rate
mean
sd
p0
p25
p50
p75
p100
hist
idade_num
0
1.00
41.66
33.90
-9
5
45
74
123
▇▂▅▆▁
cod_7_mun
0
1.00
3534790.62
17021.78
3500105
3518800
3540804
3550308
3557303
▃▂▂▂▇
cod_17drs
0
1.00
6.35
5.79
1
1
6
11
17
▇▃▁▁▃
sem_pri
0
1.00
22.30
14.55
1
9
21
34
52
▇▆▆▅▃
ano
0
1.00
2023.07
1.14
2022
2022
2023
2024
2025
▇▃▁▃▃
obito
0
1.00
0.14
0.34
0
0
0
0
1
▇▁▁▁▁
pop_total
0
1.00
3172878.84
4796253.99
902
129255
427094
11429865
11450609
▇▁▁▁▃
pop_00a14
0
1.00
538635.95
808874.66
176
23588
75833
1914084
1953069
▇▁▁▁▃
pop_15a64
0
1.00
2237251.11
3382315.10
590
91480
300805
8054329
8081072
▇▁▁▁▃
pop_65emais
0
1.00
396991.78
605355.61
129
15861
56804
1416468
1461452
▇▁▁▁▃
flag_obito
12921
0.96
0.14
0.35
0
0
0
0
1
▇▁▁▁▁
dias_sintoma_internacao
12236
0.96
4.53
201.31
0
1
3
5
65751
▇▁▁▁▁
dias_internacao_uti
238472
0.28
1.44
216.32
0
0
0
0
65743
▇▁▁▁▁
dias_uti
274602
0.17
8.55
12.04
0
2
5
10
371
▇▁▁▁▁
dias_internacao_total
37247
0.89
8.81
17.61
0
3
5
9
1102
▇▁▁▁▁
dias_sintoma_desfecho
28608
0.91
12.59
20.44
0
5
9
14
1150
▇▁▁▁▁
dias_sintoma_uti
238472
0.28
5.34
216.50
0
1
3
6
65748
▇▁▁▁▁
dias_pos_uti_desfecho
275501
0.17
3.51
11.54
0
0
1
3
813
▇▁▁▁▁
5 Pergunta 1 - Perfil epidemiológico
Descrever a distribuição dos casos de SRAG segundo agente etiológico (Influenza, Vírus sincicial respiratório e Covid-19) nos perfis de sexo, faixa etária e raça/cor.
As análises apresentarão proporções internas a cada agente (composição do agente) e, quando útil, estratificação por ano (2022–2025) para captar mudanças de perfil ao longo do período.
Estimamos a incidência de SRAG por 100 mil habitantes, por agente etiológico (Covid-19, Influenza e Vírus sincicial respiratório), estratificada por idade e ano (2022–2025).
O numerador é o número de casos por DT_SIN_PRI (agregados por município/ano/agente).
Os denominadores populacionais são anuais por município e faixas etárias amplas (0–14, 15–64, 65+), com fallback de 2023 para anos > 2023.
Incidência por 100 mil — Estado (total), com IC95% (Poisson).
ano
diagnostico
n_casos_total
pop
taxa_100k
li
ls
2022
Covid-19
73143
44357746
164.89
163.70
166.09
2022
Influenza
2984
40566096
7.36
7.09
7.62
2022
Vírus sincicial respiratório
5221
39022554
13.38
13.02
13.74
2023
Covid-19
17757
44075484
40.29
39.70
40.88
2023
Influenza
2874
39313914
7.31
7.04
7.58
2023
Vírus sincicial respiratório
5667
40385601
14.03
13.67
14.40
2024
Covid-19
10020
43562062
23.00
22.55
23.45
2024
Influenza
6608
42323080
15.61
15.24
15.99
2024
Vírus sincicial respiratório
6233
41099188
15.17
14.79
15.54
2025
Covid-19
3743
41412473
9.04
8.75
9.33
2025
Influenza
10180
43278727
23.52
23.07
23.98
2025
Vírus sincicial respiratório
9292
43005249
21.61
21.17
22.05
Incidência por 100 mil — Estado por faixa etária, com IC95% (Poisson).
ano
diagnostico
faixa_pop3
n_casos
pop
taxa_100k
li
ls
2022
Covid-19
0-14
6239
7658579
81.46
79.44
83.49
2022
Covid-19
15-64
22436
30970369
72.44
71.50
73.39
2022
Covid-19
65+
44468
5274543
843.07
835.23
850.90
2022
Influenza
0-14
1100
6578703
16.72
15.73
17.71
2022
Influenza
15-64
813
25212110
3.22
3.00
3.45
2022
Influenza
65+
1071
4252867
25.18
23.67
26.69
2022
Vírus sincicial respiratório
0-14
4935
6892238
71.60
69.60
73.60
2022
Vírus sincicial respiratório
15-64
144
17378419
0.83
0.69
0.96
2022
Vírus sincicial respiratório
65+
142
2528757
5.62
4.69
6.54
2023
Covid-19
0-14
2684
7064771
37.99
36.55
39.43
2023
Covid-19
15-64
4808
29913858
16.07
15.62
16.53
2023
Covid-19
65+
10265
5384647
190.63
186.95
194.32
2023
Influenza
0-14
1337
6524507
20.49
19.39
21.59
2023
Influenza
15-64
849
24281088
3.50
3.26
3.73
2023
Influenza
65+
688
4042619
17.02
15.75
18.29
2023
Vírus sincicial respiratório
0-14
5489
7066062
77.68
75.63
79.74
2023
Vírus sincicial respiratório
15-64
103
16456778
0.63
0.51
0.75
2023
Vírus sincicial respiratório
65+
75
2412779
3.11
2.40
3.81
2024
Covid-19
0-14
1677
6854068
24.47
23.30
25.64
2024
Covid-19
15-64
2531
29194158
8.67
8.33
9.01
2024
Covid-19
65+
5812
5237807
110.96
108.11
113.82
2024
Influenza
0-14
2247
7013159
32.04
30.71
33.36
2024
Influenza
15-64
2159
28150715
7.67
7.35
7.99
2024
Influenza
65+
2202
4804701
45.83
43.92
47.74
2024
Vírus sincicial respiratório
0-14
5852
7186227
81.43
79.35
83.52
2024
Vírus sincicial respiratório
15-64
201
20816907
0.97
0.83
1.10
2024
Vírus sincicial respiratório
65+
180
2787786
6.46
5.51
7.40
2025
Covid-19
0-14
825
6172537
13.37
12.45
14.28
2025
Covid-19
15-64
961
25853988
3.72
3.48
3.95
2025
Covid-19
65+
1957
4814703
40.65
38.85
42.45
2025
Influenza
0-14
2823
7093112
39.80
38.33
41.27
2025
Influenza
15-64
2986
28818460
10.36
9.99
10.73
2025
Influenza
65+
4371
5106022
85.60
83.07
88.14
2025
Vírus sincicial respiratório
0-14
8586
7567723
113.46
111.06
115.86
2025
Vírus sincicial respiratório
15-64
312
21919337
1.42
1.27
1.58
2025
Vírus sincicial respiratório
65+
394
3596022
10.96
9.87
12.04
7 Pergunta 3 - Gravidade
Avaliar a gravidade dos casos de SRAG segundo agente etiológico (Covid-19, Influenza e Vírus Sincicial Respiratório) e perfis demográficos (sexo, faixa etária, raça/cor).
Indicadores principais:
% UTI — proporção de pacientes que passaram por UTI entre os internados;
Suporte ventilatório — proporção com qualquer suporte entre internados e o perfil do suporte (invasivo vs não invasivo);
Letalidade (CFR) — proporção de óbitos entre casos com desfecho conhecido (Cura ou Óbito).
Serão mostradas estratificações por ano (2022–2025) e perfis demográficos, com intervalos de confiança (IC95%) binomiais (Wilson) e regras de qualidade (ex.: exclusão de Ignorado no denominador).
Analisamos a tendência temporal dos casos de SRAG a partir da data de início dos sintomas (DT_SIN_PRI), consolidando-os por semana epidemiológica (SEM_PRI) e ano.
Calcularemos contagens semanais de casos por agente etiológico (Covid-19, Influenza e VSR), com opção de suavização (médias móveis) para destacar o sinal de tendência. As séries podem ser apresentadas no nível estadual (soma dos municípios) e desagregadas por DRS/município quando necessário.
8.2.1 Visualização — Série temporal interativa (Estado)
Código fonte
---title: "Análise Epidemiológica da Síndrome Respiratória Aguda Grave (SRAG) pós-período Emergência de Saúde da 2019-nCoV (2022–2025)"author: "Nucleo de Inteligencia e Vigilancia em Saude (NIVS) - SES/SP"date: todaydate-format: "D [de] MMMM [de] YYYY"lang: pt-BRformat: html: embed-resources: true # HTML autocontido (essencial no RPubs) toc: true toc-depth: 3 number-sections: true smooth-scroll: true code-tools: true # botão para mostrar/ocultar código quando echo=FALSE df-print: paged code-fold: false theme: flatly title-block-banner: false link-external-newwindow: trueeditor: visualexecute: echo: false # esconder código por padrão (usável via code-tools) warning: false message: false cache: false freeze: auto # congela saída até o código mudar (bom p/ rel. estável)---<br><br><p style="text-align: justify;">**Software:** R Core Team (2023). *R: A language and environment for statistical computing*. R Foundation for Statistical Computing, Vienna, Austria. URL <https://www.R-project.org/>.</p><br><br># Introdução<p style="text-align: justify;">A Síndrome Respiratória Aguda Grave (SRAG) representa um dos principais agravos monitorados pela vigilância epidemiológica brasileira, reunindo casos graves de infecções respiratórias causadas por diferentes agentes virais, como SARS-CoV-2 (Covid-19), vírus Influenza e vírus sincicial respiratório (VSR).</p><p style="text-align: justify;">Após a fase aguda da pandemia de Covid-19, a análise dos dados de SRAG no período **pós-2022** tornou-se essencial para compreender a transição do perfil clínico-epidemiológico e a reemergência de outros vírus respiratórios sazonais.</p><p style="text-align: justify;">Os dados utilizados neste estudo foram obtidos do **Sistema de Informação da Vigilância Epidemiológica da Gripe (SIVEP-Gripe)**, disponibilizado publicamente no portal **OpenDataSUS** (Ministério da Saúde), disponível em: <https://opendatasus.saude.gov.br/dataset/srag-2021-a-2024>.</p><p style="text-align: justify;">As informações foram extraídas e integradas a partir da *view* `vw_sivep_com_drs` do **Data Warehouse de Vigilância Epidemiológica (DW_NIVS_AUTO)** da Secretaria de Estado da Saúde de São Paulo, abrangendo os anos de **2022 a 2025**.</p><br><br># Objetivos<p style="text-align: justify;">O presente estudo tem como objetivo caracterizar o comportamento epidemiológico da SRAG no Estado de São Paulo no período pós-pandemia (≥ 2022), com base nos registros do SIVEP-Gripe, contemplando quatro eixos principais de análise:</p>1. **Perfil epidemiológico** — descrever a distribuição dos casos confirmados de SRAG segundo agente etiológico (Influenza, VSR e Covid-19), sexo, faixa etária e raça/cor.\2. **Incidência** — estimar a taxa de incidência por 100 mil habitantes, estratificada por sexo, idade e raça/cor, considerando denominadores populacionais anuais.\3. **Gravidade** — avaliar a proporção de internações em UTI, uso de suporte ventilatório e taxa de letalidade (óbitos entre casos) segundo agente e perfis demográficos.\4. **Séries temporais** — analisar a tendência temporal dos casos a partir da **data de início dos sintomas (DT_SIN_PRI)**, marco epidemiológico padrão para consolidação das semanas epidemiológicas (SEM_PRI).<p style="text-align: justify;">Essas análises permitem identificar padrões sazonais, diferenças entre agentes virais e potenciais vulnerabilidades demográficas, contribuindo para o planejamento das ações de vigilância e resposta em saúde pública.</p>```{r}#| label: carregamento-pacotes#| echo: false#| message: false#| warning: false# Baixando os dadossuppressPackageStartupMessages({library(DBI)library(odbc)library(readr)library(dplyr)library(stringr)library(purrr)library(fs)library(lubridate)library(tidyr)library(forcats)library(stringi)library(tibble)library(ggplot2)library(scales)library(skimr)library(knitr)library(gtsummary)})``````{r setup, include=FALSE}#| label: db-connection#| echo: false#| message: false#| warning: falseget_con <-function() { DBI::dbConnect( odbc::odbc(),Driver ="ODBC Driver 18 for SQL Server",Server =Sys.getenv("SQL_SERVER"),Database =Sys.getenv("SQL_DB"),UID =Sys.getenv("SQL_UID"),PWD =Sys.getenv("SQL_PWD"),Encrypt ="no" )}run_query <-function(sql) { con <-get_con()on.exit(DBI::dbDisconnect(con), add =TRUE) DBI::dbGetQuery(con, sql)}```<br><br># Dados SRAG pós-pandemia (2022-2025)<p style="text-align: justify;">Com base no Dicionário de Dados SRAG 2019–2025 do Ministério da Saúde, disponivel em: <https://opendatasus.saude.gov.br/dataset/39a4995f-4a6e-440f-8c8f-b00c81fae0d0/resource/3135ac9c-2019-4989-a893-2ed50ebd8e68/download/dicionario-de-dados-2019-a-2025.pdf></p><p style="text-align: justify;">O banco de dados utilizado nesta análise contém variáveis que descrevem de forma padronizada as dimensões clínicas, demográficas, laboratoriais e de evolução dos casos registrados no sistema SIVEP-Gripe.</p><br><br>```{r}#| label: carregamento-dados#| echo: false#| message: false#| warning: falsequery_2022_2025 <-"WITH base AS ( SELECT /* ---------------- Tempo ---------------- */ CAST(v.DT_SIN_PRI AS date) AS dt_sin_pri, v.SEM_PRI AS sem_pri, YEAR(CAST(v.DT_SIN_PRI AS date)) AS ano, /* ------------- Diagnóstico ------------- */ v.classi_resumida AS diagnostico, /* --------------- Demografia ------------- */ v.CS_SEXO AS sexo, v.NU_IDADE_N AS idade_num, v.FAIXA_ETARIA_DESC AS faixa_etaria, v.CS_RACA AS raca, /* --------------- Território ------------- */ v.COD_7_mun AS cod_7_mun, v.MUNICIPIO AS municipio, v.COD_17DRS AS cod_17drs, v.[17DRS_NOME_2022] AS drs_nome_2022, v.GVE_NOME AS gve_nome, /* ----------- Gravidade / Desfecho ----------- */ v.HOSPITAL AS hospital, v.UTI AS uti, v.SUPORT_VEN AS suporte_ven, v.EVOLUCAO AS evolucao, v.obito AS obito, v.DT_INTERNA AS dt_interna, v.DT_ENTUTI AS dt_entuti, v.DT_SAIDUTI AS dt_saiduti, v.DT_EVOLUCA AS dt_evoluca FROM DW_NIVS_AUTO.dbo.vw_sivep_com_drs AS v WHERE v.DT_SIN_PRI IS NOT NULL AND TRY_CAST(v.DT_SIN_PRI AS date) >= '2022-01-02')SELECT /* --------------------------------------------------------------- (1) PERFIL EPIDEMIOLÓGICO ---------------------------------------------------------------- */ b.diagnostico, b.sexo, b.faixa_etaria, b.raca, b.idade_num, /* --------------------------------------------------------------- (2) TERRITÓRIO ---------------------------------------------------------------- */ b.cod_7_mun, b.municipio, b.cod_17drs, b.drs_nome_2022, b.gve_nome, /* --------------------------------------------------------------- (3) TEMPO (SÉRIE HISTÓRICA) ---------------------------------------------------------------- */ b.dt_sin_pri, b.sem_pri, b.ano, /* --------------------------------------------------------------- (4) GRAVIDADE / DESFECHO ---------------------------------------------------------------- */ b.hospital, b.uti, b.suporte_ven, b.evolucao, b.obito, b.dt_interna, b.dt_entuti, b.dt_saiduti, b.dt_evoluca, /* --------------------------------------------------------------- (5) POPULAÇÃO — com fallback 2023 para anos > 2023 ---------------------------------------------------------------- */ p.pop_total, p.pop_00a14, p.pop_15a64, p.pop_65emaisFROM base AS bLEFT JOIN DW_NIVS_AUTO.dbo.View_serie_populacao2000a2023 AS p ON p.cod_ibge = b.cod_7_mun AND p.ano = CASE WHEN b.ano > 2023 THEN 2023 ELSE b.ano END;"df_2022_2025_raw <-run_query(query_2022_2025)```<br><br>::: panel-tabset## Descrição dos atributos**Tempo**> \- **dt_sin_pri** — data do primeiro sintoma; marco temporal para perfil e séries (fonte SIVEP, campo DT_SIN_PRI).>> \- **sem_pri** — semana epidemiológica dos sintomas (SS) calculada a partir de DT_SIN_PRI.>> \- **ano** — ano civil derivado de dt_sin_pri.<br><br>**Diagnóstico**> \- **diagnostico** — categoria consolidada do agente: *Covid-19*, *Influenza*, *Vírus sincicial respiratório*, *SRAG não especificado*, *SRAG em investigação*, *Outras etiologias*. Baseia-se na classificação final do caso (PCR_VSR, PCR_ADENO, PCR_PARA1, PCR_PARA2, PCR_PARA3, PCR_PARA4, PCR_METAP, PCR_BOCA, PCR_RINO e PCR_OUTRO).<br><br>**Demografia**> \- **sexo** — sexo biológico (M/F; recodificado para *Masculino/Feminino/Ignorado*).>> \- **idade_num** — idade em anos.>> \- **faixa_etaria** — faixas padronizadas (ex.: “1–4”, “5–9”, … “\>80”).>> \- **raca** — raça/cor (1 Branca; 2 Preta; 3 Amarela; 4 Parda; 5 Indígena; 9 Ignorado).<br><br>**Território**> \- **cod_7_mun** — código IBGE de 7 dígitos do município (chave territorial).>> \- **municipio** — nome do município.>> \- **cod_17drs / drs_nome_2022** — Diretoria Regional de Saúde (DRS).>> \- **gve_nome** — Grupo de Vigilância Epidemiológica (GVE).<br><br>**Gravidade / Desfecho**> \- **hospital** — houve internação por SRAG (1 Sim; 2 Não).>> \- **dt_interna** — data da internação (DT_INTERNA).>> \- **uti** — internação em UTI (1 Sim; 2 Não; 9 Ignorado).>> \- **dt_entuti / dt_saiduti** — datas de entrada/saída da UTI (DT_ENTUTI / DT_SAIDUTI).>> \- **suporte_ven** — suporte ventilatório (1 invasivo; 2 não invasivo; 3 não; 9 ignorado).>> \- **evolucao** — evolução do caso (1 Cura; 2 Óbito; 3 Óbito outras causas; 9 Ignorado).>> \- **obito** — indicador (0/1) derivado da evolução.>> \- **dt_evoluca** — data de alta/óbito.<br><br>**População (denominadores)**> \- **pop_total, pop_00a14, pop_15a64, pop_65emais** — população municipal por ano (fonte), unidas por **cod_7_mun** e **ano**. Para anos \> 2023 aplica-se *fallback* para 2023 (mantém denominadores para 2024–2025).<br><br>## Resumo dos dados```{r}#| label: resumo-dados#| echo: false#| message: false#| warning: false# Sumário geral do banco de dados bruto (SRAG 2022–2025)skim(df_2022_2025_raw)```:::<br><br># Limpeza e transformação dos dados SRAG 2022-2025<p style="text-align: justify;">O conjunto de dados **SRAG 2022–2025**, proveniente do sistema **SIVEP-Gripe** e disponibilizado pelo **OpenDataSUS**, reúne registros de casos de Síndrome Respiratória Aguda Grave (SRAG) notificados no período pós-pandêmico. O objetivo principal do pré-processamento foi estruturar uma base padronizada e analiticamente consistente para caracterizar o perfil epidemiológico e clínico dos casos confirmados de **Covid-19**, **Influenza** e **Vírus Sincicial Respiratório (VSR)**.</p><p style="text-align: justify;">O tratamento inicial incluiu a conversão e validação de variáveis de data, a recodificação de rótulos demográficos e clínicos, e a definição de fatores categóricos para análises reprodutíveis. Foram implementadas rotinas de saneamento, como o tratamento seguro de valores ausentes e a verificação da ordem cronológica entre eventos clínicos (sintoma, internação, UTI e desfecho).</p><p style="text-align: justify;">Além disso, foram criadas variáveis derivadas que permitem a mensuração de intervalos temporais — como o tempo entre o início dos sintomas e a internação, a duração da permanência em UTI e o tempo total de hospitalização. Essas métricas possibilitam avaliar **gravidade, evolução clínica e eficiência da resposta assistencial** entre diferentes agentes etiológicos e perfis populacionais.</p><p style="text-align: justify;">O resultado é um banco limpo e consistente (`df_2022_2025_clean`), que serve de base para a análise descritiva, cálculo de incidência por 100 mil habitantes e geração de séries temporais por semana epidemiológica. Espera-se que essa padronização viabilize comparações interanuais e inter-regionais, além de subsidiar indicadores estratégicos de vigilância em saúde respiratória.</p><br><br>```{r}#| label: preprocess_e_metrics#| echo: false#| message: false#| warning: false# ============================================================# SRAG 2022–2025 — Pré-processamento e Métricas Temporais# Base de entrada: df_2022_2025_raw# Saída principal: df_2022_2025_clean# Objetivo: padronizar tipos e rótulos; criar fatores e métricas de tempo;# aplicar regras de qualidade e flags de evento.# ============================================================# ------------------------ Dicionários ------------------------map_raca <-c(`1`="Branca", `2`="Preta", `3`="Amarela", `4`="Parda", `5`="Indígena", `9`="Ignorado")map_evolucao <-c(`1`="Cura", `2`="Óbito", `3`="Óbito outras causas", `9`="Ignorado")binario_1_2 <-function(x) dplyr::case_when( x %in%c("1", 1L) ~"Sim", x %in%c("2", 2L) ~"Não",TRUE~"Ignorado")map_sup_ven <-function(x) dplyr::case_when( x %in%c("1", 1L) ~"Invasivo", x %in%c("2", 2L) ~"Não invasivo", x %in%c("3", 3L) ~"Não", x %in%c("9", 9L) ~"Ignorado",TRUE~"Ignorado")# --------------------- Utilitários seguros -------------------to_date_safe <-function(x) {if (inherits(x, "Date")) return(x) v <-as.character(x) v[v %in%c("None", "", "NA", "NaN")] <-NA_character_suppressWarnings(as.Date(v))}to_num_safe <-function(x) { v <-as.character(x) v[v %in%c("None", "", "NA", "NaN")] <-NA_character_suppressWarnings(as.numeric(v))}safe_diff_days <-function(start, end) { out <-as.integer(difftime(end, start, units ="days")) out[is.na(start) |is.na(end)] <-NA_integer_ out[out <0] <-NA_integer_ out}# =================== Pré-processamento =======================df_2022_2025_clean <- df_2022_2025_raw %>%# Remoção defensiva de coluna não utilizadaselect(-any_of("sem_pri_desc")) %>%# Tipagem e parsingmutate(dt_sin_pri =to_date_safe(dt_sin_pri),dt_interna =to_date_safe(dt_interna),dt_entuti =to_date_safe(dt_entuti),dt_saiduti =to_date_safe(dt_saiduti),dt_evoluca =to_date_safe(dt_evoluca),pop_total =to_num_safe(pop_total),pop_00a14 =to_num_safe(pop_00a14),pop_15a64 =to_num_safe(pop_15a64),pop_65emais =to_num_safe(pop_65emais) ) %>%# Derivadas temporaismutate(semana_epi =if_else(!is.na(sem_pri), sprintf("%02d", as.integer(sem_pri)), NA_character_) ) %>%# Recodificações segundo dicionáriomutate(sexo =case_when(sexo %in%c("M","m") ~"Masculino", sexo %in%c("F","f") ~"Feminino",TRUE~"Ignorado"),raca =recode(as.character(raca), !!!map_raca),evolucao =recode(as.character(evolucao), !!!map_evolucao),hospital =binario_1_2(hospital),uti =binario_1_2(uti),suporte_ven =map_sup_ven(suporte_ven),diagnostico =as.character(diagnostico),agente = diagnostico ) %>%# Fatores (níveis ordenados para análises reprodutíveis)mutate(sexo =factor(sexo, levels =c("Masculino","Feminino","Ignorado")),faixa_etaria =fct_relevel(as.factor(faixa_etaria),"1 - 4","5 - 9","10 - 14","15 - 19","20 - 34","35 - 49","50 - 64","65 - 79","> 80", after =0),raca =factor(raca, levels =c("Branca","Preta","Amarela","Parda","Indígena","Ignorado")),hospital =factor(hospital, levels =c("Sim","Não","Ignorado")),uti =factor(uti, levels =c("Sim","Não","Ignorado")),suporte_ven =factor(suporte_ven, levels =c("Invasivo","Não invasivo","Não","Ignorado")),evolucao =factor(evolucao, levels =c("Cura","Óbito","Óbito outras causas","Ignorado")),diagnostico =factor(diagnostico,levels =c("Covid-19","Influenza","Vírus sincicial respiratório","SRAG em investigação","SRAG não especificado","Outras etiologias")),semana_epi =factor(semana_epi, levels =sprintf("%02d", 1:53)) ) %>%# Padronização textual territorialmutate(municipio =str_squish(str_to_upper(municipio)),gve_nome =str_squish(str_to_upper(gve_nome)),drs_nome_2022 =str_squish(str_to_upper(drs_nome_2022)) ) %>%# ================== Métricas temporais ======================# Flags de eventomutate(flag_internacao =!is.na(dt_interna),flag_uti =!is.na(dt_entuti),flag_desfecho =!is.na(dt_evoluca),flag_obito =ifelse(!is.na(obito), as.integer(obito ==1L | evolucao =="Óbito"),ifelse(evolucao =="Óbito", 1L, 0L)) ) %>%# Checagens de ordem cronológica (aplicadas somente quando ambas as datas existem)mutate(chk_si_in =ifelse(!is.na(dt_sin_pri) &!is.na(dt_interna), dt_interna >= dt_sin_pri, TRUE),chk_in_ut =ifelse(!is.na(dt_interna) &!is.na(dt_entuti), dt_entuti >= dt_interna, TRUE),chk_ut_su =ifelse(!is.na(dt_entuti) &!is.na(dt_saiduti), dt_saiduti >= dt_entuti, TRUE),chk_su_ev =ifelse(!is.na(dt_saiduti) &!is.na(dt_evoluca), dt_evoluca >= dt_saiduti, TRUE),chk_in_ev =ifelse(!is.na(dt_interna) &!is.na(dt_evoluca), dt_evoluca >= dt_interna, TRUE),chk_si_ev =ifelse(!is.na(dt_sin_pri) &!is.na(dt_evoluca), dt_evoluca >= dt_sin_pri, TRUE),flag_ordem_ok = chk_si_in & chk_in_ut & chk_ut_su & chk_su_ev & chk_in_ev & chk_si_ev,flag_uti_sem_internacao = flag_uti &!flag_internacao ) %>%# Cálculo dos intervalos (dias)mutate(dias_sintoma_internacao =safe_diff_days(dt_sin_pri, dt_interna),dias_internacao_uti =safe_diff_days(dt_interna, dt_entuti),dias_uti =safe_diff_days(dt_entuti, dt_saiduti),dias_internacao_total =safe_diff_days(dt_interna, dt_evoluca),dias_sintoma_desfecho =safe_diff_days(dt_sin_pri, dt_evoluca),dias_sintoma_uti =safe_diff_days(dt_sin_pri, dt_entuti),dias_pos_uti_desfecho =safe_diff_days(dt_saiduti, dt_evoluca) ) %>%# Regras de qualidade adicionaismutate(across(c(dias_sintoma_internacao, dias_internacao_uti, dias_uti, dias_internacao_total, dias_sintoma_desfecho, dias_sintoma_uti, dias_pos_uti_desfecho),~ifelse(flag_ordem_ok, ., NA_integer_) ),across(c(dias_internacao_uti, dias_uti, dias_internacao_total, dias_sintoma_uti, dias_pos_uti_desfecho),~ifelse(flag_uti_sem_internacao, NA_integer_, .) ) ) %>%# Organização final: manter tudo e garantir novas métricas ao finalselect(everything(), flag_internacao, flag_uti, flag_desfecho, flag_obito, flag_ordem_ok, flag_uti_sem_internacao, dias_sintoma_internacao, dias_internacao_uti, dias_uti, dias_internacao_total, dias_sintoma_desfecho, dias_sintoma_uti, dias_pos_uti_desfecho )```<br><br>::: panel-tabset## Descrição dos atributos limpos**Conversão e validação de tipos**> As variáveis de data (`dt_sin_pri`, `dt_interna`, `dt_entuti`, `dt_saiduti`, `dt_evoluca`) foram convertidas para o formato `Date` com tratamento seguro de valores nulos e inconsistentes. Variáveis populacionais (`pop_total`, `pop_00a14`, `pop_15a64`, `pop_65emais`) foram convertidas para numéricas.**Recodificação de rótulos**> Campos categóricos foram harmonizados conforme dicionários oficiais do SIVEP-Gripe:\> – `sexo` → *Masculino, Feminino, Ignorado*\> – `raca` → *Branca, Preta, Amarela, Parda, Indígena, Ignorado*\> – `hospital`, `uti` e `suporte_ven` → recodificados para respostas binárias ou ordinais\> – `evolucao` → *Cura, Óbito, Óbito outras causas, Ignorado*\> – `diagnostico` → agente etiológico principal consolidado.**Criação de fatores e padronização textual**> \> Variáveis categóricas foram transformadas em fatores com níveis ordenados, assegurando consistência estatística. Nomes de municípios, GVEs e DRSs foram normalizados em caixa alta, eliminando duplicidades por variação ortográfica.**Regras de qualidade temporal**> Foram incluídas verificações de coerência entre datas, resultando em flags de controle (`flag_ordem_ok`, `flag_uti_sem_internacao`) que sinalizam possíveis inconsistências na sequência cronológica dos eventos clínicos.**Cálculo de métricas derivadas de tempo (em dias)**> Foram criadas as seguintes variáveis derivadas: - `dias_sintoma_internacao` — do início dos sintomas até a internação.\> - `dias_internacao_uti` — da internação até a entrada em UTI.\> - `dias_uti` — duração da permanência em UTI.\> - `dias_internacao_total` — tempo total entre internação e desfecho.\> - `dias_sintoma_desfecho` — intervalo entre sintoma inicial e desfecho final.\> - `dias_sintoma_uti` — tempo do início dos sintomas até a primeira entrada em UTI.\> - `dias_pos_uti_desfecho` — tempo entre a saída da UTI e o desfecho clínico.**Flags de evento e desfecho**> Foram criadas variáveis indicadoras (`flag_internacao`, `flag_uti`, `flag_desfecho`, `flag_obito`) para facilitar a estratificação de análises e o cálculo de proporções de gravidade e letalidade.<br><br>## Resumo dos dados limpos<br><br>```{r}#| label: resumo-dados_limpos#| echo: false#| message: false#| warning: false# Sumário geral do banco de dados bruto (SRAG 2022–2025)skim(df_2022_2025_clean)```<br><br>:::# Pergunta 1 - Perfil epidemiológico<p style="text-align: justify;">Descrever a **distribuição dos casos de SRAG** segundo **agente etiológico** (*Influenza*, *Vírus sincicial respiratório* e *Covid-19*) nos perfis de **sexo**, **faixa etária** e **raça/cor**.</p><p style="text-align: justify;">As análises apresentarão **proporções internas a cada agente** (composição do agente) e, quando útil, **estratificação por ano (2022–2025)** para captar mudanças de perfil ao longo do período.</p><br><br>## Seleção de variáveis — df_2225_perfil::: panel-tabset<br><br>### Colunas selecionadas (resumo)> - **diagnostico**: agente etiológico consolidado (*Covid-19*, *Influenza*, *Vírus sincicial respiratório*).\>> - **sexo**: *Masculino*, *Feminino*, *Ignorado*.\>> - **faixa_etaria**: categorias ordenadas de idade (ex.: “1–4”, “5–9”, … “\> 80”).\>> - **raca**: *Branca*, *Preta*, *Amarela*, *Parda*, *Indígena*, *Ignorado*.\>> - **idade_num**: idade em anos (uso opcional para mediana/IQR por agente).\>> - **ano**: ano civil (2022–2025) para estratificações temporais.<br><br>### Vista prévia dos dados selecionados```{r}#| label: obj1_dados#| echo: false#| message: false#| warning: false# Agentes alvo para o Objetivo 1agentes_alvo <-c("Covid-19","Influenza","Vírus sincicial respiratório")df_2225_perfil <- df_2022_2025_clean %>%filter(!is.na(diagnostico), diagnostico %in% agentes_alvo) %>%select( diagnostico, # agente etiológico consolidado sexo, # masculino/feminino/ignorado faixa_etaria, # faixas ordenadas raca, # raça/cor padronizada idade_num, # opcional para sumários ano # estratificação temporal opcional ) %>%mutate(diagnostico =fct_drop(diagnostico),sexo =fct_explicit_na(sexo, na_level ="Ignorado"),faixa_etaria=fct_explicit_na(faixa_etaria, na_level ="Ignorado"),raca =fct_explicit_na(raca, na_level ="Ignorado") )df_2225_perfil %>%glimpse()```<br><br>:::## Visualização dos resultados```{r}#| label: obj1_calculos#| echo: false#| message: false#| warning: false## Cálculos necessários — frequências e composiçõeslibrary(dplyr)library(tidyr)# Função utilitária: composição dentro do agente (proporções linha)comp_por_agente <-function(data, var) { var <- rlang::ensym(var) data %>%count(diagnostico, !!var, name ="n") %>%group_by(diagnostico) %>%mutate(prop = n /sum(n)) %>%ungroup() %>%arrange(diagnostico, desc(n))}# Versão estratificada por ano (opcional)comp_por_agente_ano <-function(data, var) { var <- rlang::ensym(var) data %>%count(ano, diagnostico, !!var, name ="n") %>%group_by(ano, diagnostico) %>%mutate(prop = n /sum(n)) %>%ungroup() %>%arrange(ano, diagnostico, desc(n))}# Tabelas principais (proporções internas ao agente)tab_agente <- df_2225_perfil %>%count(diagnostico, name ="n") %>%mutate(prop = n/sum(n))tab_agente_sexo <-comp_por_agente(df_2225_perfil, sexo)tab_agente_faixa <-comp_por_agente(df_2225_perfil, faixa_etaria)tab_agente_raca <-comp_por_agente(df_2225_perfil, raca)# Tabelas por ano (se necessário no relatório)tab_agente_sexo_ano <-comp_por_agente_ano(df_2225_perfil, sexo)tab_agente_faixa_ano <-comp_por_agente_ano(df_2225_perfil, faixa_etaria)tab_agente_raca_ano <-comp_por_agente_ano(df_2225_perfil, raca)# Visualizar rapidamente as primeiras linhas# list(# agente = head(tab_agente),# sexo = head(tab_agente_sexo),# faixa = head(tab_agente_faixa),# raca = head(tab_agente_raca)# )```::: panel-tabset### Sexo por agente```{r}#| label: obj1_plot_sexo#| echo: false#| message: false#| warning: false#| fig-width: 9#| fig-height: 5## Visualização 1 — Composição por sexo (100% dentro do agente)library(ggplot2)library(scales)ggplot(tab_agente_sexo, aes(x = diagnostico, y = prop, fill = sexo)) +geom_col(position ="fill") +scale_y_continuous(labels = percent) +labs(x ="Agente etiológico", y ="Proporção dentro do agente",fill ="Sexo",title ="Composição por sexo dentro de cada agente") +theme_minimal(base_size =12)```<br><br>### Idade por agente```{r}#| label: obj1_plot_faixa#| echo: false#| message: false#| warning: false#| fig-width: 10#| fig-height: 6## Visualização 2 — Composição por faixa etária (100% dentro do agente)ggplot(tab_agente_faixa, aes(x = diagnostico, y = prop, fill = faixa_etaria)) +geom_col(position ="fill") +scale_y_continuous(labels = percent) +labs(x ="Agente etiológico", y ="Proporção dentro do agente",fill ="Faixa etária",title ="Composição por faixa etária dentro de cada agente") +theme_minimal(base_size =12)```<br><br>### Raça/cor por agente```{r}#| label: obj1_plot_raca#| echo: false#| message: false#| warning: false#| fig-width: 10#| fig-height: 6## Visualização 3 — Composição por raça/cor (100% dentro do agente)ggplot(tab_agente_raca, aes(x = diagnostico, y = prop, fill = raca)) +geom_col(position ="fill") +scale_y_continuous(labels = percent) +labs(x ="Agente etiológico", y ="Proporção dentro do agente",fill ="Raça/cor",title ="Composição por raça/cor dentro de cada agente") +theme_minimal(base_size =12)```<br><br>### Heatmap faixa etária por agente```{r}#| label: obj1_heatmap_faixa#| echo: false#| message: false#| warning: false#| fig-width: 8#| fig-height: 5## Visualização 4 — Heatmap de proporções por faixa etária × agentetab_heat <- tab_agente_faixa %>%mutate(faixa_etaria =fct_rev(faixa_etaria)) # melhora a leitura verticalggplot(tab_heat, aes(x = diagnostico, y = faixa_etaria, fill = prop)) +geom_tile() +scale_fill_continuous(labels = percent, name ="Proporção") +labs(x ="Agente etiológico", y ="Faixa etária",title ="Distribuição relativa por faixa etária dentro de cada agente") +theme_minimal(base_size =12)```<br><br>:::## Tabelas detalhadas<br><br>::: panel-tabset### Distribuição dos casos por agente e composição demográfica```{r}#| label: obj1_tabela_1#| echo: false#| message: false#| warning: falsekable(tab_agente, digits =3, caption ="Distribuição de casos por agente (n e proporção).")```<br><br>### Composição demográfica por agente```{r}#| label: obj1_tabela_2#| echo: false#| message: false#| warning: falsekable(tab_agente_sexo %>%select(diagnostico, sexo, n, prop), digits =3,caption ="Composição por sexo dentro do agente.")```<br><br>### Faixa etária por agente```{r}#| label: obj1_tabela_3#| echo: false#| message: false#| warning: falsekable(tab_agente_faixa %>%select(diagnostico, faixa_etaria, n, prop), digits =3,caption ="Composição por faixa etária dentro do agente.")```<br><br>### Raça/cor por agente```{r}#| label: obj1_tabela_4#| echo: false#| message: false#| warning: falsekable(tab_agente_raca %>%select(diagnostico, raca, n, prop), digits =3,caption ="Composição por raça/cor dentro do agente.")```<br><br>:::## Tabelas comparativas::: panel-tabset### ano x sexo x diaginotico Influenza```{r}#| label: obj1_tabela_comp_1#| echo: false#| message: false#| warning: falsedf_2225_perfil |>mutate(sexo =as.character(sexo),diagnostico =as.character(diagnostico)) |>mutate(diagnostico =if_else(diagnostico =='Vírus sincicial respiratório', 'VSR', diagnostico) ) |>filter(sexo !='Ignorado') |>filter(diagnostico =='Influenza') |>tbl_cross(row = sexo ,col = ano,percent ="column",#margin ="row",label =list(sexo ="Sexo",ano ="Ano") ) |>bold_labels() |>modify_caption("**Influenza**")```<br><br>### ano x sexo x diaginotico VSR ```{r}#| label: obj1_tabela_comp_2#| echo: false#| message: false#| warning: falsedf_2225_perfil |>mutate(sexo =as.character(sexo),diagnostico =as.character(diagnostico)) |>mutate(diagnostico =if_else(diagnostico =='Vírus sincicial respiratório', 'VSR', diagnostico) ) |>filter(sexo !='Ignorado') |>filter(diagnostico =='VSR') |>tbl_cross(row = sexo ,col = ano,percent ="column",#margin ="row",label =list(sexo ="Sexo",ano ="Ano") ) |>bold_labels() |>modify_caption("**Vírus sincicial respiratório**")```<br><br>### ano x sexo x diaginotico covid-19 ```{r}#| label: obj1_tabela_comp_3#| echo: false#| message: false#| warning: falsedf_2225_perfil |>mutate(sexo =as.character(sexo),diagnostico =as.character(diagnostico)) |>mutate(diagnostico =if_else(diagnostico =='Vírus sincicial respiratório', 'VSR', diagnostico) ) |>filter(sexo !='Ignorado') |>filter(diagnostico =='Covid-19') |>tbl_cross(row = sexo ,col = ano,percent ="column",#margin ="row",label =list(sexo ="Sexo",ano ="Ano") ) |>bold_labels() |>modify_caption("**Covid-19**")```<br><br>:::```{r}#| label: cleanup_objetivo1#| echo: false#| message: false#| warning: false# ============================================================# Limpeza dos objetos e funções criados para o Objetivo 1# (Perfil epidemiológico)# Mantém df_2022_2025_clean e demais bases gerais.# ============================================================# Lista explícita de artefatos do Objetivo 1objetos_obj1 <-c(# seleção e parâmetros"agentes_alvo", "df_2225_perfil",# funções auxiliares do Obj.1"comp_por_agente", "comp_por_agente_ano",# tabelas geradas"tab_agente", "tab_agente_sexo", "tab_agente_faixa", "tab_agente_raca","tab_agente_sexo_ano", "tab_agente_faixa_ano", "tab_agente_raca_ano",# estruturas auxiliares para gráficos"tab_heat")# Remove somente os que existirem no ambiente atualrm(list = objetos_obj1[objetos_obj1 %in%ls(envir = .GlobalEnv)], envir = .GlobalEnv)```# Pergunta 2 - Incidência<p style="text-align: justify;">Estimamos a **incidência de SRAG por 100 mil habitantes**, por **agente etiológico** (*Covid-19*, *Influenza* e *Vírus sincicial respiratório*), estratificada por **idade** e **ano** (2022–2025).</p><p style="text-align: justify;">O **numerador** é o número de casos por **DT_SIN_PRI** (agregados por município/ano/agente).</p><br><br><p style="text-align: justify;">Os **denominadores populacionais** são anuais por município e **faixas etárias amplas** (0–14, 15–64, 65+), com *fallback* de 2023 para anos \> 2023.</p><br><br>## Seleção de variáveis — df_2225_incidencia::: panel-tabset### Colunas selecionadas (resumo)> - **ano** — referência temporal do caso (derivada de DT_SIN_PRI).\>> - **diagnostico** — agente etiológico consolidado (*Covid-19*, *Influenza*, *VSR*).\>> - **cod_7_mun / municipio** — chave e nome do município de residência (denominador municipal).\>> - **cod_17drs / drs_nome_2022** — regionalização sanitária (DRS).\>> - **faixa_etaria** — categoria original do caso (9 faixas).\>> - **faixa_pop3** — colapso de **faixa_etaria** em **0–14**, **15–64** e **65+** (compatível com os denominadores).\>> - **pop_total, pop_00a14, pop_15a64, pop_65emais** — denominadores municipais anuais (com *fallback* 2023 para 2024–2025).<br><br>### Visualização dos dados selecionados```{r}#| label: obj2_select#| echo: false#| message: false#| warning: false## Seleção de variáveis — df_2225_incidenciaagentes_alvo <-c("Covid-19","Influenza","Vírus sincicial respiratório")# Mapeamento de faixa etária (9 categorias) para as 3 bandas dos denominadoresmap_faixa3 <-function(x) { x <-as.character(x)case_when( x %in%c("1 - 4","5 - 9","10 - 14") ~"0-14", x %in%c("15 - 19","20 - 34","35 - 49","50 - 64") ~"15-64", x %in%c("65 - 79","> 80") ~"65+",TRUE~NA_character_ )}df_2225_incidencia <- df_2022_2025_clean %>%filter(diagnostico %in% agentes_alvo) %>%select(# chaves ano, diagnostico, cod_7_mun, municipio, cod_17drs, drs_nome_2022,# estratos de idade (numerador) faixa_etaria,# denominadores (municipais anuais) pop_total, pop_00a14, pop_15a64, pop_65emais ) %>%mutate(faixa_pop3 =map_faixa3(faixa_etaria), # banda etária compatível com denominadores# padronização textual/ordemdiagnostico =fct_drop(diagnostico),drs_nome_2022= stringr::str_to_upper(drs_nome_2022),municipio = stringr::str_to_upper(municipio) )dplyr::glimpse(df_2225_incidencia)```<br><br>:::## Visualização dos resultados```{r}#| label: obj2_calc#| echo: false#| message: false#| warning: false## Cálculos — incidência total e por faixa etária (100 mil)library(dplyr)library(tidyr)# 0) Tabela de população (long) por município-anopop_long <- df_2225_incidencia %>%distinct(cod_7_mun, municipio, cod_17drs, drs_nome_2022, ano, pop_total, pop_00a14, pop_15a64, pop_65emais) %>%pivot_longer(cols =c(pop_total, pop_00a14, pop_15a64, pop_65emais),names_to ="faixa_pop3",values_to ="pop" ) %>%mutate(faixa_pop3 =recode(faixa_pop3,"pop_total"="total","pop_00a14"="0-14","pop_15a64"="15-64","pop_65emais"="65+") )# 1) Numeradores — casos por município-ano-agente (TOTAL)cases_total_mun <- df_2225_incidencia %>%count(ano, diagnostico, cod_7_mun, municipio, cod_17drs, drs_nome_2022, name ="n_casos_total")# 2) Numeradores — casos por município-ano-agente-faixa (BANDAS 0–14, 15–64, 65+)cases_band_mun <- df_2225_incidencia %>%filter(!is.na(faixa_pop3)) %>%count(ano, diagnostico, cod_7_mun, municipio, cod_17drs, drs_nome_2022, faixa_pop3, name ="n_casos")# 3) Incidência municipal total por 100 milinc_total_mun <- cases_total_mun %>%left_join(pop_long %>%filter(faixa_pop3 =="total"),by =c("cod_7_mun","municipio","cod_17drs","drs_nome_2022","ano")) %>%mutate(taxa_100k =ifelse(pop >0, (n_casos_total / pop) *1e5, NA_real_) )# 4) Incidência municipal por faixa etária (0–14; 15–64; 65+)inc_band_mun <- cases_band_mun %>%left_join(pop_long %>%filter(faixa_pop3 !="total"),by =c("cod_7_mun","municipio","cod_17drs","drs_nome_2022","ano","faixa_pop3")) %>%mutate(taxa_100k =ifelse(pop >0, (n_casos / pop) *1e5, NA_real_) )# 5) Agregações por DRS (somar casos e população)inc_total_drs <- inc_total_mun %>%group_by(ano, diagnostico, cod_17drs, drs_nome_2022) %>%summarise(n_casos_total =sum(n_casos_total, na.rm =TRUE),pop =sum(pop, na.rm =TRUE), .groups ="drop") %>%mutate(taxa_100k =ifelse(pop >0, (n_casos_total / pop) *1e5, NA_real_))inc_band_drs <- inc_band_mun %>%group_by(ano, diagnostico, cod_17drs, drs_nome_2022, faixa_pop3) %>%summarise(n_casos =sum(n_casos, na.rm =TRUE),pop =sum(pop, na.rm =TRUE), .groups ="drop") %>%mutate(taxa_100k =ifelse(pop >0, (n_casos / pop) *1e5, NA_real_))# 6) Agregações estaduais (somar DRS)inc_total_estado <- inc_total_drs %>%group_by(ano, diagnostico) %>%summarise(n_casos_total =sum(n_casos_total, na.rm =TRUE),pop =sum(pop, na.rm =TRUE), .groups ="drop") %>%mutate(taxa_100k =ifelse(pop >0, (n_casos_total / pop) *1e5, NA_real_))inc_band_estado <- inc_band_drs %>%group_by(ano, diagnostico, faixa_pop3) %>%summarise(n_casos =sum(n_casos, na.rm =TRUE),pop =sum(pop, na.rm =TRUE), .groups ="drop") %>%mutate(taxa_100k =ifelse(pop >0, (n_casos / pop) *1e5, NA_real_))# (Opcional) função para IC95% Poisson aproximadopois_ic95 <-function(n, pop, mult =1e5) { taxa <- (n / pop) * mult se <-sqrt(n) / pop * multdata.frame(taxa = taxa, li = taxa -1.96*se, ls = taxa +1.96*se)}```<br><br>::: panel-tabset### Visualização — Incidência total por 100 mil```{r}#| label: obj2_viz_barras_total#| echo: false#| message: false#| warning: false#| fig-width: 9#| fig-height: 5## Barras — Incidência total por 100 mil (Estado e DRS)library(ggplot2)library(scales)# Estado (barras agrupadas por agente/ano)ggplot(inc_total_estado, aes(x =factor(ano), y = taxa_100k, fill = diagnostico)) +geom_col(position =position_dodge(width =0.85)) +labs(x ="Ano", y ="Incidência por 100 mil",fill ="Agente", title ="Incidência total por 100 mil — Estado") +scale_y_continuous(labels =label_number(accuracy =0.1)) +theme_minimal(base_size =12)# DRS (facetas por DRS)ggplot(inc_total_drs, aes(x =factor(ano), y = taxa_100k, fill = diagnostico)) +geom_col(position =position_dodge(width =0.85)) +facet_wrap(~ drs_nome_2022, scales ="free_y") +labs(x ="Ano", y ="Incidência por 100 mil",fill ="Agente", title ="Incidência total por 100 mil — DRS") +scale_y_continuous(labels =label_number(accuracy =0.1)) +theme_minimal(base_size =11)```<br><br>### Visualização — Incidência por faixa etária```{r}#| label: obj2_viz_barras_faixa#| echo: false#| message: false#| warning: false#| fig-width: 10#| fig-height: 6## Barras — Incidência por 100 mil por faixa etária (Estado)library(ggplot2)library(scales)ggplot(inc_band_estado, aes(x = faixa_pop3, y = taxa_100k, fill = diagnostico)) +geom_col(position =position_dodge(width =0.85)) +facet_wrap(~ ano) +labs(x ="Faixa etária (denominadores)", y ="Incidência por 100 mil",fill ="Agente", title ="Incidência por faixa etária — Estado") +scale_y_continuous(labels =label_number(accuracy =0.1)) +theme_minimal(base_size =12)```<br><br>### Visualização — Mapas municipais```{r}#| label: obj2_viz_mapas#| echo: false#| message: false#| warning: false#| fig-width: 10#| fig-height: 7## Mapas — Coroplético municipal por ano e agente (taxa por 100 mil)# Requer o pacote geobr (para shapes municipais). Caso necessário:# install.packages("geobr")library(geobr)library(ggplot2)library(scales)library(dplyr)# Shape municípios de SP (ajuste o 'code_muni' conforme sua UF)mun_sp <- geobr::read_municipality(code_muni ="SP", year =2020, showProgress =FALSE) %>%mutate(cod_7_mun =as.numeric(code_muni))# Escolha o ano e agente para o mapaano_map <-2022agente_map <-"Covid-19"map_data <- inc_total_mun %>%filter(ano == ano_map, diagnostico == agente_map) %>%select(cod_7_mun, municipio, taxa_100k)mun_join <- mun_sp %>%left_join(map_data, by ="cod_7_mun")ggplot(mun_join) +geom_sf(aes(fill = taxa_100k), size =0.1, color ="grey70") +scale_fill_continuous(labels =label_number(accuracy =0.1), na.value ="grey90") +labs(title =paste0("SRAG — Incidência por 100 mil (", agente_map, ", ", ano_map, ")"),fill ="Taxa 100 mil") +theme_minimal(base_size =12)```<br><br>### Visualização — Heatmap DRS × Ano```{r}#| label: obj2_viz_heatmap#| echo: false#| message: false#| warning: false#| fig-width: 10#| fig-height: 7## Heatmap — DRS × Ano (taxa por 100 mil), facetado por agentelibrary(ggplot2)library(scales)library(dplyr)# Ordenar DRS por média de taxa (para leitura)ord_drs <- inc_total_drs %>%group_by(drs_nome_2022) %>%summarise(taxa_med =mean(taxa_100k, na.rm =TRUE), .groups ="drop") %>%arrange(desc(taxa_med)) %>%pull(drs_nome_2022)inc_total_drs_hm <- inc_total_drs %>%mutate(drs_nome_2022 =factor(drs_nome_2022, levels = ord_drs),ano =factor(ano))ggplot(inc_total_drs_hm, aes(x = ano, y = drs_nome_2022, fill = taxa_100k)) +geom_tile() +facet_wrap(~ diagnostico) +scale_fill_continuous(labels =label_number(accuracy =0.1), na.value ="grey90") +labs(x ="Ano", y ="DRS", fill ="Taxa 100 mil",title ="SRAG — Incidência por 100 mil (DRS × Ano), por agente") +theme_minimal(base_size =12)```<br><br>::: ## Tabelas detalhadas<br><br>::: panel-tabset### Incidência total com IC95% (Poisson)```{r}#| label: obj2_tabela_1#| echo: false#| message: false#| warning: false## Tabelas — Casos, denominadores e taxas (com IC95% Poisson opcional)library(dplyr)library(knitr)# Estado — totaltbl_estado_total <- inc_total_estado %>%mutate(pois = purrr::pmap_dfr(list(n_casos_total, pop), ~pois_ic95(..1, ..2))) %>%transmute( ano, diagnostico, n_casos_total, pop,taxa_100k =round(taxa_100k, 2),li =round(pois$li, 2), ls =round(pois$ls, 2) )kable(tbl_estado_total, caption ="Incidência por 100 mil — Estado (total), com IC95% (Poisson).")```<br><br>### Incidência por faixa etária com IC95% (Poisson)```{r}#| label: obj2_tabela-2#| echo: false#| message: false#| warning: false# Estado — por faixatbl_estado_faixa <- inc_band_estado %>%mutate(pois = purrr::pmap_dfr(list(n_casos, pop), ~pois_ic95(..1, ..2))) %>%transmute( ano, diagnostico, faixa_pop3, n_casos, pop,taxa_100k =round(taxa_100k, 2),li =round(pois$li, 2), ls =round(pois$ls, 2) )kable(tbl_estado_faixa, caption ="Incidência por 100 mil — Estado por faixa etária, com IC95% (Poisson).")```<br><br>:::```{r}#| label: cleanup_objetivo2#| echo: false#| message: false#| warning: false# ============================================================# Limpeza dos objetos e funções criados para o Objetivo 2# (Incidência por 100 mil)# Mantém df_2022_2025_clean e demais bases gerais.# ============================================================objetos_obj2 <-c(# seleção / preparação"agentes_alvo", "df_2225_incidencia", "map_faixa3",# população e numeradores"pop_long", "cases_total_mun", "cases_band_mun",# incidências (município/DRS/estado)"inc_total_mun", "inc_band_mun","inc_total_drs", "inc_band_drs","inc_total_estado", "inc_band_estado",# IC Poisson e auxiliares de visualização"pois_ic95", "ord_drs", "inc_total_drs_hm",# mapas (geometria e junções)"mun_sp", "ano_map", "agente_map", "map_data", "mun_join",# tabelas finais"tbl_estado_total", "tbl_estado_faixa")rm(list = objetos_obj2[objetos_obj2 %in%ls(envir = .GlobalEnv)], envir = .GlobalEnv)```<br><br># Pergunta 3 - Gravidade<p style="text-align: justify;">Avaliar a **gravidade dos casos de SRAG** segundo **agente etiológico** (*Covid-19*, *Influenza* e *Vírus Sincicial Respiratório*) e **perfis demográficos** (sexo, faixa etária, raça/cor). </p><p style="text-align: justify;">Indicadores principais:</p><br><br>> 1) **% UTI** — proporção de pacientes que passaram por UTI **entre os internados**; > 2) **Suporte ventilatório** — proporção com **qualquer suporte** entre internados e o **perfil do suporte** (*invasivo vs não invasivo*); > 3) **Letalidade (CFR)** — proporção de óbitos entre casos com desfecho conhecido (*Cura* ou *Óbito*). <p style="text-align: justify;">Serão mostradas estratificações por **ano (2022–2025)** e **perfis demográficos**, com intervalos de confiança (IC95%) binomiais (Wilson) e regras de qualidade (ex.: exclusão de *Ignorado* no denominador).</p><br><br>## Seleção de variáveis — df_2225_gravidade::: panel-tabset### Colunas selecionadas (resumo)> - **ano** — estratificação temporal (2022–2025).> - **diagnostico** — agente etiológico (*Covid-19*, *Influenza*, *VSR*).> - **sexo**, **faixa_etaria**, **raca** — perfis demográficos.> - **hospital** — internação (*Sim/Não/Ignorado*).> - **uti** — passagem por UTI (*Sim/Não/Ignorado*).> - **suporte_ven** — *Invasivo/Não invasivo/Não/Ignorado*.> - **evolucao** / **obito** — desfecho clínico (*Cura/Óbito/...*).> - **dias_uti**, **dias_internacao_total** — métricas de duração (apoio).- **flags de consistência** — `flag_internacao`, `flag_uti`, `flag_desfecho`, `flag_ordem_ok`, `flag_uti_sem_internacao`.<br><br>### Visualização dos dados selecionados```{r}#| label: obj3_select#| echo: false#| message: false#| warning: false## Seleção de variáveis — df_2225_gravidadelibrary(dplyr)library(forcats)library(stringr)agentes_alvo <-c("Covid-19","Influenza","Vírus sincicial respiratório")df_2225_gravidade <- df_2022_2025_clean %>%filter(diagnostico %in% agentes_alvo) %>%select(# perfis e tempo ano, diagnostico, sexo, faixa_etaria, raca,# desfechos/gravidade hospital, uti, suporte_ven, evolucao, obito,# durações (apoio) dias_uti, dias_internacao_total,# consistência flag_internacao, flag_uti, flag_desfecho, flag_ordem_ok, flag_uti_sem_internacao ) %>%mutate(diagnostico =fct_drop(diagnostico),sexo =fct_explicit_na(sexo, na_level ="Ignorado"),faixa_etaria =fct_explicit_na(faixa_etaria, na_level ="Ignorado"),raca =fct_explicit_na(raca, na_level ="Ignorado") )dplyr::glimpse(df_2225_gravidade)```<br><br>::: ## Visualização dos resultados```{r}#| label: obj3_calcs#| echo: false#| message: false#| warning: false## Cálculos — %UTI (entre internados), Qualquer Suporte, Perfil do Suporte e CFR (IC95% Wilson)library(dplyr)library(tidyr)library(purrr)# IC binomial (Wilson)binom_wilson <-function(x, n, z =1.96) { p <-ifelse(n >0, x/n, NA_real_) denom <-1+ (z^2)/n center <- (p + (z^2)/(2*n)) / denom half <- z *sqrt((p*(1-p))/n + (z^2)/(4*n^2)) / denomtibble(p = p, li = center - half, ls = center + half)}# ---------- % UTI entre internados ----------# Denominador: hospital == "Sim" e uti %in% {"Sim","Não"}uti_internados <- df_2225_gravidade %>%filter(hospital =="Sim", uti %in%c("Sim","Não"))uti_by_sexo <- uti_internados %>%group_by(ano, diagnostico, sexo) %>%summarise(x =sum(uti =="Sim", na.rm =TRUE),n =n(), .groups ="drop") %>%bind_cols(binom_wilson(.$x, .$n)) %>%mutate(metric ="%UTI (entre internados)", estrato ="Sexo", grupo =as.character(sexo))uti_by_faixa <- uti_internados %>%group_by(ano, diagnostico, faixa_etaria) %>%summarise(x =sum(uti =="Sim", na.rm =TRUE),n =n(), .groups ="drop") %>%bind_cols(binom_wilson(.$x, .$n)) %>%mutate(metric ="%UTI (entre internados)", estrato ="Faixa etária", grupo =as.character(faixa_etaria))uti_by_ano <- uti_internados %>%group_by(ano, diagnostico) %>%summarise(x =sum(uti =="Sim", na.rm =TRUE),n =n(), .groups ="drop") %>%bind_cols(binom_wilson(.$x, .$n)) %>%mutate(metric ="%UTI (entre internados)", estrato ="Total", grupo ="Total")# ---------- Qualquer suporte ventilatório (entre internados) ----------# Denominador: hospital == "Sim" e suporte_ven %in% {"Invasivo","Não invasivo","Não"}sup_any_intern <- df_2225_gravidade %>%filter(hospital =="Sim", suporte_ven %in%c("Invasivo","Não invasivo","Não"))sup_any_by_ano <- sup_any_intern %>%group_by(ano, diagnostico) %>%summarise(x =sum(suporte_ven %in%c("Invasivo","Não invasivo"), na.rm =TRUE),n =n(), .groups ="drop") %>%bind_cols(binom_wilson(.$x, .$n)) %>%mutate(metric ="% Qualquer suporte (entre internados)", estrato ="Total", grupo ="Total")# ---------- Perfil do suporte (entre os que receberam suporte) ----------sup_profile <- df_2225_gravidade %>%filter(hospital =="Sim", suporte_ven %in%c("Invasivo","Não invasivo")) %>%count(ano, diagnostico, suporte_ven, name ="n") %>%group_by(ano, diagnostico) %>%mutate(prop = n/sum(n)) %>%ungroup()# ---------- CFR (letalidade) ----------# Denominador: evolucao %in% {"Cura","Óbito"}; Numerador: evolucao == "Óbito"cfr_base <- df_2225_gravidade %>%filter(evolucao %in%c("Cura","Óbito"))cfr_by_sexo <- cfr_base %>%group_by(ano, diagnostico, sexo) %>%summarise(x =sum(evolucao =="Óbito", na.rm =TRUE),n =n(), .groups ="drop") %>%bind_cols(binom_wilson(.$x, .$n)) %>%mutate(metric ="CFR (Óbitos / Cura+Óbito)", estrato ="Sexo", grupo =as.character(sexo))cfr_by_faixa <- cfr_base %>%group_by(ano, diagnostico, faixa_etaria) %>%summarise(x =sum(evolucao =="Óbito", na.rm =TRUE),n =n(), .groups ="drop") %>%bind_cols(binom_wilson(.$x, .$n)) %>%mutate(metric ="CFR (Óbitos / Cura+Óbito)", estrato ="Faixa etária", grupo =as.character(faixa_etaria))cfr_by_ano <- cfr_base %>%group_by(ano, diagnostico) %>%summarise(x =sum(evolucao =="Óbito", na.rm =TRUE),n =n(), .groups ="drop") %>%bind_cols(binom_wilson(.$x, .$n)) %>%mutate(metric ="CFR (Óbitos / Cura+Óbito)", estrato ="Total", grupo ="Total")# ---------- Painel consolidado (para forest/dot plots) ----------grav_forest_sexo <-bind_rows(uti_by_sexo, cfr_by_sexo)grav_forest_faixa <-bind_rows(uti_by_faixa, cfr_by_faixa)grav_series_total <-bind_rows(uti_by_ano, cfr_by_ano, sup_any_by_ano)```<br><br>::: panel-tabset### Visualização — Dot/Forest plot por sexo e ano```{r}#| label: obj3_viz_forest_sexo#| echo: false#| message: false#| warning: false#| fig-width: 10#| fig-height: 6## Dot/Forest — %UTI e CFR por agente, facetado por sexo e anolibrary(ggplot2)library(scales)plot_forest <-function(df) {ggplot(df, aes(x = diagnostico, y = p, ymin = li, ymax = ls, color = diagnostico)) +geom_pointrange(position =position_dodge(width =0.5)) +coord_flip() +scale_y_continuous(labels =percent_format(accuracy =0.1)) +labs(x ="Agente etiológico", y ="Proporção (IC95%)") +theme_minimal(base_size =12) +theme(legend.position ="none")}# Facetas por sexo e ano, separados por métricaggplot(grav_forest_sexo, aes(x = diagnostico, y = p, ymin = li, ymax = ls, color = diagnostico)) +geom_pointrange(position =position_dodge(width =0.6)) +coord_flip() +facet_grid(metric ~ ano + grupo, scales ="free_y") +scale_y_continuous(labels =percent_format(accuracy =0.1)) +labs(x ="Agente", y ="Proporção (IC95%)", title ="%UTI e CFR por agente — facetas: sexo × ano") +theme_minimal(base_size =11) +theme(legend.position ="none")```<br><br>### Visualização — Dot/Forest plot por faixa etária e ano```{r}#| label: obj3_viz_forest_faixa#| echo: FALSE#| message: false#| warning: false#| fig-width: 11#| fig-height: 8## Dot/Forest — %UTI e CFR por agente, facetado por faixa etária e anolibrary(ggplot2)library(scales)ggplot(grav_forest_faixa, aes(x = diagnostico, y = p, ymin = li, ymax = ls, color = diagnostico)) +geom_pointrange(position =position_dodge(width =0.6)) +coord_flip() +facet_grid(metric ~ ano + grupo, scales ="free_y") +scale_y_continuous(labels =percent_format(accuracy =0.1)) +labs(x ="Agente", y ="Proporção (IC95%)", title ="%UTI e CFR por agente — facetas: faixa etária × ano") +theme_minimal(base_size =11) +theme(legend.position ="none")```<br><br>### Visualização — Séries temporais totais %UTI, CFR e Suporte```{r}#| label: obj3_viz_sup_profile#| echo: FALSE#| message: false#| warning: false#| fig-width: 10#| fig-height: 6## Barras empilhadas — Perfil do suporte ventilatório (entre internados com suporte)library(ggplot2)library(scales)ggplot(sup_profile, aes(x =factor(ano), y = prop, fill = suporte_ven)) +geom_col(position ="fill") +facet_wrap(~ diagnostico) +scale_y_continuous(labels =percent_format(accuracy =1)) +labs(x ="Ano", y ="Composição entre quem recebeu suporte (%)",fill ="Tipo de suporte",title ="Perfil do suporte ventilatório (Invasivo vs Não invasivo) — Internados") +theme_minimal(base_size =12)```<br><br>### Visualização — Heatmaps %UTI e CFR por faixa etária e ano```{r}#| label: obj3_viz_heatmaps#| echo: false#| message: false#| warning: false#| fig-width: 30#| fig-height: 8## Heatmaps — %UTI e CFR por faixa etária × agente, facetado por anolibrary(ggplot2)library(scales)library(dplyr)library(tidyr)# %UTI por faixa etária × agente × anouti_heat <- uti_by_faixa %>%select(ano, diagnostico, faixa_etaria = grupo, p) %>%mutate(metric ="%UTI (entre internados)")# CFR por faixa etária × agente × anocfr_heat <- cfr_by_faixa %>%select(ano, diagnostico, faixa_etaria = grupo, p) %>%mutate(metric ="CFR (Óbitos / Cura+Óbito)")hm_data <-bind_rows(uti_heat, cfr_heat)ggplot(hm_data, aes(x = diagnostico, y = faixa_etaria, fill = p)) +geom_tile(color ="white", size =0.1) +facet_grid(metric ~ ano) +scale_fill_continuous(labels =percent_format(accuracy =0.1), name ="Proporção") +labs(x ="Agente", y ="Faixa etária",title ="Heatmaps de %UTI (entre internados) e CFR por faixa etária, por ano") +theme_minimal(base_size =11)```<br><br>### Visualização — Séries temporais %UTI, CFR e Suporte```{r}#| label: obj3_viz_series#| echo: false#| message: false#| warning: false#| fig-width: 10#| fig-height: 6## Séries anuais — %UTI, Qualquer Suporte e CFR por agentelibrary(ggplot2)library(scales)library(dplyr)series_data <- grav_series_total %>%select(ano, diagnostico, metric, p) %>%mutate(ano =as.integer(ano))ggplot(series_data, aes(x = ano, y = p, color = diagnostico)) +geom_line() +geom_point() +facet_wrap(~ metric, scales ="free_y") +scale_y_continuous(labels =percent_format(accuracy =0.1)) +scale_x_continuous(breaks =unique(series_data$ano)) +labs(x ="Ano", y ="Proporção", color ="Agente",title ="Evolução anual — %UTI, Qualquer Suporte e CFR por agente") +theme_minimal(base_size =12)```<br><br>### Visualização — Boxplots de durações por agente```{r}#| label: obj3_viz_boxplots#| echo: false#| message: false#| warning: false#| fig-width: 20#| fig-height: 15## Boxplots — Durações (dias) por agente (opcional)library(ggplot2)library(dplyr)library(tidyr)dur_long <- df_2225_gravidade %>%filter(flag_ordem_ok) %>%select(diagnostico, dias_uti, dias_internacao_total) %>%pivot_longer(cols =c(dias_uti, dias_internacao_total),names_to ="metrica", values_to ="dias") %>%filter(!is.na(dias))ggplot(dur_long, aes(x = diagnostico, y = dias, fill = diagnostico)) +geom_boxplot(outlier.alpha =0.25, width =0.7) +facet_wrap(~ metrica, scales ="free_y") +labs(x ="Agente", y ="Dias",title ="Distribuição de durações — UTI e Internação (casos com sequência cronológica válida)") +theme_minimal(base_size =12) +theme(legend.position ="none")```:::```{r}#| label: cleanup_objetivo3#| echo: false#| message: false#| warning: false# ============================================================# Limpeza dos objetos e funções criados para o Objetivo 3# (Gravidade clínica)# Mantém df_2022_2025_clean e demais bases gerais.# ============================================================objetos_obj3 <-c(# seleção / base"agentes_alvo", "df_2225_gravidade",# funções auxiliares"binom_wilson", "plot_forest",# conjuntos intermediários e finais (%UTI, suporte, CFR)"uti_internados","uti_by_sexo", "uti_by_faixa", "uti_by_ano","sup_any_intern", "sup_any_by_ano", "sup_profile","cfr_base", "cfr_by_sexo", "cfr_by_faixa", "cfr_by_ano","grav_forest_sexo", "grav_forest_faixa", "grav_series_total",# dados para heatmaps / séries / boxplots"uti_heat", "cfr_heat", "hm_data","series_data", "dur_long")rm(list = objetos_obj3[objetos_obj3 %in%ls(envir = .GlobalEnv)], envir = .GlobalEnv)```# Pergunta 4 - Séries temporais<p style="text-align: justify;">Analisamos a **tendência temporal** dos casos de SRAG a partir da **data de início dos sintomas (DT_SIN_PRI)**, consolidando-os por **semana epidemiológica (SEM_PRI)** e **ano**. Calcularemos **contagens semanais de casos** por **agente etiológico** (Covid-19, Influenza e VSR), com opção de **suavização** (médias móveis) para destacar o sinal de tendência. As séries podem ser apresentadas no **nível estadual** (soma dos municípios) e desagregadas por **DRS/município** quando necessário.</p><br><br>## Seleção de variáveis — df_2225_stemporais::: panel-tabset### Colunas selecionadas (resumo)> - **ano** — ano epidemiológico do início dos sintomas.> - **sem_pri** — semana epidemiológica (1–53).> - **dt_sin_pri** — data de início dos sintomas (base do agrupamento).> - **diagnostico** — agente etiológico (Covid-19, Influenza, VSR).> - **cod_17drs / drs_nome_2022** — recortes regionais (DRS).> - **cod_7_mun / municipio** — recortes municipais.<br><br>### Visualização dos dados selecionados}```{r}#| label: obj4_select#| echo: false#| message: false#| warning: false## Seleção de variáveis — df_2225_stempotallibrary(dplyr)library(forcats)library(stringr)agentes_alvo <-c("Covid-19","Influenza","Vírus sincicial respiratório")df_2225_stempotal <- df_2022_2025_clean %>%filter(!is.na(dt_sin_pri), diagnostico %in% agentes_alvo) %>%select(# tempo ano, sem_pri, dt_sin_pri,# agente diagnostico,# território (opcional para recortes) cod_17drs, drs_nome_2022, cod_7_mun, municipio ) %>%mutate(diagnostico =fct_drop(diagnostico),drs_nome_2022=str_to_upper(str_squish(drs_nome_2022)),municipio =str_to_upper(str_squish(municipio)) )dplyr::glimpse(df_2225_stempotal)```<br><br>::: ## Visualização dos resultados```{r}#| label: obj4_calcs#| echo: false#| message: false#| warning: false## Cálculos — séries semanais (estado e DRS) e suavizaçãolibrary(dplyr)library(tidyr)library(lubridate)library(ISOweek) # para data de início da ISO weeklibrary(zoo)# Função: data (segunda-feira) correspondente ao par (ano, semana ISO)iso_week_start <-function(ano, sem){# Retorna Date da 2ª feira da ISO week. ISOweek::ISOweek2date(sprintf("%d-W%02d-1", ano, sem))}# ---------- Estado: séries por agente ----------ts_semana_estado <- df_2225_stempotal %>%group_by(ano, sem_pri, diagnostico) %>%summarise(n_casos =n(),.groups ="drop") %>%# preencher semanas ausentes (0 casos)group_by(ano, diagnostico) %>%complete(sem_pri =1:53, fill =list(n_casos =0)) %>%ungroup() %>%mutate(semana_inicio =iso_week_start(ano, sem_pri) ) %>%arrange(diagnostico, ano, sem_pri) %>%group_by(diagnostico, ano) %>%mutate(n_mm3 = zoo::rollmean(n_casos, k =3, fill =NA, align ="center"),n_mm5 = zoo::rollmean(n_casos, k =5, fill =NA, align ="center") ) %>%ungroup()# ---------- DRS: séries por agente (opcional para uso em facetas) ----------ts_semana_drs <- df_2225_stempotal %>%group_by(ano, sem_pri, diagnostico, cod_17drs, drs_nome_2022) %>%summarise(n_casos =n(), .groups ="drop") %>%group_by(ano, diagnostico, cod_17drs, drs_nome_2022) %>%complete(sem_pri =1:53, fill =list(n_casos =0)) %>%ungroup() %>%mutate(semana_inicio =iso_week_start(ano, sem_pri)) %>%arrange(diagnostico, cod_17drs, ano, sem_pri) %>%group_by(diagnostico, cod_17drs, ano) %>%mutate(n_mm3 = zoo::rollmean(n_casos, 3, fill =NA, align ="center")) %>%ungroup()```<br><br>### Visualização — Série temporal interativa (Estado)```{r}#| label: obj4_plot_interativo#| echo: false#| message: false#| warning: false#| fig-width: 11#| fig-height: 6## Série temporal interativa (Estado) — casos semanais por agente (fix: semana_inicio a partir de dt_sin_pri)library(dplyr)library(lubridate)library(zoo)library(ggplot2)library(plotly)library(scales)# Recalcula a série semanal **sem** ISOweek2date (evita NA em SE 53)ts_semana_estado <- df_2225_stempotal %>%mutate(semana_inicio =floor_date(dt_sin_pri, unit ="week", week_start =1)) %>%group_by(ano, sem_pri, diagnostico, semana_inicio) %>%summarise(n_casos =n(), .groups ="drop") %>%arrange(diagnostico, ano, semana_inicio) %>%group_by(diagnostico, ano) %>%mutate(n_mm3 = zoo::rollmean(n_casos, k =3, fill =NA, align ="center")) %>%ungroup()# Checagem rápida (opcional): se vazio, nada vai aparecer# print(dplyr::slice_head(ts_semana_estado, n = 5))plot_estado <-ggplot(ts_semana_estado,aes(x = semana_inicio,y = n_casos,color = diagnostico,group = diagnostico,text =paste0("Agente: ", diagnostico, "<br>","Ano-SE: ", ano, "-W", sprintf("%02d", sem_pri), "<br>","Início da semana: ", format(semana_inicio, "%Y-%m-%d"), "<br>","Casos: ", n_casos, "<br>","MM(3): ", ifelse(is.na(n_mm3), "-", round(n_mm3,1)) ))) +geom_line(alpha =0.35, size =0.6) +# use 'size' (compatível com ggplotly)geom_line(aes(y = n_mm3), size =1.1) +facet_wrap(~ ano, scales ="free_x", nrow =1) +labs(x ="Semana (início)", y ="Casos",color ="Agente",title ="SRAG — Séries temporais semanais por agente (Estado)",subtitle ="Linha sólida: média móvel de 3 semanas; linha clara: contagem semanal") +scale_y_continuous(labels =label_number(big.mark =".", decimal.mark =",")) +theme_minimal(base_size =12) +theme(legend.position ="bottom")ggplotly(plot_estado, tooltip ="text") %>%layout(hovermode ="x unified")``````{r}#| label: cleanup_objetivo4#| echo: false#| message: false#| warning: false# ============================================================# Limpeza dos objetos e funções criados para o Objetivo 4# (Séries temporais — DT_SIN_PRI)# Mantém df_2022_2025_clean e demais bases gerais.# ============================================================objetos_obj4 <-c(# seleção / base"agentes_alvo", "df_2225_stempotal",# séries calculadas"ts_semana_estado", "ts_semana_drs",# função auxiliar (se criada)"iso_week_start",# plot interativo"plot_estado")rm(list = objetos_obj4[objetos_obj4 %in%ls(envir = .GlobalEnv)], envir = .GlobalEnv)```