Bibliotecas Utilizdas

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

Objetivos

O estudo tem como objetivo caracterizar compostos orgânicos voláteis (COVs),presentes nas amostras de Laranja da Terra tanto Doce como Azeda, utilizando como matriz casca e a polpa dos frutos, através de cromatografia gasosa acoplada à um espectrômetro de massas (GC-MS), com extração por headspace. Além de comparar os COVs, por meio de análises estatísticas univariadas e multivariadas, a fim de identificar compostos discriminantes entre as amostras.

Análise Cromatográfica

Preparo de Amostra

Foram utilizadas duas amostras in natura, onde uma amostra corresponde a laranja da terra doce e a outra laranja da terra azeda, onde as duas foram separadas entre casca e polpa. Após esse preparo foram pesadas em vials de mL aproximadamente 1,0 g em triplicata, a fim de verificar a reprodutibilidade, os frascos foram selados com auxílio de um crimpador automático, utilizando tampas magnéticas.

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.

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

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

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 <- read_delim("Dados_Laranja_da_terra.csv")

datatable(dados)

Laranja da terra Azeda

Filtragem

Foi montada uma tabela indicando se cada composto identificado pertence exclusivamente à polpa, exclusivamente à casca ou se está presente em ambas as partes do fruto. A classificação foi realizada com base na presença/ausência dos compostos nas réplicas analisadas.

tabela_compostos_azeda <- dados %>%
  filter(
    `LARANJA_TERRA_AZEDA_CASCA_01` > 0 |
    `LARANJA_TERRA_AZEDA_CASCA_02` > 0 |
    `LARANJA_TERRA_AZEDA_CASCA_03` > 0 |
    `LARANJA_TERRA_AZEDA_POLPA_01` > 0 |
    `LARANJA_TERRA_AZEDA_POLPA_02` > 0 |
    `LARANJA_TERRA_AZEDA_POLPA_03` > 0
  ) %>%
  mutate(
    presente_casca = ifelse(`LARANJA_TERRA_AZEDA_CASCA_01` > 0 | `LARANJA_TERRA_AZEDA_CASCA_02` > 0 | `LARANJA_TERRA_AZEDA_CASCA_03` > 0, TRUE, FALSE),
    presente_polpa = ifelse(`LARANJA_TERRA_AZEDA_POLPA_01` > 0 | `LARANJA_TERRA_AZEDA_POLPA_02` > 0 | `LARANJA_TERRA_AZEDA_POLPA_03` > 0, TRUE, FALSE),
    Matriz = case_when(
      presente_casca & presente_polpa  ~ "Ambos",
      presente_casca & !presente_polpa ~ "Somente Casca",
      !presente_casca & presente_polpa ~ "Somente Polpa",
      TRUE                             ~ "Nenhum")
  ) %>%
  select(Compound, Matriz)

datatable(tabela_compostos_azeda)

HEATMAP

Foi feito um mapa de calor, para visualizar a distribuição de intensidade dos COVs identificados na casca e polpa.

dadosest <- read.csv2("dados_estat.csv")
dadosest <- as.data.frame(dadosest)

dados_norm <- scale(dadosest[, -c(1:2)], center = TRUE, scale = TRUE)

dados_norm <- dados_norm[, colSums(is.na(dados_norm)) == 0]

matriz_heatmap <- t(dados_norm)

colnames(matriz_heatmap) <- trimws(as.character(dadosest[[1]]))

var_linhas <- apply(matriz_heatmap, 1, var, na.rm = TRUE)
matriz_heatmap <- matriz_heatmap[var_linhas > 0, ]

matriz_heatmap[is.na(matriz_heatmap)]       <- 0
matriz_heatmap[is.nan(matriz_heatmap)]      <- 0
matriz_heatmap[is.infinite(matriz_heatmap)] <- 0

vetor_classes <- trimws(tolower(as.character(dadosest[[2]])))
anotacao_topo <- data.frame(Grupo = vetor_classes)
rownames(anotacao_topo) <- colnames(matriz_heatmap)

cores_grupos <- list(
  Grupo = c("casca" = "#D95F02", "polpa" = "#1B9E77"))

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

pheatmap(matriz_heatmap,
         scale = "none",
         cluster_rows = TRUE,
         cluster_cols = TRUE,
         annotation_col = anotacao_topo,
         annotation_colors = cores_grupos,
         color = paleta_metabolomica,
         border_color = NA,
         show_colnames = TRUE,
         show_rownames = TRUE,
         fontsize_row = 7,
         fontsize_col = 8,
         angle_col = "90")

Laranja da Terra Doce

Filtragem

Foi montada uma tabela indicando se cada composto identificado pertence exclusivamente à polpa, exclusivamente à casca ou se está presente em ambas as partes do fruto. A classificação foi realizada com base na presença/ausência dos compostos nas réplicas analisadas.

