Skip to contents

🧬 Bioinformatics Workflows with evanverse

The evanverse package provides specialized tools for common bioinformatics workflows, including gene ID conversion, gene set analysis, pathway enrichment visualization, and biological data download utilities. This comprehensive guide demonstrates practical applications in genomics and systems biology.

🎯 Overview of Bioinformatics Functions

Core Bioinformatics Tools

Function Purpose Common Use Cases
convert_gene_id() Gene identifier conversion Symbol ↔︎ Ensembl, Entrez ↔︎ Symbol
download_gene_ref() Reference genome downloads Annotation files, gene models
gmt2df() GMT file to data frame Pathway analysis, gene set processing
gmt2list() GMT file to named list Enrichment analysis, functional annotation
download_geo_data() GEO data retrieval Public dataset analysis
plot_venn() Venn diagram analysis Gene set overlaps, differential expression
plot_forest() Forest plots Meta-analysis, effect sizes

🔄 Gene Identifier Conversion

Basic Gene ID Conversion

Gene identifier conversion is fundamental in bioinformatics for integrating datasets from different sources.

# Example gene symbols commonly used in cancer research
cancer_genes <- c("BRCA1", "BRCA2", "TP53", "EGFR", "MYC", "RAS", "PIK3CA", "AKT1")

# Convert gene symbols to Ensembl IDs
ensembl_ids <- convert_gene_id(
  genes = cancer_genes,
  from = "symbol",
  to = "ensembl",
  species = "human"
)

# Display conversion results
conversion_table <- data.frame(
  Gene_Symbol = cancer_genes,
  Ensembl_ID = ensembl_ids
)

print(conversion_table)
# Mock example for demonstration (since biomaRt requires internet)
cancer_genes <- c("BRCA1", "BRCA2", "TP53", "EGFR", "MYC", "KRAS", "PIK3CA", "AKT1")

# Simulated conversion results
mock_conversion <- data.frame(
  Gene_Symbol = cancer_genes,
  Ensembl_ID = c(
    "ENSG00000012048", "ENSG00000139618", "ENSG00000141510",
    "ENSG00000146648", "ENSG00000136997", "ENSG00000133703",
    "ENSG00000171608", "ENSG00000142208"
  ),
  Entrez_ID = c(672, 675, 7157, 1956, 4609, 3845, 5290, 207),
  stringsAsFactors = FALSE
)

cat("🧬 Gene ID Conversion Example\n")
#> 🧬 Gene ID Conversion Example
cat("=============================\n")
#> =============================
print(mock_conversion)
#>   Gene_Symbol      Ensembl_ID Entrez_ID
#> 1       BRCA1 ENSG00000012048       672
#> 2       BRCA2 ENSG00000139618       675
#> 3        TP53 ENSG00000141510      7157
#> 4        EGFR ENSG00000146648      1956
#> 5         MYC ENSG00000136997      4609
#> 6        KRAS ENSG00000133703      3845
#> 7      PIK3CA ENSG00000171608      5290
#> 8        AKT1 ENSG00000142208       207

cat("\n📊 Conversion Summary:\n")
#> 
#> 📊 Conversion Summary:
cat("  • Input genes:", length(cancer_genes), "\n")
#>   • Input genes: 8
cat("  • Successful conversions:", nrow(mock_conversion), "\n")
#>   • Successful conversions: 8
cat("  • Success rate:", round(100 * nrow(mock_conversion) / length(cancer_genes), 1), "%\n")
#>   • Success rate: 100 %

Advanced Conversion Workflows

# Simulate a real-world scenario with mixed identifier types
mixed_identifiers <- c(
  "BRCA1", "ENSG00000139618", "7157", "EGFR",
  "ENSG00000136997", "3845", "PIK3CA", "207"
)

# Function to detect identifier type
detect_id_type <- function(ids) {
  sapply(ids, function(id) {
    if (grepl("^ENSG", id)) return("ensembl")
    if (grepl("^[0-9]+$", id)) return("entrez")
    return("symbol")
  })
}

id_types <- detect_id_type(mixed_identifiers)
cat("🔍 Identifier Type Detection:\n")
#> 🔍 Identifier Type Detection:
print(data.frame(
  Identifier = mixed_identifiers,
  Detected_Type = id_types
))
#>                      Identifier Detected_Type
#> BRCA1                     BRCA1        symbol
#> ENSG00000139618 ENSG00000139618       ensembl
#> 7157                       7157        entrez
#> EGFR                       EGFR        symbol
#> ENSG00000136997 ENSG00000136997       ensembl
#> 3845                       3845        entrez
#> PIK3CA                   PIK3CA        symbol
#> 207                         207        entrez

# Group by identifier type for batch conversion
id_groups <- split(mixed_identifiers, id_types)
cat("\n📦 Grouped Identifiers for Conversion:\n")
#> 
#> 📦 Grouped Identifiers for Conversion:
str(id_groups)
#> List of 3
#>  $ ensembl: chr [1:2] "ENSG00000139618" "ENSG00000136997"
#>  $ entrez : chr [1:3] "7157" "3845" "207"
#>  $ symbol : chr [1:3] "BRCA1" "EGFR" "PIK3CA"

