Anexo I: Intensidade do esforço, poluição atmosférica e inalação de MP2,5 ug

Nas páginas a seguir documento a rotina de análise dos dados quantitativos que fazem parte da tese, concernentes a intensidade do esforço e poluição atmosférica. Especificamente o material particulado fino [MP2,5 ug/m³]. Os dados a seguir, portanto, advieram do monitor cardíaco Polar (H10, Kempele, Finlândia) e do monitor de poluição atmosférica portátil (Flow Plume Lab, Paris, França). Embora ambos possibilitem exportar os dados, há um desafio de sincronizá-los na mesma latitude e longitude, bem como no mesmo instante temporal, uma vez que a frequência de aquisição dos dois equipamentos diferem em ambos os critérios. Assim, foi preciso organizar o banco de dados considerando essas disparidades antes de processá-los no software de geoprocessamento QGIS (versão 3.20, Odense).

Para a rotina de análise, serão necessários os seguintes pacotes.

library(usethis)
library(devtools)
library(purrr)
library(tidyr)
library(readr)
library(dplyr)
library(readxl)
library(lubridate)
library(chron)
library(readr)
library(magrittr)

Uma vez carregada a livraria, importamos os arquivos “cvs” advindos de ambos os equipamentos. Como estão todos salvos na mesma pasta e possuem a mesma extensão (cvs), podemos realizar a importação de todos ao mesmo tempo, e depois desagregar por planilha. Comecemos pelos dados do Polar.

Polar H10

O processo de importação dos dados é feito utilizando os comandos a seguir.

todosfc <- list.files(path = "~/Documents/Tese_final/database", pattern = "*.cvs", full.names = F)

todosfc <- sapply(todosfc, read_csv, simplify = F)

invisible(lapply(names(todosfc), function(x) assign(x,todosfc[[x]],envir=.GlobalEnv)))

Em seguida, selecionamos apenas as variáveis de interesse. No caso, frequência cardíaca e tempo. A localização (lat e long) fornecida pelo Polar H10 vem num arquivo distinto da frequência cardíaca. Exemplificarei apenas um dos sujeitos, para que o anexo não fique muito extenso. De todo modo, o comando é o mesmo para todos os demais.

alemao1507 <- AlemaoFC15072020.cvs %>% 
  select("Sport", "Date") %>% 
  rename("duracao" = "Sport", 
         "fc" = "Date") %>% 
  drop_na(fc)

alemao2207 <- AlemaoFC22072020.cvs %>% 
  select("Sport", "Date")%>% 
  rename("duracao" = "Sport", 
         "fc" = "Date") %>% 
  drop_na()

alemao2406 <- AlemaoFC24062020.cvs %>% 
  select("Sport", "Date")%>% 
  rename("duracao" = "Sport", 
         "fc" = "Date") %>% 
  drop_na()

Então, convertemos o tempo em segundos a fim de trabalhar com a diferença entre as células subsequentes, utilizando a expressão a seguir:

alemao1507 <- alemao1507 %>%
  mutate(duracaodiff = time(alemao1507$duracao)) %>% 
  mutate(diff = duracaodiff -lag(duracaodiff))

alemao2207 <- alemao2207 %>%
  mutate(duracaodiff = time(alemao2207$duracao)) %>% 
  mutate(diff = duracaodiff -lag(duracaodiff))

alemao2406 <- alemao2406 %>%
  mutate(duracaodiff = time(alemao2406$duracao)) %>% 
  mutate(diff = duracaodiff -lag(duracaodiff))

Removemos as linhas que não são valores e somamos os resultados da diferença entre as linhas.

alemao1507 = alemao1507[-c(1,2),]

alemao2207 = alemao2207[-c(1,2),]

alemao2406 = alemao2406[-c(1,2),]

alemao1507 <- alemao1507 %>% 
  mutate(duracao1 = cumsum(diff)) %>% 
  select(-c(diff))

alemao2207 <- alemao2207 %>% 
  mutate(duracao1 = cumsum(diff)) %>% 
  select(-c(diff)) 

alemao2406 <- alemao2406 %>% 
  mutate(duracao1 = cumsum(diff)) %>% 
  select(-c(diff))

Então, separamos os dados de GPS adivindos do monitor cardíaco por data e também convertemos o tempo em segundos.

alemaogps1507 <- Alemao_fcgps.cvs %>% 
  separate(Time, c("data", "duracao"), "\\s") %>%
  filter(data == "2020-07-15") 
alemaogps1507 <- alemaogps1507 %>% 
  mutate(duracao = time(alemaogps1507$duracao)) %>% 
  select(-c("Segment"))

