Código preparatório para a atividade

# Defina o diretório onde o arquivo da atividade foi salvo
setwd("C:/Users/marci/Projetos/learningR/EADPG119/ativ1Covid/")

# Always include this line at the top of your script, 
# if you don’t want to see the scientific notations in your numbers and 
# charts. Estava atrapalhando no gráfico
options(scipen = 999)

# Carregue o pacote ggplot2
library(ggplot2)

# Carregue os pacotes necessários para pipe
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(magrittr)

# Para usar xlsx (não funcionou adequadamente)
library(readxl)
# Leia o arquivo xls, selecionando as colunas 1 a 4
df <- read_excel("atividade1_EADPG119.xlsx", col_names = TRUE)[, c(1:4)]
# "asczando" os nomes de colunas
colnames(df)[2:ncol(df)] <- c("Mes", 
                              "CasosConfirmados", 
                              "ObitosConfirmados")
# Função para formatar os rótulos do eixo y com separador de milhar ponto
format_pt <- function(x) format(x, big.mark = ".", decimal.mark = ",", scientific = FALSE)

# Exiba a estrutura do df
str(df)
## tibble [30 × 4] (S3: tbl_df/tbl/data.frame)
##  $ Ano              : num [1:30] 2020 2020 2020 2020 2020 2020 2020 2020 2020 2020 ...
##  $ Mes              : chr [1:30] "Fevereiro" "Março" "Abril" "Maio" ...
##  $ CasosConfirmados : num [1:30] 21 520 2044 9225 21787 ...
##  $ ObitosConfirmados: num [1:30] 0 436 1740 9318 19540 ...
# Exiba as primeiras linhas do df
head(df)
# Exiba o df como tabela
#View(df)

Foram alterados os nomes das colunas a fim de evitar caracteres não-ASCII e espaços em branco.

Tarefa 1

Utilizando os recursos do R construa um gráfico de dispersão da covid-19 para os casos confirmados (x) e para os Óbitos confirmados (y)

Resultado da Tarefa 1

Abaixo o código e em seguida o gráfico gerado. Falta o separador de milhar ou outra solução para melhorar a visualização.

# AF (resolvido): exibir no gráfico valores com ponto como separador de milhar para 
# melhorar a visualização



# AF: corrigir bug no uso de caracteres não-ascii no gráfico: exibe 
# corretamente no documento mas não no console
# corrido: esta dica resolveu
# https://discourse.curso-r.com/t/configuracao-r-studio-utf-8/639  
ggplot(df, aes(x = `CasosConfirmados`, y = `ObitosConfirmados`)) +
  geom_point() +
  labs(x = "Casos", y = "Óbitos", title = "Casos X Óbitos (confirmados)") +
  scale_x_continuous(labels = format_pt) +
  scale_y_continuous(labels = format_pt)

Tarefa 2

Calcule a média e o desvio padrão de casos confirmados e óbitos confirmados por ano (2020, 2021 e 2022)

O código a seguir usar loop for. Assim é possível gerar um código aplicável a qualquer conjunto finito de anos.

# Criar vetores para armazenar resultados
# Obtém os anos únicos presentes no dataframe
anos <- unique(df$Ano)
# Cria vetores para armazenar as 4 variáveis que serão calculadas abaixo
# o cumprimento do vetor é igual à quantidade de Anos únicos
media_casos <- numeric(length(anos))
desvio_padrao_casos <- numeric(length(anos))
media_obitos <- numeric(length(anos))
desvio_padrao_obitos <- numeric(length(anos))

# Loop para calcular média e desvio padrão para cada ano
for (i in seq_along(anos)) {
  # Filtra os dados para o ano a ser iterado isto é, anos[i]
  dados_ano <- subset(df, Ano == anos[i])
  # Calcula a média de casos confirmados para os dados filtrados para o 
  # ano sendo iterado; em seguida, calcula desvio padrão e o mesmo
  # para ObitosConfirmados
  media_casos[i] <- mean(dados_ano$CasosConfirmados)
  desvio_padrao_casos[i] <- sd(dados_ano$CasosConfirmados)
  media_obitos[i] <- mean(dados_ano$ObitosConfirmados)
  desvio_padrao_obitos[i] <- sd(dados_ano$ObitosConfirmados)
}

# Criar tabela de resultados
resultados <- data.frame(
  Ano = anos,
  `Média Casos Confirmados` = media_casos,
  `Desvio Padrão Casos Confirmados` = desvio_padrao_casos,
  `Média Óbitos Confirmados` = media_obitos,
  `Desvio Padrão Óbitos Confirmados` = desvio_padrao_obitos
)