📊 Gene Set Analysis with GMT Files

Processing GMT Files

GMT (Gene Matrix Transposed) files are standard formats for gene set collections used in pathway analysis.

# Example: Process a pathway GMT file
# pathway_df <- gmt2df("path/to/c2.cp.kegg.v7.4.symbols.gmt")
# pathway_list <- gmt2list("path/to/c2.cp.kegg.v7.4.symbols.gmt")

# Display structure
# head(pathway_df, 10)
# length(pathway_list)
# Create mock GMT data to demonstrate structure
mock_pathways <- list(
  "KEGG_GLYCOLYSIS_GLUCONEOGENESIS" = c(
    "HK1", "HK2", "GPI", "PFKL", "ALDOA", "TPI1", "GAPDH",
    "PGK1", "PGAM1", "ENO1", "PKM", "LDHA", "PDK1"
  ),
  "KEGG_CITRATE_CYCLE" = c(
    "CS", "ACO1", "IDH1", "OGDH", "SUCLA2", "SDHA",
    "FH", "MDH1", "PCK1", "PDK1", "DLAT"
  ),
  "KEGG_FATTY_ACID_SYNTHESIS" = c(
    "ACACA", "FASN", "ACLY", "ACC2", "ELOVL6", "SCD",
    "FADS1", "FADS2", "ACSL1", "GPAM"
  ),
  "KEGG_DNA_REPAIR" = c(
    "BRCA1", "BRCA2", "TP53", "ATM", "CHEK1", "CHEK2",
    "RAD51", "XRCC1", "PARP1", "MSH2", "MLH1"
  )
)

# Convert list to data frame format (simulating gmt2df output)
mock_gmt_df <- do.call(rbind, lapply(names(mock_pathways), function(pathway) {
  data.frame(
    pathway = pathway,
    gene = mock_pathways[[pathway]],
    stringsAsFactors = FALSE
  )
}))

cat("📋 GMT File Processing Results\n")
#> 📋 GMT File Processing Results
cat("==============================\n")
#> ==============================
cat("Number of pathways:", length(mock_pathways), "\n")
#> Number of pathways: 4
cat("Total gene-pathway associations:", nrow(mock_gmt_df), "\n")
#> Total gene-pathway associations: 45
cat("Average genes per pathway:", round(mean(lengths(mock_pathways)), 1), "\n\n")
#> Average genes per pathway: 11.2

cat("Sample pathway data frame:\n")
#> Sample pathway data frame:
print(head(mock_gmt_df, 12))
#>                            pathway  gene
#> 1  KEGG_GLYCOLYSIS_GLUCONEOGENESIS   HK1
#> 2  KEGG_GLYCOLYSIS_GLUCONEOGENESIS   HK2
#> 3  KEGG_GLYCOLYSIS_GLUCONEOGENESIS   GPI
#> 4  KEGG_GLYCOLYSIS_GLUCONEOGENESIS  PFKL
#> 5  KEGG_GLYCOLYSIS_GLUCONEOGENESIS ALDOA
#> 6  KEGG_GLYCOLYSIS_GLUCONEOGENESIS  TPI1
#> 7  KEGG_GLYCOLYSIS_GLUCONEOGENESIS GAPDH
#> 8  KEGG_GLYCOLYSIS_GLUCONEOGENESIS  PGK1
#> 9  KEGG_GLYCOLYSIS_GLUCONEOGENESIS PGAM1
#> 10 KEGG_GLYCOLYSIS_GLUCONEOGENESIS  ENO1
#> 11 KEGG_GLYCOLYSIS_GLUCONEOGENESIS   PKM
#> 12 KEGG_GLYCOLYSIS_GLUCONEOGENESIS  LDHA

# Pathway size distribution
pathway_sizes <- lengths(mock_pathways)
cat("\n📊 Pathway Size Distribution:\n")
#> 
#> 📊 Pathway Size Distribution:
print(data.frame(
  Pathway = names(pathway_sizes),
  Gene_Count = pathway_sizes
))
#>                                                         Pathway Gene_Count
#> KEGG_GLYCOLYSIS_GLUCONEOGENESIS KEGG_GLYCOLYSIS_GLUCONEOGENESIS         13
#> KEGG_CITRATE_CYCLE                           KEGG_CITRATE_CYCLE         11
#> KEGG_FATTY_ACID_SYNTHESIS             KEGG_FATTY_ACID_SYNTHESIS         10
#> KEGG_DNA_REPAIR                                 KEGG_DNA_REPAIR         11

Gene Set Overlap Analysis

# Analyze overlaps between pathways
pathway_genes <- mock_pathways[1:3]  # Use first 3 pathways for Venn diagram