tabela_compostos_doce <- dados %>%
  filter(
    `LARANJA_TERRA_DOCE_POLPA_01` > 0 |
    `LARANJA_TERRA_DOCE_POLPA_02` > 0 |
    `LARANJA_TERRA_DOCE_POLPA_03` > 0 |
    `LARANJA_TERRA_DOCE_CASCA_01` > 0 |
    `LARANJA_TERRA_DOCE_CASCA_02` > 0 |
    `LARANJA_TERRA_DOCE_CASCA_03` > 0
  ) %>%
  mutate(
    presente_casca = ifelse(`LARANJA_TERRA_DOCE_CASCA_01` > 0 | `LARANJA_TERRA_DOCE_CASCA_02` > 0 | `LARANJA_TERRA_DOCE_CASCA_03` > 0, TRUE, FALSE),
    presente_polpa = ifelse(`LARANJA_TERRA_DOCE_POLPA_01` > 0 | `LARANJA_TERRA_DOCE_POLPA_02` > 0 | `LARANJA_TERRA_DOCE_POLPA_03` > 0, TRUE, FALSE),
    Matriz = case_when(
      presente_casca & presente_polpa  ~ "Ambos",
      presente_casca & !presente_polpa ~ "Somente Casca",
      !presente_casca & presente_polpa ~ "Somente Polpa",
      TRUE                             ~ "Nenhum")
  ) %>%
  select(Compound, Matriz)

datatable(tabela_compostos_doce)

HEATMAP

Foi feito um mapa de calor, para visualizar a distribuição de intensidade dos COVs identificados na casca e polpa.

dadosest2 <- read.csv2("DADOSEST2.csv")
dadosest2 <- as.data.frame(dadosest2)

dados_norm <- scale(dadosest2[, -c(1:2)], center = TRUE, scale = TRUE)

dados_norm <- dados_norm[, colSums(is.na(dados_norm)) == 0]

matriz_heatmap <- t(dados_norm)

colnames(matriz_heatmap) <- trimws(as.character(dadosest2[[1]]))

var_linhas <- apply(matriz_heatmap, 1, var, na.rm = TRUE)
matriz_heatmap <- matriz_heatmap[var_linhas > 0, ]

matriz_heatmap[is.na(matriz_heatmap)]       <- 0
matriz_heatmap[is.nan(matriz_heatmap)]      <- 0
matriz_heatmap[is.infinite(matriz_heatmap)] <- 0

vetor_classes <- trimws(tolower(as.character(dadosest2[[2]])))
anotacao_topo <- data.frame(Grupo = vetor_classes)
rownames(anotacao_topo) <- colnames(matriz_heatmap)

cores_grupos <- list(
  Grupo = c("casca" = "#D95F02", "polpa" = "#1B9E77"))

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

pheatmap(matriz_heatmap,
         scale = "none",
         cluster_rows = TRUE,
         cluster_cols = TRUE,
         annotation_col = anotacao_topo,
         annotation_colors = cores_grupos,
         color = paleta_metabolomica,
         border_color = NA,
         show_colnames = TRUE,
         show_rownames = TRUE,
         fontsize_row = 7,
         fontsize_col = 8,
         angle_col = "90")

Comparação entre Laranja da terra (DOCE X AZEDO)

ANOVA

Após a normalização dos dados por meio da padronização (z-score), foi realizada a análise de variância (ANOVA), com o objetivo de avaliar diferenças na abundância dos compostos entre as diferentes classes de amostras. A ANOVA compara as médias entre grupos a partir da razão entre a variabilidade entre grupos e a variabilidade dentro dos grupos, resultando em um valor de p. Quando p < 0,05, rejeita-se a hipótese nula, indicando diferença estatisticamente significativa entre pelo menos dois grupos.

Após a ANOVA, foi aplicada uma correção para múltiplas comparações utilizando o método FDR (False Discovery Rate), com o objetivo de controlar a taxa de falsos positivos. Foram considerados significativos os compostos com valores de FDR < 0,05.

Adicionalmente, para cada composto significativo, foi identificada a classe que apresentou maior abundância média, permitindo a associação entre compostos discriminantes e grupos específicos de amostras.

## Colunas removidas por variância zero: 0

PCA

Foi realizada a análise de componentes principais (PCA), que é uma análise multivariada que reduz a dimensionalidade dos dados, permitindo a visualização da distribuição das amostras em função dos componentes principais (PCs), os quais explicam a variância total dos dados. Observou-se que as amostras apresentaram pouca proximidade, sugerindo uma fraca similaridade em seus perfis químicos.

pca_res <- prcomp(dados_filtrado,
                  scale. = FALSE)

scores <- as.data.frame(pca_res$x)

scores$Class <- Class

var_exp <- (pca_res$sdev^2 /
              sum(pca_res$sdev^2)) * 100

cores <- c(
  "Casca_Azeda" = "#D95F02",
  "Polpa_Azeda" = "#1B9E77",
  "Casca_Doce"  = "#7570B3",
  "Polpa_Doce"  = "#E7298A")

plot_ly(
  scores,
  x = ~PC1,
  y = ~PC2,
  z = ~PC3,
  color = ~Class,
  colors = cores,
  type = "scatter3d",
  mode = "markers",
  marker = list(size = 8))