alemaogps2207 <- Alemao_fcgps.cvs %>% 
  separate(Time, c("data", "duracao"), "\\s") %>%
  filter(data == "2020-07-22") 
alemaogps2207 <- alemaogps2207 %>% 
  mutate(duracao = time(alemaogps2207$duracao)) %>% 
  select(-c("Segment"))

alemaogps2406 <- Alemao_fcgps.cvs %>% 
  separate(Time, c("data", "duracao"), "\\s") %>%
  filter(data == "2020-06-24") 
alemaogps2406 <- alemaogps2406 %>% 
  mutate(duracao = time(alemaogps2406$duracao)) %>% 
  select(-c("Segment"))

Finalmente podemos fazer o “join” entre frequência cardíaca e localização (lat e long).

alemao1507fcgps <- inner_join(alemao1507, alemaogps1507, by = c("duracao1" = "duracao"))
alemao2207fcgps <- inner_join(alemao2207, alemaogps2207, by = c("duracao1" = "duracao"))
alemao2406fcgps <- inner_join(alemao2406, alemaogps2406, by = c("duracao1" = "duracao"))

Outrossim, é possível estimar a ventilação a partir da frequência cardíaca registrada pelo Polar. Optamos por utilizar a equação de Cruz et al. Estimation of minute ventilation by heart rate for field exercise studies. Scientific reports 10, no. 1 (2020): 1-7 para os cálculos.

alemao1507fcgps <- alemao1507fcgps %>%
  mutate(fc = as.numeric(fc)) %>% 
  mutate(ve = (exp(1.16 + (0.021 * fc))))
alemao2207fcgps <- alemao2207fcgps %>% 
  mutate(fc = as.numeric(fc)) %>% 
  mutate(ve = (exp(1.16 + (0.021 * fc))))
alemao2406fcgps <- alemao2406fcgps %>% 
  mutate(fc = as.numeric(fc)) %>% 
  mutate(ve = (exp(1.16 + (0.021 * fc))))

Flow Plume Lab

O processo de importação dos dados do monitor portátil de poluição atmosférica segue os mesmos comandos. Importamos todos os arquivos cvs existentes na pasta e, posteriormente, desagregamos as planilhas. Então, selecionamos apenas as colunas de interesse, que no caso referem-se aos dados de poluição atmosférica, data e duração.

alemaoflow1507 <- AlemaoLatLong_1507.csv
alemaoflow1507 <- alemaoflow1507 %>% 
  separate(date, c("data", "duracao"), "\\s") %>%
  filter(data == "2020-07-15")

alemaoflow2207 <- AlemaoLatLong_2207.csv
alemaoflow2207 <- alemaoflow2207 %>% 
  separate(date, c("data", "duracao"), "\\s") %>%
  filter(data == "2020-07-22")

alemaoflow2406 <- AlemaoLatLong_2406.csv
alemaoflow2406 <- alemaoflow2406 %>% 
  separate(date, c("data", "duracao"), "\\s") %>%
  filter(data == "2020-06-24")

E após um processo de limpeza dos dados, que elimina colunas e linhas desnecessárias, podemos fazer um “join” de todos os dias que os voluntários foram monitorados. Tanto o processo de organização e limpeza do banco de dados, quanto a união dos dados do Flow Plume Lab são descritos abaixo.

alemaoflow1507$duracao = substr(alemaoflow1507$duracao, 1, nchar(alemaoflow1507$duracao) -3)
alemaoflow2207$duracao = substr(alemaoflow2207$duracao, 1, nchar(alemaoflow2207$duracao) -3)
alemaoflow2406$duracao = substr(alemaoflow2406$duracao, 1, nchar(alemaoflow2406$duracao) -3)

alemaofloww1507 <- Alemaopollution_1507.csv
alemaofloww1507 <- alemaofloww1507 %>% 
  separate('date (UTC)', c("data", "duracao"), "\\s") %>%
  filter(data == "2020-07-15") %>% 
  select(-c(4,5,6,7,12))

alemaofloww2207 <- Alemaopollution_2207.csv
alemaofloww2207 <- alemaofloww2207 %>% 
  separate('date (UTC)', c("data", "duracao"), "\\s") %>%
  filter(data == "2020-07-22") %>% 
  select(-c(4,5,6,7,12))

alemaofloww2406 <- Alemaopollution_2406.csv
alemaofloww2406 <- alemaofloww2406 %>%
  separate('date (UTC)', c("data", "duracao"), "\\s") %>%
  filter(data == "2020-06-24") %>% 
  select(-c(4,5,6,7,12))