# Create Venn diagram for pathway overlaps
venn_plot <- plot_venn(
  set1 = pathway_genes[[1]],
  set2 = pathway_genes[[2]],
  set3 = pathway_genes[[3]],
  category.names = names(pathway_genes),
  fill = get_palette("vividset", type = "qualitative", n = 3),
  title = "Metabolic Pathway Gene Overlaps"
)
#>  Loaded palette "vividset" ("qualitative"), 9 colors
#> Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
#>  Please use `linewidth` instead.
#>  The deprecated feature was likely used in the ggvenn package.
#>   Please report the issue to the authors.
#> This warning is displayed once every 8 hours.
#> Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
#> generated.
Gene set overlap analysis showing relationships between biological pathways

Gene set overlap analysis showing relationships between biological pathways


print(venn_plot)
Gene set overlap analysis showing relationships between biological pathways

Gene set overlap analysis showing relationships between biological pathways


# Calculate detailed overlap statistics
all_genes <- unique(unlist(pathway_genes))
cat("\n🔍 Detailed Overlap Analysis:\n")
#> 
#> 🔍 Detailed Overlap Analysis:
cat("===============================\n")
#> ===============================
cat("Total unique genes across pathways:", length(all_genes), "\n")
#> Total unique genes across pathways: 33

# Pairwise overlaps
pathway_names <- names(pathway_genes)
for (i in 1:(length(pathway_names) - 1)) {
  for (j in (i + 1):length(pathway_names)) {
    overlap <- length(intersect(pathway_genes[[i]], pathway_genes[[j]]))
    cat(sprintf("%s ∩ %s: %d genes\n",
                gsub("KEGG_", "", pathway_names[i]),
                gsub("KEGG_", "", pathway_names[j]),
                overlap))
  }
}
#> GLYCOLYSIS_GLUCONEOGENESIS ∩ CITRATE_CYCLE: 1 genes
#> GLYCOLYSIS_GLUCONEOGENESIS ∩ FATTY_ACID_SYNTHESIS: 0 genes
#> CITRATE_CYCLE ∩ FATTY_ACID_SYNTHESIS: 0 genes

🎯 Differential Expression Analysis Workflow

Simulated RNA-seq Analysis

# Simulate RNA-seq differential expression results
set.seed(123)
n_genes <- 2000

# Simulate log fold changes and p-values
gene_results <- data.frame(
  Gene = paste0("Gene_", 1:n_genes),
  LogFC = rnorm(n_genes, mean = 0, sd = 1.2),
  PValue = rbeta(n_genes, shape1 = 1, shape2 = 10),
  stringsAsFactors = FALSE
)

# Add some significant genes
significant_indices <- sample(1:n_genes, 200)
gene_results$LogFC[significant_indices] <- gene_results$LogFC[significant_indices] +
  sample(c(-2, 2), 200, replace = TRUE)
gene_results$PValue[significant_indices] <- gene_results$PValue[significant_indices] * 0.01

# Calculate adjusted p-values
gene_results$FDR <- p.adjust(gene_results$PValue, method = "BH")

# Classify genes
gene_results$Regulation <- "Not Significant"
gene_results$Regulation[gene_results$FDR < 0.05 & gene_results$LogFC > 1] <- "Up-regulated"
gene_results$Regulation[gene_results$FDR < 0.05 & gene_results$LogFC < -1] <- "Down-regulated"

# Create volcano plot
volcano_colors <- c(
  "Up-regulated" = get_palette("vividset", type = "qualitative", n = 3)[1],
  "Down-regulated" = get_palette("vividset", type = "qualitative", n = 3)[2],
  "Not Significant" = "#CCCCCC"
)
#>  Loaded palette "vividset" ("qualitative"), 9 colors
#>  Loaded palette "vividset" ("qualitative"), 9 colors

p1 <- ggplot(gene_results, aes(x = LogFC, y = -log10(FDR), color = Regulation)) +
  geom_point(alpha = 0.6, size = 1.2) +
  scale_color_manual(values = volcano_colors) +
  geom_vline(xintercept = c(-1, 1), linetype = "dashed", color = "#666666") +
  geom_hline(yintercept = -log10(0.05), linetype = "dashed", color = "#666666") +
  labs(
    title = "Differential Gene Expression Analysis",
    subtitle = "Volcano plot showing treatment vs. control comparison",
    x = "Log₂ Fold Change",
    y = "-log₁₀(FDR-adjusted p-value)",
    color = "Regulation"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold", color = "#0D47A1"),
    plot.subtitle = element_text(size = 11, color = "#666666"),
    legend.position = "bottom"
  )

print(p1)
Differential expression analysis visualization with volcano plot

Differential expression analysis visualization with volcano plot


# Summary statistics
regulation_summary <- table(gene_results$Regulation)
cat("\n📊 Differential Expression Summary:\n")
#> 
#> 📊 Differential Expression Summary:
cat("===================================\n")
#> ===================================
print(regulation_summary)
#> 
#>  Down-regulated Not Significant    Up-regulated 
#>             113            1777             110

cat("\nTop 10 up-regulated genes (by fold change):\n")
#> 
#> Top 10 up-regulated genes (by fold change):
top_up <- gene_results[gene_results$Regulation == "Up-regulated", ] %>%
  arrange(desc(LogFC)) %>%
  head(10)
