1 Bibliotecas Utilizdas

library(readxl)
library(knitr)
library(tidyverse)
library(DT)
library(pheatmap)
library(RColorBrewer)
library(plotly)

2 Objetivos

O objetivo deste trabalho é a caracterização do perfil volátil da Campomanesia, realizando uma análise comparativa dos compostos orgânicos voláteis (VOCs) presentes na folha e na flor.

3 Preparo de amostra

As amostras de flores e folhas da Turnera foram analisadas na forma de brotos e ramos inteiros, acondicionados em vials de 10 mL. O fechamento foi realizado com tampas magnéticas, utilizando um crimpador automático.

massas aferidas
Amostra massa
1. Campomanesia_01_flor 201 mg
2. Campomanesia_02_flor 203 mg
3. Campomanesia_03_flor 201 mg
4. Campomanesia_01_folha 243 mg
5. Campomanesia_02_folha 253 mg
6. Campomanesia_03_folha 252 mg

4 Parâmetros Cromatográficos

As amostras foram analisadas via HS/GC-MS em cromatógrafo a gás da Agilent 7890B acoplado ao espectrômetro de massas 7000D. Os VOCs foram extraídos por 15 minutos a 750 rpm em incubadora mantida a 100 °C. O volume de injeção foi de 2,5 mL com seringa mantida a 100 °C. O gás de arraste utilizado foi o hélio 5.0 (99,999%) com velocidade linear de 30,405 cm/s e o injetor operou no modo splitless a 280 °C. Utilizou-se a coluna HP-5ms de 30 m x 250 μm x 0,25 μm. O forno operou a temperatura inicial de 40 °C por 5 minutos, seguido por rampa de 5 °C/min até 160 °C, em seguida, 1 °C/min até 170 °C, por fim, 10 °C/min até 250 °C, totalizando 47 minutos de análise. O espectrômetro de massas operou no modo EI com temperatura da fonte de íons a 300 °C, no modo SCAN a 70 eV com faixa de massa de 17-400 m/z. Os picos foram identificados com base na correlação de similaridade com os espectros padrões da biblioteca NIST 14.

5 Tratamento de Dados

Foi necessário converter os arquivos contendo os cromatogramas de (.D) para (mzML), utilizando o software da Proteo Wizard (Msconvert). Após a conversão, os arquivos foram carregados no software MZmine versão 4.9.14, onde foi realizado todo o processamento de dados com o seguinte workflow:

Fluxo de processamento de dados em GC-EI-MS
Etapa Descricao
1. Importação Entrada dos dados brutos
2. Detecção de massas Centroidização e threshold
3. EIC Construção de cromatogramas de íons extraídos
4. Deconvolução Separação de sinais sobrepostos
5. Alinhamento Comparação entre amostras (tempo de retenção e m/z)
6. Identificação Busca na biblioteca espectral NIST
7. Exportação O processamento é salvo em CSV

5.1 Parâmetros do tratamento de dados no MZmine

A tabela completa contendo os parâmetros do processamento de dados no MZmine (versão 4.9.14) está disponível no Material Suplementar:
Parâmetros

5.2 Codificação das Amostras

As amostras foram codificadas para facilitar o manuseio dos dados, da seguinte maneira:

Codificaço das amostras
Nome Código
Campomanesia_01_flor CAMFR_01
Campomanesia_02_flor CAMFR_02
Campomanesia_03_flor CAMFR_03
Campomanesia_01_folha CAMFA_01
Campomanesia_02_folha CAMFA_02
Campomanesia_03_folha CAMFA_03

5.3 Identificação dos Compostos

Após o processamento dos dados no software MZmine, foi exportada uma tabela contendo as features detectadas, caracterizadas pela razão massa/carga (m/z), tempo de retenção (RT) e área do pico. A identificação dos compostos foi realizada no próprio software, com base na comparação dos espectros de massas obtidos com aqueles disponíveis na biblioteca espectral NIST, utilizando critérios de similaridade espectral. Posteriormente, foi aplicada uma etapa de filtragem das features, na qual foram removidos os sinais que apareceram apenas uma única vez nas triplicatas de cada amostra, visando aumentar a robustez dos dados e reduzir a influência de possíveis ruídos.

dados_ident <- read_xlsx("dados_idententificação.xlsx")

datatable(
  dados_ident %>%
    mutate_at(vars(starts_with("%")), ~ round(., 2)),
  extensions = "Buttons",
  options = list(
    dom = "Bfrtip",
    buttons = c("csv", "excel")))

6 Cromatogramas

7 Teste T