alemaofloww1507$duracao = substr(alemaofloww1507$duracao, 1, nchar(alemaofloww1507$duracao) -3)
alemaofloww2207$duracao = substr(alemaofloww2207$duracao, 1, nchar(alemaofloww2207$duracao) -3)
alemaofloww2406$duracao = substr(alemaofloww2406$duracao, 1, nchar(alemaofloww2406$duracao) -3)

alemaoflowtotal1507 <- inner_join(alemaoflow1507, alemaofloww1507, by = "duracao")
alemaoflowtotal2207 <- inner_join(alemaoflow2207, alemaofloww2207, by = "duracao")
alemaoflowtotal2406 <- inner_join(alemaoflow2406, alemaofloww2406, by = "duracao")

Com os dados devidamente organizados, é possível estimar a inalação de poluentes atmosféricosem função do esforço físico. Para tanto, primeiro, calculamos a média de poluentes do dia de cada voluntário, e então multiplicamos o valor pela resposta ventilatória, estimada previamente a partir da frequência cardíaca, conforme segue.

alemao2406pm25 <- alemaoflowtotal2406
alemao2406pm25 <- alemao2406pm25 %>% 
  rename(pm2.5 = 'pm 2.5 (Plume AQI)') %>% 
  summarise(pm2.5media = mean(pm2.5)) %>% 
  mutate(pm2.5media = round(pm2.5media, digits = 0))

alemao2207pm25 <- alemaoflowtotal2207
alemao2207pm25 <- alemao2207pm25 %>% 
  rename(pm2.5 = 'pm 2.5 (Plume AQI)') %>% 
  summarise(pm2.5media = mean(pm2.5)) %>% 
  mutate(pm2.5media = round(pm2.5media, digits = 0))

alemao1507pm25 <- alemaoflowtotal1507
alemao1507pm25 <- alemao1507pm25 %>% 
  rename(pm2.5 = 'pm 2.5 (Plume AQI)') %>% 
  summarise(pm2.5media = mean(pm2.5)) %>% 
  mutate(pm2.5media = round(pm2.5media, digits = 0))

alemao1507fcgps <- alemao1507fcgps %>%
  mutate(pm2.5inhaled = (ve * 5)) %>%
  mutate(pm2.5inhaledrep = (8 * 5)) %>% # Descobrir o valor da VE de repouso e mudar
  mutate(pm2.5inhaled = round(pm2.5inhaled, digits = 0))

alemao2207fcgps <- alemao2207fcgps %>%
  mutate(pm2.5inhaled = (ve * 6)) %>%
  mutate(pm2.5inhaledrep = (8 * 6)) %>% # Descobrir o valor da VE de repouso e mudar
  mutate(pm2.5inhaled = round(pm2.5inhaled, digits = 0))

alemao2406fcgps <- alemao2406fcgps %>%
  mutate(pm2.5inhaled = (ve * 5)) %>% 
  mutate(pm2.5inhaledrep = (8 * 5)) %>% # Descobrir o valor da VE de repouso e mudar
  mutate(pm2.5inhaled = round(pm2.5inhaled, digits = 0))

Finalmente podemos elaborar os gráficos utilizados no estudo. Gostaria de utilizar como exemplo o timeline que caracteriza a inalação de MP2,5 de Adolfo durante uma jornada de trabalho de quase 8h. Antes de elaborarmos a imagem, convertemos o formato temporal do dado, de segundos para minutos. Subsequentemente, executamos o comando que produz a imagem.

Para produzir o gráfico, contudo, é necessário instalar a livraria “ggplot2”, que possibilita que o R execute a função a seguir.

grafico_timeline %>% ggplot() +
  geom_area(aes(x=duracao, y=pm2.5inhaled), alpha = 0.5, colour = "gray") +
  labs(title = element_blank(),
       x=expression("Duração (horas)"),
       y=expression("Inalação PM"[2.5])) +
  geom_hline(aes(yintercept=40, linetype = "Inalação em repouso"),  colour=" dark green") +
  scale_linetype_manual(name = element_blank(), values = c(2,2)) +
  theme(legend.text = element_blank()) +
  theme_classic() +
  theme(legend.text = element_text(size = 14),
        axis.text = element_text(size = 18),
        axis.title = element_text(size = 22),
          title = element_text(size = 24))

Por fim, exportamos as planilhas cvs devidamente arranjadas para serem processadas no QGIS, contendo as seguintes informações: latitude & longitude, frequência cardíaca, ventilação, poluição atmosférica e inalação de poluentes. O comando para exportar os arquivos é write.cvs(nome do arquiv, destino).