print(top_up[, c("Gene", "LogFC", "FDR")])
#>         Gene    LogFC         FDR
#> 1  Gene_1911 4.937598 0.018718628
#> 2   Gene_948 4.408017 0.009956437
#> 3   Gene_477 4.054766 0.013037421
#> 4   Gene_343 4.005266 0.016821175
#> 5   Gene_489 3.952257 0.017546948
#> 6  Gene_1189 3.727714 0.009956437
#> 7   Gene_202 3.574896 0.012378355
#> 8   Gene_264 3.560238 0.010369230
#> 9  Gene_1926 3.551683 0.016873989
#> 10 Gene_1255 3.549588 0.009735872

Pathway Enrichment Analysis

# Simulate pathway enrichment analysis results
enrichment_results <- data.frame(
  Pathway = c(
    "Cell Cycle", "Apoptosis", "DNA Repair", "Inflammation",
    "Metabolism", "Signaling", "Transport", "Development"
  ),
  GeneRatio = c(0.15, 0.22, 0.18, 0.31, 0.09, 0.25, 0.12, 0.08),
  FDR = c(0.001, 0.003, 0.008, 0.0001, 0.045, 0.002, 0.021, 0.089),
  GeneCount = c(23, 34, 28, 48, 14, 39, 18, 12),
  stringsAsFactors = FALSE
)

# Calculate enrichment score
enrichment_results$EnrichmentScore <- -log10(enrichment_results$FDR)

# Create enrichment plot
p2 <- ggplot(enrichment_results, aes(x = GeneRatio, y = reorder(Pathway, EnrichmentScore))) +
  geom_point(aes(color = EnrichmentScore, size = GeneCount), alpha = 0.8) +
  scale_color_gradientn(
    colors = get_palette("warm_blush", type = "sequential", n = 4),
    name = "-log₁₀(FDR)"
  ) +
  scale_size_continuous(name = "Gene Count", range = c(3, 12)) +
  geom_vline(xintercept = 0.1, linetype = "dashed", color = "#666666", alpha = 0.7) +
  labs(
    title = "Pathway Enrichment Analysis",
    subtitle = "Biological processes enriched in differentially expressed genes",
    x = "Gene Ratio (enriched genes / pathway total)",
    y = "Biological Pathway"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold", color = "#0D47A1"),
    plot.subtitle = element_text(size = 11, color = "#666666"),
    panel.grid.major.y = element_blank(),
    legend.position = "right"
  )
#>  Loaded palette "warm_blush" ("sequential"), 4 colors

print(p2)
Pathway enrichment analysis showing biological processes affected by treatment

Pathway enrichment analysis showing biological processes affected by treatment


cat("\n🎯 Pathway Enrichment Summary:\n")
#> 
#> 🎯 Pathway Enrichment Summary:
cat("==============================\n")
#> ==============================
significant_pathways <- enrichment_results[enrichment_results$FDR < 0.05, ]
cat("Significant pathways (FDR < 0.05):", nrow(significant_pathways), "\n")
#> Significant pathways (FDR < 0.05): 7
cat("Most enriched pathway:", significant_pathways$Pathway[which.max(significant_pathways$EnrichmentScore)], "\n")
#> Most enriched pathway: Inflammation
cat("Total genes in significant pathways:", sum(significant_pathways$GeneCount), "\n")
#> Total genes in significant pathways: 204

🌐 Multi-omics Integration

Combining Genomics and Transcriptomics

# Simulate multi-omics data integration
set.seed(456)
selected_genes <- c("BRCA1", "TP53", "EGFR", "MYC", "KRAS", "PIK3CA", "AKT1", "PTEN")

# Create integrated omics data
omics_data <- data.frame(
  Gene = rep(selected_genes, each = 3),
  DataType = rep(c("Mutation", "CNV", "Expression"), length(selected_genes)),
  Value = c(
    # Mutation frequencies (0-1)
    c(0.12, 0.34, 0.08, 0.15, 0.22, 0.09, 0.06, 0.18),
    # Copy number variations (-2 to 2)
    c(-0.5, -1.2, 1.8, 0.3, 0.8, -0.8, 1.1, -1.5),
    # Expression fold changes (-3 to 3)
    c(-1.5, -2.8, 2.1, 1.8, -1.2, 2.3, -0.8, -2.1)
  ),
  Patient_Group = rep(c("Group_A", "Group_B", "Group_C"), length(selected_genes))
)

# Normalize values for visualization
omics_data$Normalized_Value <- ave(omics_data$Value, omics_data$DataType,
                                   FUN = function(x) scale(x)[,1])

# Create heatmap
p3 <- ggplot(omics_data, aes(x = DataType, y = Gene, fill = Normalized_Value)) +
  geom_tile(color = "white", size = 0.5) +
  scale_fill_gradientn(
    colors = get_palette("gradient_rd_bu", type = "diverging", n = 11),
    name = "Z-score",
    limits = c(-2, 2),
    breaks = c(-2, -1, 0, 1, 2)
  ) +
  labs(
    title = "Multi-omics Cancer Gene Analysis",
    subtitle = "Integrated view of mutations, copy number, and expression",
    x = "Data Type",
    y = "Cancer-related Genes"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold", color = "#0D47A1"),
    plot.subtitle = element_text(size = 11, color = "#666666"),
    panel.grid = element_blank(),
    axis.text.x = element_text(angle = 45, hjust = 1)
  )