Para realizar a análise estatística de uma amostra como a Campomanesia, com o objetivo de comparar os compostos orgânicos voláteis (COVs) da folha e da flor, foram definidas, na matriz de dados (previamente processada utilizando o MZmine), duas classes referentes às amostras analisadas em triplicata, sendo elas flor e folha.

Foi utilizado o teste t de Student, uma ferramenta estatística empregada para verificar se existe diferença significativa entre dois grupos, neste caso, as duas classes (flor e folha). Esse teste calcula um valor t com base na diferença entre as médias, na variância e no tamanho das amostras, comparando-o a um valor de p, que é utilizado para aceitar ou rejeitar a hipótese nula. Nos casos em que um composto apresenta valor de p < 0,05, rejeita-se a hipótese nula, admitindo-se que há diferença significativa entre os grupos para esse composto.

dados <- read.csv2("Matriz_Campomanesia.csv",check.names = FALSE)

dados$Class <- factor(dados$Class)
Class <- dados$Class

dados_numericos <- dados[, -c(1, 2)]

dados_numericos[] <- lapply(dados_numericos, function(x) {
  as.numeric(gsub(",", ".", as.character(x)))})

dados_numericos <- dados_numericos[, colSums(!is.na(dados_numericos)) > 0]

variancias <- apply(dados_numericos, 2, var, na.rm = TRUE)
dados_numericos <- dados_numericos[, variancias > 0]

dados_normalizados <- as.data.frame(scale(dados_numericos))

p_valores <- apply(dados_normalizados, 2, function(coluna) {
  tryCatch(
    t.test(coluna ~ Class)$p.value,
    error = function(e) NA)
})

resultados_significativos <- p_valores[!is.na(p_valores) & p_valores < 0.05]

tabela_p_valores <- data.frame(
  Composto = names(resultados_significativos),
  P_Valor  = as.numeric(resultados_significativos),
  row.names = NULL
) %>%
  arrange(P_Valor)

datatable(
  tabela_p_valores,
  options = list(pageLength = 10),
  caption = "Compostos significativos pelo teste t"
)

8 Destaque por Grupo

dados_para_media <- cbind(Class = Class, dados_normalizados)

medias_calculadas <- dados_para_media %>%
  group_by(Class) %>%
  summarise(across(everything(), ~ mean(.x, na.rm = TRUE)), .groups = "drop")

nomes_compostos <- colnames(dados_normalizados)

tabela_medias <- as.data.frame(t(medias_calculadas[, -1]))

colnames(tabela_medias) <- as.character(medias_calculadas$Class)

tabela_medias$Composto <- nomes_compostos

grupo_1 <- colnames(tabela_medias)[1]
grupo_2 <- colnames(tabela_medias)[2]

tabela_final <- tabela_medias %>%
  mutate(
    P_Valor = as.numeric(p_valores[Composto]),
    Destaque = ifelse(
      .data[[grupo_1]] > .data[[grupo_2]],
      toupper(grupo_1),
      toupper(grupo_2)
    )
  ) %>%
  filter(!is.na(P_Valor) & P_Valor < 0.05) %>%
  arrange(P_Valor)%>%
  select(Composto, P_Valor, Destaque)

tabela_final$P_Valor <- round(tabela_final$P_Valor, 4)

rownames(tabela_final) <- NULL

datatable(tabela_final)

9 HEATMAP + HCA

Também foi construído um heatmap utilizando todos os compostos detectados, com o objetivo de visualizar o perfil geral das amostras, com base na intensidade dos compostos.

# 1. Matriz de dados

matriz_heatmap <- dados_normalizados

# 2. Definir nomes das amostras

rownames(matriz_heatmap) <- dados$Samples

# 3. Criar anotação (classe)

anotacao <- data.frame(Classe = Class)
rownames(anotacao) <- dados$Samples

# 4. Cores da anotação

cores_anotacao <- list(
  Classe = c("FR" = "#E07B8A", "FA" = "#6BAE75"))

# 5. Paleta de cores do heatmap (melhor contraste)

cores_heatmap <- colorRampPalette(
  rev(brewer.pal(n = 7, name = "RdYlBu")))(100)

# 6. Gerar heatmap + HCA

pheatmap(matriz_heatmap,
  
  # Clustering
  
  clustering_method = "ward.D2",
  clustering_distance_rows = "euclidean",
  clustering_distance_cols = "euclidean",
  
  # Anotações
  
  annotation_row = anotacao,
  annotation_colors = cores_anotacao,
  
  # Aparência
  
  scale = "none",   
  color = cores_heatmap,
  
  fontsize = 10,
  fontsize_row = 8,
  fontsize_col = 6, 
  
  show_colnames = TRUE, 
  
  main = "Heatmap + HCA de Todos os Compostos")

10 PCA