library(readxl)
library(knitr)
library(tidyverse)
library(DT)
library(pheatmap)
library(RColorBrewer)
library(plotly)
Este estudo tem como objetivo caracterizar os compostos orgânicos voláteis (COVs) presentes em amostras de manga das variedades Doce de Leite, Pequi e Espada, utilizando casca e polpa dos frutos como matrizes. A identificação dos COVs foi realizada por cromatografia gasosa acoplada a espectrometria de massas (GC-MS), com extração por headspace. Os compostos identificados foram comparados por meio de análises estatísticas univariadas e multivariadas, com o intuito de identificar compostos discriminantes entre as amostras.
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.
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.
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:
| 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 |
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
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_identificados_mangas.xlsx")
datatable(
dados_ident %>%
mutate_at(vars(starts_with("%")), ~ round(., 2)))
As amostras foram codificadas para facilitar o manuseio dos dados, da seguinte maneira:
| Nome | Código | caption |
|---|---|---|
| Manga doce de leite casca | MDLC | Codificação das amostras de manga |
| Manga doce de leite polpa | MDLP | Codificação das amostras de manga |
| Manga pequi casca | MPC | Codificação das amostras de manga |
| Manga pequi polpa | MPP | Codificação das amostras de manga |
| Manga espada casca | MEC | Codificação das amostras de manga |
| Manga espada polpa | MEP | Codificação das amostras de manga |
ler_tic <- function(arquivo, nome_amostra){
dados <- read.csv(
arquivo,
skip = 2,
header = FALSE )
colnames(dados) <- c("Tempo", "Intensidade")
dados$Amostra <- nome_amostra
return(dados)}
tic1 <- ler_tic("tic_front_MDC_01.csv", "MDLC")
tic2 <- ler_tic("tic_front_MDP_01.csv", "MDLP")
tic3 <- ler_tic("tic_front_MEC_01.csv", "MEC")
tic4 <- ler_tic("tic_front_MEP_01.csv", "MEP")
tic5 <- ler_tic("tic_front_MPP_01.csv", "MPP")
tic6 <- ler_tic("tic_front_MPC_01.csv", "MPC")
dados <- bind_rows(tic1, tic2, tic3, tic4, tic5, tic6)
ordem <- c("MDLC", "MDLP", "MEC", "MEP", "MPP", "MPC")
dados$Amostra <- factor(dados$Amostra, levels = ordem)
dados$y_pos <- as.numeric(dados$Amostra)
p <- plot_ly()
cores <- c(
"MDLC" = "#F8766D",
"MDLP" = "#7CAE00",
"MEC" = "#00BFC4",
"MEP" = "#C77CFF",
"MPP" = "blue",
"MPC" = "red" )
for(amostra in levels(dados$Amostra)){
temp <- dados %>%
filter(Amostra == amostra)
p <- p %>%
add_trace(
x = temp$Tempo,
y = temp$y_pos,
z = temp$Intensidade,
type = "scatter3d",
mode = "lines",
name = amostra,
line = list(
width = 3,
color = cores[amostra]))}
p <- p %>%
layout(
scene = list(
xaxis = list(
title = "Time (min)",
backgroundcolor = "white",
gridcolor = "lightgray"),
yaxis = list(
title = "",
tickvals = 1:6,
ticktext = levels(dados$Amostra),
backgroundcolor = "white",
gridcolor = "lightgray"),
zaxis = list(
title = "Peak intensity",
backgroundcolor = "white",
gridcolor = "lightgray"),
camera = list(
eye = list(
x = 1.8,
y = 1.6,
z = 0.8))),
paper_bgcolor = "white",
plot_bgcolor = "white" )
p
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_LEITE <- dados_ident %>%
filter(`MDLC_01` > 0 |
`MDLC_02` > 0 |
`MDLC_03` > 0 |
`MDLP_01` > 0 |
`MDLP_02` > 0 |
`MDLP_03` > 0 ) %>%
mutate(
presente_casca = ifelse(`MDLC_01` > 0 | `MDLC_02` > 0 | `MDLC_03` > 0, TRUE, FALSE),
presente_polpa = ifelse(`MDLP_01` > 0 | `MDLP_02` > 0 | `MDLP_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(Compund, Matriz)
datatable(tabela_compostos_DOCE_LEITE)
tabela_compostos_ESPADA <- dados_ident %>%
filter(`MDLC_01` > 0 |
`MEC_02` > 0 |
`MEC_03` > 0 |
`MEP_01` > 0 |
`MEP_02` > 0 |
`MEP_03` > 0 ) %>%
mutate(
presente_casca = ifelse(`MEC_01` > 0 | `MEC_02` > 0 | `MEC_03` > 0, TRUE, FALSE),
presente_polpa = ifelse(`MEP_01` > 0 | `MEP_02` > 0 | `MEP_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(Compund, Matriz)
datatable(tabela_compostos_ESPADA)
tabela_compostos_PEQUI <- dados_ident %>%
filter(`MPC_01` > 0 |
`MPC_02` > 0 |
`MPC_03` > 0 |
`MPP_01` > 0 |
`MPP_02` > 0 |
`MPP_03` > 0 ) %>%
mutate(
presente_casca = ifelse(`MPC_01` > 0 | `MPC_02` > 0 | `MPC_03` > 0, TRUE, FALSE),
presente_polpa = ifelse(`MPP_01` > 0 | `MPP_02` > 0 | `MPP_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(Compund, Matriz)
datatable(tabela_compostos_PEQUI)
## ℹ Using "','" as decimal and "'.'" as grouping mark. Use `read_delim()` for more control.
## Rows: 18 Columns: 43
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ";"
## chr (2): Sample, Class
## dbl (41): Ethyl Acetate, Acetic acid (0.875), Propanoic acid, ethyl ester (0...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## Colunas removidas por variância zero: 0
## Colunas para análise: 41
## Compostos significativos (FDR < 0.05): 37
## Coluna Encoding
## 1 Composto ASCII
## 2 p_value ASCII
## 3 FDR ASCII
## 4 Grupo_Maior_Abundancia ASCII
dadosest2 <- read.csv2("MATRIZ_MANGAS.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("dlp" = "#D95F02", "dlc" = "#1B9E77", "ep" = "red", "ec" = "#FFC99C", "pc" = "#86C6FF", "pp" = "pink"))
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")
dados_num <- dadosest2 %>%
select(-Sample, -Class)
dados_num <- dados_num[, apply(dados_num, 2, var) != 0]
pca_result <- prcomp(dados_num, center = TRUE, scale. = TRUE)
scores <- as.data.frame(pca_result$x)
scores$Sample <- dadosest2$Sample
scores$Class <- dadosest2$Class
var_exp <- round(summary(pca_result)$importance[2, ] * 100, 1)
p <- plot_ly(
data = scores,
x = ~PC1,
y = ~PC2,
color = ~Class,
text = ~Sample,
type = "scatter",
mode = "markers",
textposition = "top center",
marker = list(size = 10, opacity = 0.85),
hovertemplate = paste(
"%{text}",
"PC1: %{x:.2f}",
"PC2: %{y:.2f}",
"%{fullData.name}")) %>%
layout(
title = list(text = "PCA — Análise de Componentes Principais", font = list(size = 16)),
xaxis = list(title = paste0("PC1 (", var_exp[1], "%)"),
zeroline = TRUE, zerolinecolor = "#cccccc"),
yaxis = list(title = paste0("PC2 (", var_exp[2], "%)"),
zeroline = TRUE, zerolinecolor = "#cccccc"),
legend = list(title = list(text = "Classe")),
hovermode = "closest")
p