#>  Loaded palette "gradient_rd_bu" ("diverging"), 11 colors

print(p3)
Multi-omics data integration showing genomic variants and expression changes

Multi-omics data integration showing genomic variants and expression changes


# Summary by data type
cat("\n🧬 Multi-omics Data Summary:\n")
#> 
#> 🧬 Multi-omics Data Summary:
cat("============================\n")
#> ============================
summary_stats <- omics_data %>%
  group_by(DataType) %>%
  summarise(
    Mean_Value = round(mean(Value), 3),
    SD_Value = round(sd(Value), 3),
    Min_Value = round(min(Value), 3),
    Max_Value = round(max(Value), 3),
    .groups = 'drop'
  )
print(summary_stats)
#> # A tibble: 3 × 5
#>   DataType   Mean_Value SD_Value Min_Value Max_Value
#>   <chr>           <dbl>    <dbl>     <dbl>     <dbl>
#> 1 CNV             0.155     1.20      -1.5       1.8
#> 2 Expression     -0.629     1.31      -2.8       1.1
#> 3 Mutation        0.354     1.37      -1.5       2.3

📈 Survival Analysis Visualization

Forest Plot for Hazard Ratios

# Simulate survival analysis results
survival_data <- data.frame(
  Gene = c("BRCA1", "BRCA2", "TP53", "EGFR", "MYC", "KRAS", "PIK3CA", "AKT1"),
  HazardRatio = c(1.23, 0.87, 1.45, 1.12, 0.92, 1.67, 1.34, 0.78),
  CI_Lower = c(0.98, 0.71, 1.18, 0.89, 0.75, 1.32, 1.05, 0.61),
  CI_Upper = c(1.55, 1.07, 1.78, 1.41, 1.13, 2.11, 1.71, 0.99),
  PValue = c(0.067, 0.189, 0.001, 0.324, 0.445, 0.0001, 0.018, 0.041),
  stringsAsFactors = FALSE
)

# Add significance categories
survival_data$Significance <- ifelse(survival_data$PValue < 0.001, "***",
                            ifelse(survival_data$PValue < 0.01, "**",
                            ifelse(survival_data$PValue < 0.05, "*", "ns")))

# Create forest plot using evanverse plotting functions
p4 <- plot_forest(
  data = survival_data,
  label_col = "Gene",
  estimate_col = "HazardRatio",
  lower_col = "CI_Lower",
  upper_col = "CI_Upper",
  p_col = "PValue"
)

print(p4)
Forest plot showing hazard ratios for genetic markers in survival analysis

Forest plot showing hazard ratios for genetic markers in survival analysis


cat("\n🎯 Survival Analysis Summary:\n")
#> 
#> 🎯 Survival Analysis Summary:
cat("=============================\n")
#> =============================
significant_genes <- survival_data[survival_data$PValue < 0.05, ]
cat("Significant prognostic markers:", nrow(significant_genes), "\n")
#> Significant prognostic markers: 4
cat("Risk factors (HR > 1):", sum(significant_genes$HazardRatio > 1), "\n")
#> Risk factors (HR > 1): 3
cat("Protective factors (HR < 1):", sum(significant_genes$HazardRatio < 1), "\n")
#> Protective factors (HR < 1): 1

print(significant_genes[, c("Gene", "HazardRatio", "PValue", "Significance")])
#>     Gene HazardRatio PValue Significance
#> 3   TP53        1.45 0.0010           **
#> 6   KRAS        1.67 0.0001          ***
#> 7 PIK3CA        1.34 0.0180            *
#> 8   AKT1        0.78 0.0410            *

🔬 Clinical Data Integration

Biomarker Discovery Pipeline

# Simulate clinical biomarker data
set.seed(789)
n_patients <- 120
n_biomarkers <- 20

# Generate patient clinical data
clinical_data <- data.frame(
  Patient_ID = paste0("P", 1:n_patients),
  Subtype = sample(c("Luminal_A", "Luminal_B", "HER2+", "TNBC"), n_patients,
                   replace = TRUE, prob = c(0.4, 0.2, 0.15, 0.25)),
  Stage = sample(c("I", "II", "III", "IV"), n_patients,
                 replace = TRUE, prob = c(0.3, 0.35, 0.25, 0.1)),
  Age = round(rnorm(n_patients, 55, 12)),
  Survival_Months = round(rexp(n_patients, rate = 0.02)),
  stringsAsFactors = FALSE
)

# Generate biomarker expression data
biomarker_genes <- paste0("Biomarker_", 1:n_biomarkers)
expression_data <- matrix(rnorm(n_patients * n_biomarkers, mean = 5, sd = 2),
                         nrow = n_patients, ncol = n_biomarkers)
colnames(expression_data) <- biomarker_genes
rownames(expression_data) <- clinical_data$Patient_ID

