library(knitr)
library(DT)
library(tidyverse)
library(readxl)
library(pheatmap)
library(RColorBrewer)
library(plotly)
O estudo tem como objetivo caracterizar compostos orgânicos voláteis (COVs), presentes no fruto da lobeira, utilizando cromatografia gasosa acoplada à um espectrômetro de massas (GC-MS), com extração por headspace.
Foi utilizadoa uma amostra in natura, do fruto da lobeira, onde está amostra separanda entre casca e polpa. Após esse preparo, foram pesadas em vials de 10 mL aproximadamente 1,0 g em triplicata, a fim de verificar a reprodutibilidade, os frascos foram selados com o 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
## Sample class compostos_presentes
## 1 LOBEIRA_01_CASCA casca 23
## 2 LOBEIRA_01_POLPA polpa 14
## 3 LOBEIRA_02_CASCA casca 23
## 4 LOBEIRA_02_POLPA polpa 13
## 5 LOBEIRA_03_CASCA casca 17
## 6 LOBEIRA_03_POLPA polpa 14
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.
dados2 <- read_xlsx("dados_brutos_lobeira.xlsx")
datatable(
dados2 %>%
mutate_at(vars(starts_with("Área%")), ~ round(., 2)))
Foi realizada a contagem das classes químicas presentes em cada amostra. Embora a amostra Lobeira_03_casca tenha apresentado maior variação na quantidade de picos identificados, a classificação considerou o conjunto geral dos compostos.
dados_class <- read_xlsx("dados_classquimic.xlsx")
resultado <- dados_class %>%
select(`Fuction Organic`, LOBEIRA_01_CASCA, LOBEIRA_01_POLPA) %>%
pivot_longer(
cols = starts_with("LOBEIRA"),
names_to = "amostra",
values_to = "intensidade"
) %>%
filter(intensidade > 0) %>%
group_by(amostra, `Fuction Organic`) %>%
summarise(qtd = n(), .groups = "drop") %>%
pivot_wider(
names_from = amostra,
values_from = qtd,
values_fill = 0)
resultado
## # A tibble: 7 × 3
## `Fuction Organic` LOBEIRA_01_CASCA LOBEIRA_01_POLPA
## <chr> <int> <int>
## 1 Alcino 1 0
## 2 Aldeído 3 1
## 3 Furano 1 1
## 4 Sesquiterpenos 1 0
## 5 Álcool 2 3
## 6 Éster 13 7
## 7 Éter 2 2
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 <- dados2 %>%
mutate(
presente_casca = ifelse(`LOBEIRA_01_CASCA` > 0 | `LOBEIRA_02_CASCA` > 0 | `LOBEIRA_03_CASCA` > 0, TRUE, FALSE),
presente_polpa = ifelse(`LOBEIRA_01_POLPA` > 0 | `LOBEIRA_02_POLPA` > 0 | `LOBEIRA_03_POLPA` > 0, TRUE, FALSE),
categoria = case_when(
presente_casca & presente_polpa ~ "Ambos",
presente_casca & !presente_polpa ~ "Somente Casca",
!presente_casca & presente_polpa ~ "Somente Polpa",
TRUE ~ "Nenhum"
)
) %>%
select(compound, CAS, categoria)
datatable(tabela_compostos)
dados <- as.data.frame(dados)
matriz_bruta <- apply(dados[, 3:ncol(dados)], 2, as.numeric)
matriz_heatmap <- t(matriz_bruta)
colnames(matriz_heatmap) <- trimws(as.character(dados[[1]]))
vetor_classes <- trimws(tolower(as.character(dados[[2]])))
anotacao_topo <- data.frame(Grupo = vetor_classes)
rownames(anotacao_topo) <- colnames(matriz_heatmap)
paleta_metabolomica <- colorRampPalette(rev(brewer.pal(n = 7, name = "RdYlBu")))(100)
cores_grupos <- list(
Grupo = c("casca" = "#D95F02", "polpa" = "#1B9E77")
)
pheatmap(matriz_heatmap,
scale = "row",
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_pca <- apply(dados[, 3:ncol(dados)], 2, as.numeric)
pca_res <- prcomp(dados_pca, center = TRUE, scale. = TRUE)
variancia <- pca_res$sdev^2 / sum(pca_res$sdev^2)
pc1_var <- round(variancia[1] * 100, 1)
pc2_var <- round(variancia[2] * 100, 1)
df_scores <- as.data.frame(pca_res$x)
df_scores$Amostra <- dados[[1]]
df_scores$Classe <- trimws(tolower(as.character(dados[[2]])))
pca_plotly <- plot_ly(
data = df_scores,
x = ~PC1,
y = ~PC2,
color = ~Classe,
colors = c("casca" = "#D95F02", "polpa" = "#1B9E77"),
text = ~Amostra,
hoverinfo = "text+x+y",
type = "scatter",
mode = "markers",
marker = list(size = 12, line = list(color = 'rgba(0, 0, 0, 0.5)', width = 1))
) %>%
layout(
title = "PCA Interativo - Compostos Voláteis (Lobeira)",
xaxis = list(title = paste0("PC1 (", pc1_var, "%)"), zeroline = TRUE),
yaxis = list(title = paste0("PC2 (", pc2_var, "%)"), zeroline = TRUE))
pca_plotly