print(resultados)
##    Ano Média.Casos.Confirmados Desvio.Padrão.Casos.Confirmados
## 1 2020                45878.55                        45378.81
## 2 2021                84045.00                        67879.61
## 3 2022               154573.86                       179036.08
##   Média.Óbitos.Confirmados Desvio.Padrão.Óbitos.Confirmados
## 1                 45267.27                         45353.61
## 2                 84382.08                         67771.46
## 3                154953.71                        171924.46

Por que seq_along()?

A função seq_along() não é estritamente necessária, mas é uma boa prática usá-la ao iterar sobre vetores ou listas em R. Vou explicar o motivo:

Iteração Direta: Você pode iterar diretamente sobre o vetor anos usando um loop for da seguinte maneira:

for (ano in anos) {
  # Seu código aqui
}

No entanto, isso não é tão comum em R. A razão é que, ao iterar diretamente sobre o vetor, você não tem acesso ao índice atual (ou seja, a posição do elemento no vetor). A função seq_along() cria uma sequência de números inteiros de 1 até o comprimento do vetor. Isso permite que você acesse tanto o elemento quanto o índice atual durante a iteração:

for (i in seq_along(anos)) {
  ano <- anos[i]  # Acessa o elemento atual
  # Seu código aqui
}

Usar seq_along() é uma prática recomendada porque torna o código mais legível e evita erros relacionados ao índice.

Em resumo, você pode usar qualquer abordagem (iteração direta ou seq_along()), mas o uso da função seq_along() é preferível para garantir que você tenha acesso aos índices corretos durante a iteração.

Tarefa 3

Elabore um Rotina em R que determine o semestre com maior número de casos confirmados e o maior número de Óbitos (1º semestre = JAN a JUN; 2º semestre = JUL a DEZ)

Código preparatório para a tarefa 2

# Converter o mês para um formato numérico
df$Mes <- factor(df$Mes, levels = c("Janeiro", "Fevereiro", "Março", "Abril",
                                    "Maio", "Junho", "Julho", "Agosto",
                                    "Setembro", "Outubro", "Novembro", 
                                    "Dezembro"))

# Calcular nova coluna para exibir os valores numéricos - fatores - 
# correspondentes criados antes
#df$Mes_numerico <- as.integer(df$Mes)

# Criar uma variável para representar o semestre
df$Semestre <- ifelse(df$Mes %in% c("Janeiro", "Fevereiro", "Março", "Abril",
                                    "Maio", "Junho"), 1, 2)

Ignorando o ano

Nesta seção calcula-se o semestre com maior número de casos e o maior número de óbitos confirmados desconsiderando o ano.

# Calcular o total de casos confirmados e óbitos por semestre como novo 
# dataframe
total_por_semestre <- aggregate(cbind(CasosConfirmados, ObitosConfirmados) ~ 
                                  Semestre, data = df, sum)
#str(total_por_semestre)
#View(total_por_semestre)

# Identificar o semestre com maior número de casos confirmados
semestre_max_casos <- 
  total_por_semestre$Semestre[which.max(total_por_semestre$CasosConfirmados)]
casos_max <- max(total_por_semestre$CasosConfirmados)

# Identificar o semestre com maior número de óbitos
semestre_max_obitos <- 
  total_por_semestre$Semestre[which.max(total_por_semestre$ObitosConfirmados)]
obitos_max <- max(total_por_semestre$ObitosConfirmados)

# Exibir os resultados para casos confirmados
cat("Semestre com maior número de casos confirmados:", semestre_max_casos, 
    "com", casos_max, "casos confirmados.\n")
## Semestre com maior número de casos confirmados: 1 com 1933525 casos confirmados.
# Exibir os resultados para número de óbitos
cat("Semestre com maior número de óbitos confirmados:", semestre_max_obitos, 
    "com", obitos_max, "óbitos confirmados.\n")
## Semestre com maior número de óbitos confirmados: 1 com 1930002 óbitos confirmados.

Tem-se, assim, o semestre com maior número de casos e o maior número de óbitos confirmados desconsiderando o ano. Entende-se que não é exatamente isto que a atividade está pedindo. Na seção seguinte é apresentado o cálculo supostamente mais aderente ao que foi solicitado.

Considerando o ano

Nesta seção calcula-se o semestre com maior número de casos confirmados e o maior número de óbitos confirmados considerando o ano.