# Add subtype-specific expression patterns
luminal_a_patients <- clinical_data$Patient_ID[clinical_data$Subtype == "Luminal_A"]
her2_patients <- clinical_data$Patient_ID[clinical_data$Subtype == "HER2+"]
tnbc_patients <- clinical_data$Patient_ID[clinical_data$Subtype == "TNBC"]

# Simulate subtype-specific biomarkers
expression_data[luminal_a_patients, "Biomarker_1"] <-
  expression_data[luminal_a_patients, "Biomarker_1"] + 3

expression_data[her2_patients, "Biomarker_5"] <-
  expression_data[her2_patients, "Biomarker_5"] + 4

expression_data[tnbc_patients, "Biomarker_12"] <-
  expression_data[tnbc_patients, "Biomarker_12"] + 2.5

# Convert to long format for visualization
expression_long <- as.data.frame(expression_data) %>%
  mutate(Patient_ID = rownames(.)) %>%
  gather(Biomarker, Expression, -Patient_ID) %>%
  left_join(clinical_data, by = "Patient_ID")

# Select top biomarkers for visualization
top_biomarkers <- c("Biomarker_1", "Biomarker_5", "Biomarker_12", "Biomarker_8")
plot_data <- expression_long %>%
  filter(Biomarker %in% top_biomarkers)

# Create biomarker expression plot
p5 <- ggplot(plot_data, aes(x = Subtype, y = Expression, fill = Subtype)) +
  geom_boxplot(alpha = 0.7, outlier.alpha = 0.5) +
  geom_jitter(alpha = 0.3, width = 0.2, size = 0.8) +
  scale_fill_manual(
    values = get_palette("vividset", type = "qualitative", n = 4)
  ) +
  facet_wrap(~Biomarker, scales = "free_y", ncol = 2) +
  labs(
    title = "Biomarker Expression Across Cancer Subtypes",
    subtitle = "Potential subtype-specific biomarkers for precision medicine",
    x = "Cancer Subtype",
    y = "Expression Level (log2 normalized)",
    fill = "Subtype"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold", color = "#0D47A1"),
    plot.subtitle = element_text(size = 11, color = "#666666"),
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "bottom",
    strip.background = element_rect(fill = "#E3F2FD", color = NA)
  )
#>  Loaded palette "vividset" ("qualitative"), 9 colors

print(p5)
Biomarker discovery showing gene expression patterns across clinical subtypes

Biomarker discovery showing gene expression patterns across clinical subtypes


# Statistical summary
cat("\n📊 Biomarker Analysis Summary:\n")
#> 
#> 📊 Biomarker Analysis Summary:
cat("==============================\n")
#> ==============================
subtype_counts <- table(clinical_data$Subtype)
print(subtype_counts)
#> 
#>     HER2+ Luminal_A Luminal_B      TNBC 
#>        12        51        26        31

cat("\nMean expression by subtype for key biomarkers:\n")
#> 
#> Mean expression by subtype for key biomarkers:
biomarker_summary <- plot_data %>%
  group_by(Biomarker, Subtype) %>%
  summarise(
    Mean_Expression = round(mean(Expression), 2),
    SD = round(sd(Expression), 2),
    .groups = 'drop'
  ) %>%
  arrange(Biomarker, desc(Mean_Expression))

print(biomarker_summary)
#> # A tibble: 16 × 4
#>    Biomarker    Subtype   Mean_Expression    SD
#>    <chr>        <chr>               <dbl> <dbl>
#>  1 Biomarker_1  Luminal_A            7.76  2.29
#>  2 Biomarker_1  HER2+                5.23  2.44
#>  3 Biomarker_1  Luminal_B            4.84  2.02
#>  4 Biomarker_1  TNBC                 4.54  1.84
#>  5 Biomarker_12 TNBC                 6.88  2.01
#>  6 Biomarker_12 Luminal_A            5.55  1.87
#>  7 Biomarker_12 Luminal_B            4.97  1.77
#>  8 Biomarker_12 HER2+                4.33  1.85
#>  9 Biomarker_5  HER2+                9.58  1.74
#> 10 Biomarker_5  Luminal_B            5.36  2.34
#> 11 Biomarker_5  Luminal_A            5.11  1.85
#> 12 Biomarker_5  TNBC                 4.98  2.37
#> 13 Biomarker_8  Luminal_B            5.23  1.74
#> 14 Biomarker_8  TNBC                 5.22  2.03
#> 15 Biomarker_8  Luminal_A            5.08  2.05
#> 16 Biomarker_8  HER2+                4.45  1.93

🛠️ Data Download and Management

Public Dataset Retrieval

# Example of downloading reference data
# Note: These functions require internet connection and may take time

# Download gene reference annotation
gene_ref <- download_gene_ref(
  species = "human",
  build = "hg38",
  feature_type = "gene"
)

# Download GEO dataset
geo_data <- download_geo_data(
  geo_id = "GSE123456",
  destdir = "data/geo_downloads"
)

# Download pathway databases
pathway_url <- "https://data.broadinstitute.org/gsea-msigdb/msigdb/release/7.4/c2.cp.kegg.v7.4.symbols.gmt"
download_url(
  url = pathway_url,
  dest = "data/pathways/kegg_pathways.gmt"
)
# Demonstrate file organization for bioinformatics projects
cat("📁 Recommended Project Structure for Bioinformatics:\n")
#> 📁 Recommended Project Structure for Bioinformatics:
cat("==================================================\n")
#> ==================================================
cat("project/\n")
#> project/
cat("├── data/\n")
#> ├── data/
cat("│   ├── raw/                 # Original data files\n")
#> │   ├── raw/                 # Original data files
cat("│   ├── processed/           # Cleaned/normalized data\n")
#> │   ├── processed/           # Cleaned/normalized data
cat("│   ├── reference/           # Genome annotations, databases\n")
#> │   ├── reference/           # Genome annotations, databases
cat("│   └── results/             # Analysis outputs\n")
#> │   └── results/             # Analysis outputs
cat("├── scripts/\n")
#> ├── scripts/
cat("│   ├── preprocessing/       # Data cleaning scripts\n")
#> │   ├── preprocessing/       # Data cleaning scripts
cat("│   ├── analysis/            # Statistical analysis\n")
#> │   ├── analysis/            # Statistical analysis
cat("│   └── visualization/       # Plotting scripts\n")
#> │   └── visualization/       # Plotting scripts
cat("├── docs/                    # Documentation, protocols\n")
#> ├── docs/                    # Documentation, protocols
cat("└── reports/                 # Final reports, publications\n\n")
#> └── reports/                 # Final reports, publications

# Demonstrate batch file handling
file_extensions <- c("fastq.gz", "bam", "vcf", "gmt", "gff3", "bed")
file_descriptions <- c(
  "Raw sequencing reads",
  "Aligned sequencing data",
  "Variant calls",
  "Gene set definitions",
  "Gene annotations",
  "Genomic intervals"
)

file_info <- data.frame(
  Extension = file_extensions,
  Description = file_descriptions,
  stringsAsFactors = FALSE
)

cat("🗂️ Common Bioinformatics File Types:\n")
#> 🗂️ Common Bioinformatics File Types:
print(file_info)
#>   Extension             Description
#> 1  fastq.gz    Raw sequencing reads
#> 2       bam Aligned sequencing data
#> 3       vcf           Variant calls
#> 4       gmt    Gene set definitions
#> 5      gff3        Gene annotations
#> 6       bed       Genomic intervals

🎯 Best Practices for Bioinformatics Workflows

Reproducible Analysis Guidelines

cat("🔬 BIOINFORMATICS BEST PRACTICES\n")
#> 🔬 BIOINFORMATICS BEST PRACTICES
cat("================================\n\n")
#> ================================

cat("📋 Data Management:\n")
#> 📋 Data Management:
cat("  • Use version control (Git) for all scripts\n")
#>   • Use version control (Git) for all scripts
cat("  • Document data provenance and processing steps\n")
#>   • Document data provenance and processing steps
cat("  • Implement checkpoints and intermediate file saves\n")
#>   • Implement checkpoints and intermediate file saves
cat("  • Use consistent file naming conventions\n\n")
#>   • Use consistent file naming conventions

cat("🧬 Gene Identifier Handling:\n")
#> 🧬 Gene Identifier Handling:
cat("  • Always validate gene ID conversions\n")
#>   • Always validate gene ID conversions
cat("  • Store original identifiers alongside converted ones\n")
#>   • Store original identifiers alongside converted ones
cat("  • Document the genome build and annotation version\n")
#>   • Document the genome build and annotation version
cat("  • Handle missing/ambiguous identifiers gracefully\n\n")
#>   • Handle missing/ambiguous identifiers gracefully

cat("📊 Statistical Analysis:\n")
#> 📊 Statistical Analysis:
cat("  • Apply appropriate multiple testing corrections\n")
#>   • Apply appropriate multiple testing corrections
cat("  • Set significance thresholds before analysis\n")
#>   • Set significance thresholds before analysis
cat("  • Report effect sizes along with p-values\n")
#>   • Report effect sizes along with p-values
cat("  • Validate results with independent datasets when possible\n\n")
#>   • Validate results with independent datasets when possible

cat("🎨 Visualization Guidelines:\n")
#> 🎨 Visualization Guidelines:
cat("  • Use color-blind friendly palettes\n")
#>   • Use color-blind friendly palettes
cat("  • Include appropriate scales and legends\n")
#>   • Include appropriate scales and legends
cat("  • Provide clear titles and axis labels\n")
#>   • Provide clear titles and axis labels
cat("  • Consider publication requirements for figures\n")
#>   • Consider publication requirements for figures

Quality Control Checklist

cat("✅ QUALITY CONTROL CHECKLIST\n")
#> ✅ QUALITY CONTROL CHECKLIST
cat("============================\n\n")
#> ============================