# Calcular o total de casos confirmados e óbitos por Ano-Semestre num novo 
# dataframe
total_por_ano_semestre <- aggregate(cbind(CasosConfirmados, ObitosConfirmados)
                                    ~ Ano + Semestre, data = df, sum)
#str(total_por_ano_semestre)
#View(total_por_ano_semestre)

# Calcule a variável combinada Ano_Semestre concatenando Ano e Semestre
total_por_ano_semestre$Ano_Semestre = 
  paste(total_por_ano_semestre$Ano, total_por_semestre$Semestre, sep = "-")

# Identificar o Ano-Semestre com maior número de casos confirmados
ano_semestre_max_casos <- 
  total_por_ano_semestre$Ano_Semestre[
    which.max(total_por_ano_semestre$CasosConfirmados)]
casos_max <- max(total_por_ano_semestre$CasosConfirmados)

# Identificar o Ano-Semestre com maior número de óbitos confirmados
ano_semestre_max_obitos <- 
  total_por_ano_semestre$Ano_Semestre[
    which.max(total_por_ano_semestre$ObitosConfirmados)]
obitos_max <- max(total_por_ano_semestre$ObitosConfirmados)

# Exibir os resultados para número de casos confirmados
cat("Ano-Semestre com maior número de casos confirmados:", 
    ano_semestre_max_casos, "com", casos_max, "casos confirmados.\n")
## Ano-Semestre com maior número de casos confirmados: 2022-1 com 1067080 casos confirmados.
# Exibir os resultados para número de óbitos
cat("Ano-Semestre com maior número de óbitos confirmados:", 
    ano_semestre_max_obitos, "com", obitos_max, "óbitos confirmados.\n")
## Ano-Semestre com maior número de óbitos confirmados: 2022-1 com 1064092 óbitos confirmados.

Tarefa 4

Utilizando o R calcule o Risco relativo e a Razão de Chance mensal e anual da Covid-19 (Módulo 4)

O que é Risco Relativo e Razão de Chance

O Risco Relativo (ou Razão de Risco) é uma medida estatística utilizada para comparar a probabilidade de um evento ocorrer em dois grupos distintos.

A Razão de Chance (ou Odds Ratio) é uma medida estatística que compara as chances de um evento ocorrer em dois grupos diferentes.

  • O: Ocorrência do Evento
  • S: Sim
  • N: Não
  • E: Exposto (pertence ao grupo exposto)

Combinando:

O{S|N}E{S|N}

  • A: OSES: soma das ocorrências do evento, para o grupo exposto
  • B: ONES: soma das não-ocorrências do evento, para o grupo exposto
  • C: OSEN: soma das ocorrências do evento, para o grupo não-exposto
  • D: ONEN: soma das não-ocorrências do evento, para o não-grupo exposto

Interpretação dos Dados da Tarefa

Para efeitos da tarefa:

  1. Por definição, A é a soma das ocorrências do evento, para o grupo exposto
  2. Por definição, B é a soma das não-ocorrências do evento, para o grupo exposto
  3. Por definição, C é a soma das ocorrências do evento, para o grupo não-exposto
  4. Por definição, D é a soma das não-ocorrências do evento, para o não-grupo exposto
  5. Por hipótese, evento é óbito confirmado. Portanto, a ocorrência do evento é a ocorrência do óbito confirmado.
  6. Por hipótese, exposição é caso confirmado. Portanto, o grupo exposto é o grupo das pessoas com caso confirmado, com diagnóstivo de covid19 confirmado.
  7. Portanto, de 1, 5 e 6, a soma das ocorrências do evento, para o grupo exposto, A, é a soma de óbitos confirmados, para a soma de casos confirmados
  8. Portanto, de 2, 5 e 6, a soma das não-ocorrências do evento para o grupo exposto, B, é a soma de não-óbitos confirmados, para a soma de casos confirmados, ou seja, a diferença entre a soma de casos confirmados e a soma de óbitos (ou seja, se 1000 pegaram e 800 morreram, B é 200)
  9. Portanto, de 3, 5 e 6, a soma das ocorrências do evento para o grupo não-exposto, C, é a soma de óbitos confirmados, para a soma de não-casos confirmados
  10. Portanto, de 4, 5 e 6, a soma das não-ocorrências do evento para o grupo não-exposto, D, é a soma de não-óbitos confirmados, para a soma de não-casos confirmados

A soma de não-casos confirmados não é dada no exercício e impossível de inferir (calcular). Assim, C e D são arbitrariamente determinados:

  1. Por hipótese, C mensal é 100000 e C anual é 1000000
  2. Por hipótese, D mensal é 5000 e D anual é 50000

Contudo, não seria necessário, a fim de manter consistente o exercício, que valor anual = valor mensal * 12 ? De qualquer forma, usando os valores definidos.

Cálculo de RR e OD

# Definição de funções para calcular RR e OR
calcular_RR <- function(A, B, C, D) {
  RR <- (A / (A + B)) / (C / (C + D))
  return(RR)
}

calcular_OR <- function(A, B, C, D) {
  OR <- (A * D) / (B * C)
  return(OR)
}

# Cálculo de RR e OR Mensal com os meses ordenados
#
# Operador %>% (Pipe):
# O operador %>% é usado para encadear operações em data frames no pacote
# dplyr.Ele permite que você aplique várias funções sequencialmente a um data
# frame, passando o resultado de uma função como entrada para a próxima.
# Isso torna o código mais legível e facilita a criação de pipelines de 
# transformação de dados.Por exemplo, em 
# df %>% arrange(Ano, Mes) %>% group_by(Ano, Mes) %>% summarise(...), 
# o data frame df é primeiro organizado por ano e mês, depois agrupado 
# por ano e mês e, finalmente, resumido usando a função summarise.

dados_mensais <- df %>%
  arrange(Ano, Mes) %>%
  group_by(Ano, Mes) %>%
  summarise(
    A = sum(`ObitosConfirmados`, na.rm = TRUE),
    B = sum(`CasosConfirmados`, na.rm = TRUE) - A,
    C = 100000, # número de pessoas sem casos confirmados e sem óbitos,
    D = 5000 # número de óbitos na população não exposta (sem casos confirmados)
  ) %>%

  # A função mutate é usada para criar novas colunas ou modificar colunas 
# existentes em um data frame.
# Ela aceita uma série de expressões que especificam as transformações a 
# serem aplicadas às colunas.
# No código, usamos mutate para calcular as colunas RR e OR.
# Exemplo: mutate(RR = calcular_RR(A, B, C, D), OR = calcular_OR(A, B, C, D)) 
# adiciona duas novas colunas chamadas RR e OR ao data frame, calculando seus
# valores com base nas colunas existentes A, B, C e D.
    mutate(
    RR = calcular_RR(A, B, C, D),
    OR = calcular_OR(A, B, C, D)
  )
## `summarise()` has grouped output by 'Ano'. You can override using the `.groups`
## argument.
# Cálculo de RR e OR Anual
dados_anuais <- df %>%
  group_by(Ano) %>%
  summarise(
    A = sum(`ObitosConfirmados`, na.rm = TRUE),
    B = sum(`CasosConfirmados`, na.rm = TRUE) - A,
    C = 1000000,
    D = 50000
  ) %>%
  mutate(
    RR = calcular_RR(A, B, C, D),
    OR = calcular_OR(A, B, C, D)
  )
#View(dados_mensais)
#View(dados_anuais)
print(dados_mensais)
## # A tibble: 30 × 8
## # Groups:   Ano [3]
##      Ano Mes            A     B      C     D    RR     OR
##    <dbl> <fct>      <dbl> <dbl>  <dbl> <dbl> <dbl>  <dbl>
##  1  2020 Fevereiro      0    21 100000  5000 0      0    
##  2  2020 Março        436    84 100000  5000 0.880  0.260
##  3  2020 Abril       1740   304 100000  5000 0.894  0.286
##  4  2020 Maio        9318   -93 100000  5000 1.06  -5.01 
##  5  2020 Junho      19540  2247 100000  5000 0.942  0.435
##  6  2020 Julho      51282  2455 100000  5000 1.00   1.04 
##  7  2020 Agosto     65776 -1298 100000  5000 1.07  -2.53 
##  8  2020 Setembro   51919   225 100000  5000 1.05  11.5  
##  9  2020 Outubro    56563  -644 100000  5000 1.06  -4.39 
## 10  2020 Novembro  102545  7013 100000  5000 0.983  0.731
## # ℹ 20 more rows
print(dados_anuais)
## # A tibble: 3 × 7
##     Ano       A     B       C     D    RR     OR
##   <dbl>   <dbl> <dbl>   <dbl> <dbl> <dbl>  <dbl>
## 1  2020  497940  6724 1000000 50000  1.04   3.70
## 2  2021 1012585 -4045 1000000 50000  1.05 -12.5 
## 3  2022 1084676 -2659 1000000 50000  1.05 -20.4