cat("🔍 Data Quality:\n")
#> 🔍 Data Quality:
cat("  [ ] Check for missing values and outliers\n")
#>   [ ] Check for missing values and outliers
cat("  [ ] Verify sample sizes and statistical power\n")
#>   [ ] Verify sample sizes and statistical power
cat("  [ ] Validate gene identifier mappings\n")
#>   [ ] Validate gene identifier mappings
cat("  [ ] Assess data distribution and normalization\n\n")
#>   [ ] Assess data distribution and normalization

cat("📈 Analysis Validation:\n")
#> 📈 Analysis Validation:
cat("  [ ] Cross-validate results with different methods\n")
#>   [ ] Cross-validate results with different methods
cat("  [ ] Perform sensitivity analyses\n")
#>   [ ] Perform sensitivity analyses
cat("  [ ] Check for batch effects and confounders\n")
#>   [ ] Check for batch effects and confounders
cat("  [ ] Compare with known biological expectations\n\n")
#>   [ ] Compare with known biological expectations

cat("📊 Results Reporting:\n")
#> 📊 Results Reporting:
cat("  [ ] Include sample sizes and effect sizes\n")
#>   [ ] Include sample sizes and effect sizes
cat("  [ ] Report confidence intervals\n")
#>   [ ] Report confidence intervals
cat("  [ ] Document software versions and parameters\n")
#>   [ ] Document software versions and parameters
cat("  [ ] Provide supplementary data and code\n")
#>   [ ] Provide supplementary data and code

🚀 Advanced Workflow Examples

Complete Analysis Pipeline

cat("🔄 COMPLETE BIOINFORMATICS PIPELINE EXAMPLE\n")
#> 🔄 COMPLETE BIOINFORMATICS PIPELINE EXAMPLE
cat("===========================================\n\n")
#> ===========================================

# Simulate a complete analysis workflow
pipeline_steps <- data.frame(
  Step = 1:8,
  Process = c(
    "Data Import & Quality Control",
    "Gene ID Conversion & Mapping",
    "Differential Expression Analysis",
    "Multiple Testing Correction",
    "Pathway Enrichment Analysis",
    "Gene Set Overlap Analysis",
    "Visualization & Plotting",
    "Results Export & Reporting"
  ),
  evanverse_Functions = c(
    "read_table_flex(), file_info()",
    "convert_gene_id(), replace_void()",
    "User analysis + evanverse utilities",
    "Built-in R functions",
    "gmt2df(), gmt2list()",
    "plot_venn(), combine_logic()",
    "plot_forest(), get_palette()",
    "write_xlsx_flex(), remind()"
  ),
  Estimated_Time = c("5-10 min", "10-15 min", "30-60 min", "5 min",
                     "15-30 min", "10-20 min", "20-40 min", "10-15 min")
)

print(pipeline_steps)
#>   Step                          Process                 evanverse_Functions
#> 1    1    Data Import & Quality Control      read_table_flex(), file_info()
#> 2    2     Gene ID Conversion & Mapping   convert_gene_id(), replace_void()
#> 3    3 Differential Expression Analysis User analysis + evanverse utilities
#> 4    4      Multiple Testing Correction                Built-in R functions
#> 5    5      Pathway Enrichment Analysis                gmt2df(), gmt2list()
#> 6    6        Gene Set Overlap Analysis        plot_venn(), combine_logic()
#> 7    7         Visualization & Plotting        plot_forest(), get_palette()
#> 8    8       Results Export & Reporting         write_xlsx_flex(), remind()
#>   Estimated_Time
#> 1       5-10 min
#> 2      10-15 min
#> 3      30-60 min
#> 4          5 min
#> 5      15-30 min
#> 6      10-20 min
#> 7      20-40 min
#> 8      10-15 min

cat("\n⏱️ Total Estimated Pipeline Time: 2-4 hours\n")
#> 
#> ⏱️ Total Estimated Pipeline Time: 2-4 hours
cat("🎯 Key Success Factors:\n")
#> 🎯 Key Success Factors:
cat("  • Proper data validation at each step\n")
#>   • Proper data validation at each step
cat("  • Consistent identifier handling\n")
#>   • Consistent identifier handling
cat("  • Appropriate statistical methods\n")
#>   • Appropriate statistical methods
cat("  • Clear documentation and visualization\n")
#>   • Clear documentation and visualization

🎯 Summary and Next Steps

The evanverse bioinformatics toolkit provides:

Gene identifier conversion with species and build support ✅ Pathway analysis tools for GMT file processing ✅ Visualization functions optimized for biological data ✅ Data download utilities for public repositories ✅ Multi-omics integration capabilities ✅ Quality control helpers for robust analysis

Continue Learning:

Essential Bioinformatics Functions:

# Gene identifier conversion
convert_gene_id(genes, from = "symbol", to = "ensembl", species = "human")

# Pathway analysis
pathways <- gmt2list("pathways.gmt")
plot_venn(gene_sets, colors = get_palette("vividset"))

# Data visualization
plot_forest(survival_data, hr_col = "HazardRatio")
get_palette("gradient_rd_bu", type = "diverging", n = 11)

# Data management
download_geo_data("GSE123456")
read_table_flex("expression_data.txt")

🧬 Accelerate your bioinformatics research with evanverse!