Dieser Artikel präsentiert ein umfassendes Rahmenwerk für Pan-Genom-Analyse, wobei die Klassifizierung von Genen in Kern-, Softcore-, dispensierbare und private Kategorien basierend auf der Häufigkeit von Vorhandensein/Abwesenheit über Genome hinweg betont wird. Mit der PSVCP-Pipeline und OrthoFinder konstruieren wir ein lineares Pan-Genom, erkennen strukturelle Varianten und identifizieren orthologe Genfamilien. Ein statistischer Workflow wird implementiert, um Genkategorien zuzuweisen und deren Verteilung zu quantifizieren. Visualisierungstechniken - einschließlich Kreisdiagrammen, Histogrammen, Balkendiagrammen und Heatmaps - heben die genomische Vielfalt und die Populationsstruktur hervor. Dieser Ansatz ermöglicht tiefere Einblicke in die Genomevolution, funktionale Differenzierung und adaptive Merkmale und unterstützt Anwendungen in der Pflanzenzüchtung, mikrobiologischen Studien und der Krankheitsgenomik.
Was ist ein Pan-Genom?
Das Pan-Genom repräsentiert das vollständige Spektrum an Genen in einer definierten Gruppe von Organismen und umfasst sowohl gemeinsame als auch variable genomische Inhalte zwischen Individuen oder Arten. Im Gegensatz zum traditionellen Ansatz, der ein einzelnes Referenzgenom analysiert, umfasst das Pan-Genom die genomische Vielfalt innerhalb der Arten und ermöglicht umfassendere Einblicke in strukturelle Variationen, Variationen in der Genpräsenz/-abwesenheit (PAV) und evolutionäre Dynamiken.
Ursprünglich in der bakteriellen Genomik vorgeschlagen, hat sich das Konzept des Pan-Genoms seitdem zu einem zentralen Paradigma in der Pflanzenzüchtung, der mikrobiellen Anpassung und der Krebsgenomik entwickelt.
Historischer Kontext und Relevanz
Der Begriff "Pan-Genom" wurde 2005 von Tettelin et al. während der vergleichenden Analyse mehrerer Streptococcus agalactiae-Stämme geprägt. Ihre Arbeit beleuchtete die Einschränkungen der ausschließlich referenzbasierten Analyse und plädierte für ein inklusiveres Modell des Genomgehalts. Seitdem hat sich das Konzept revolutioniert:
Warum Gene in vier Kategorien einteilen?
Die Analyse des Pan-Genoms zeigt, dass nicht alle Gene gleichmäßig über Individuen verteilt sind. Die Klassifizierung von Genen in Kern-, Softcore-, dispensierbare und private Kategorien bietet einen quantitativen Rahmen für:
Dienste, an denen Sie interessiert sein könnten
Mehr erfahren
In pan-genomischen Studien werden Genfamilien typischerweise basierend auf ihrer Präsenz in verschiedenen Proben kategorisiert. Kern-Gene sind universell konserviert und kommen in allen Individuen der Population vor, was auf ihre wesentlichen biologischen Rollen hinweist. Softcore-Gene sind zwar nicht strikt universell, kommen jedoch in mehr als 90 % der Individuen vor und können eine starke evolutionäre Erhaltung mit geringfügigen populationsspezifischen Variationen widerspiegeln. Dispensable Gene sind in einer Teilmenge von Individuen vorhanden, typischerweise in mehr als einem, aber weniger als 90 %, und entsprechen oft Genen, die an Umweltreaktionen, Immunität oder Stressanpassung beteiligt sind. Schließlich sind private Gene exklusiv für ein einzelnes Genom innerhalb des Datensatzes, was auf mögliche kürzliche Einspritzungen, strukturelle Varianten oder Annotationsartefakte hinweist. Diese Klassifikation dient als Grundlage für nachgelagerte statistische und funktionale Analysen.
Abbildung 1. Zusammensetzung des syntenischen Pan-Genoms.Li, X. et al., 2024)
Kern-Gene kodieren oft essentielle Funktionen, die mit der zellulären Erhaltung, Entwicklung und Fortpflanzung zusammenhängen.
Softcore-Gene können umwelt-spezifische Anpassungen oder subpopulation-spezifische Erhaltungen widerspiegeln.
Entbehrliche Gene treiben die phänotypische Vielfalt voran und sind häufig in der Stressreaktion, Immunität und sekundären Metabolismus angereichert.
Private Gene könnten kürzliche Einspeisungen, horizontale Transferereignisse oder Artefakte der Zusammenstellung oder Annotation darstellen.
Die psvcp_v1.01-Pipeline erleichtert den Aufbau eines linearen Pan-Genoms und identifiziert strukturelle Variationen (SVs) im Bevölkerungsmaßstab aus Kurzlesedaten.
Schlüsselschritte:
Zusammengestellte Genom-FASTAs, Annotationen (GFF) und Populationssequenzierungsdaten
Schritt 1: Laden Sie die psvcp_v1.01-Pipeline herunter.
git klonen https://github.com/wjian8/psvcp_v1.01.git
Schritt 2: Referenzgenome über Genome_construct_Pangenome.py zusammenführen
#Konstruktion eines linearen Pan-Genoms durch zwei Genome bash $path_of_the_pipeline/Refgenome_update_by_quest.sh ref.fa query.fa > job.sh && bash job.sh #Konstruktion eines Pan-Genoms durch mehrere (mehr als 2) Genome python3 $path_of_the_pipeline/1Genome_construct_Pangenome.py genome_example_dir genome_list
Schritt 3: Kartenlesungen auf das Pan-Genom mit Map_fq_to_Pan.py abbilden
python3 $path_of_the_pipeline/2Map_fq_to_Pan.py -t 4 -fqd fq_dir -r Referenzdatei -br bam_dir
Schritt 4: Rufen Sie SVs (PAVs, Inversionen, Translokationen) auf und erstellen Sie eine Genotypmatrix mit Call_sv_to_genotype.py
python3 $path_of_the_pipeline/3Call_sv_to_genotype.py -br bam_verzeichnis -o hmp_präfix
Die Ausgabedatei ist das Präfix einer Genotypdatei im HapMap-Format.
Um Genfamilien zuverlässig über Individuen hinweg zu verfolgen, wird OrthoFinder eingesetzt, um Orthogruppen über mehrere Genome hinweg zu erkennen und somit Gene zu gruppieren, die von einem gemeinsamen Vorfahren abstammen. Es löst auch Genverdopplungen und -verluste auf und bietet Einblicke in die Evolution von Genfamilien sowie in linien-spezifische Erweiterungen oder Kontraktionen. Darüber hinaus identifiziert OrthoFinder syntenische Blöcke, die konservierte Genordnungen über Genome hinweg darstellen, was die Analyse der Kollinearität erleichtert und die Genauigkeit der Zuordnung orthologer Gene in Pan-Genom-Studien verbessert.
Schritt 1: OrthoFinder installieren
conda install orthofinder -c bioconda
Schritt 2: OrthoFinder ausführen
"OrthoFinder/Beispieldaten" mit dem Verzeichnis, das Ihre Eingabe-Fasta-Dateien enthält, mit einer Datei pro Art.
OrthoFinder/orthofinder -f OrthoFinder/Beispieldaten
Ein typischer OrthoFinder-Durchlauf erzeugt eine umfassende Sammlung von Ausgabedateien, einschließlich Informationen zu Orthogruppen, orthologen Beziehungen, Genbäumen, gelösten Genbäumen, dem verwurzelten Artenbaum, Genverdopplungsereignissen und vergleichenden genomischen Statistiken der analysierten Arten. Alle Ergebnisse sind in einem gut strukturierten und benutzerfreundlichen Verzeichnislayout organisiert, um eine einfache Navigation und Interpretation zu ermöglichen.
Die Analyse erfordert eine binäre Orthogruppen-Präsenz/Abwesenheitsmatrix, in der jede Zeile eine Orthogruppe (Genfamilie) und jede Spalte eine Probe (Genom) darstellt. Die Einträge geben an, ob eine bestimmte Orthogruppe in jeder Probe vorhanden (1) oder abwesend (0) ist. Optional können Metadaten wie Probenursprung, Phänotyp oder ökologischer Kontext für nachgelagerte stratifizierte Analysen integriert werden.
Um Gene in die Kategorien Kern-, Softcore-, dispensabel und privat zu stratifizieren, werden die folgenden Schritte umgesetzt:
Schritt 1: Häufigkeit des Vorhandenseins von Genen berechnen
Die Häufigkeit jeder Orthogruppe über die Proben wird als der Anteil der Genome berechnet, in denen das Gen vorhanden ist.
Bibliothek(tidyverse)
# Lade die Orthogruppe Genanzahl-Matrix und die Tabelle der nicht zugewiesenen Gene
df <- read.csv('Orthogroups.GeneCount.tsv', sep = '\t', row.names = 1)
df_uniq <- read.csv('Orthogroups_UnassignedGenes.tsv', sep = '\t', row.names = 1)
# Entferne die letzte Spalte, wenn sie Zusammenfassungsstatistiken enthält
df <- df[, 1:(ncol(df) - 1)]
# Konvertiere die Tabelle der nicht zugewiesenen Gene in ein binäres Format
df_uniq[df_uniq != ''] <- 1
df_uniq[df_uniq == ''] <- 0
# Füge die zugewiesenen und nicht zugewiesenen Gen-Tabellen zusammen
df_combined <- rbind(df, df_uniq)
df_combined[is.na(df_combined)] <- 0 # Fülle NA mit 0
Um den Arbeitsablauf zu veranschaulichen, simulieren wir eine zufällige Präsenz-/Abwesenheitsmatrix.
set.seed(123)
n_genes <- 1000
n_samples <- 27
gene_categories <- sample(c("Kern", "Weichkern", "Entbehrlich", "Privat"),
n_genes,
replace = TRUE,
prob = c(0.20, 0.15, 0.55, 0.1))
binary_matrix <- sapply(gene_categories, function(cat) {
switch(cat,
"Kern" = rep(1, n_samples),
"Weichkern"= rbinom(n_samples, 1, 0.95),
"Privat" = rbinom(n_samples, 1, 0.05),
"Entbehrlich" = rbinom(n_samples, 1, 0.5)
)
}) %>% t()
colnames(binary_matrix) <- paste0("Genom_", 1:n_samples)
rownames(binary_matrix) <- paste0("Gen_", 1:n_genes)
df_combined <- as.data.frame(binary_matrix)
Schritt 2: Gene-Kategorien basierend auf Häufigkeitsschwellen zuweisen
Jedes Gen wird in eine von vier Kategorien eingeteilt:
# Berechne die Präsenzfrequenz für jedes Gen df_summary <- data.frame( gen = rownames(df_combined), frequenz = apply(df_combined, 1, function(x) sum(x != 0) / ncol(df_combined)), stringsAsFactors = FALSE ) df_summary <- df_summary[!df_summary$frequenz == 0,] # Weise die Genkategorie basierend auf der Frequenz zu df_summary$Kategorie <- with(df_summary, case_when( frequenz == 1 ~ "Kern", frequenz >= 0.9 ~ "Weichkern", frequenz == 1 / ncol(df_combined) ~ "Privat", TRUE ~ "Entbehrlich" ))
Schritt 3: Zusammenfassende Statistiken erstellen
Sobald klassifiziert, wird eine statistische Zusammenfassung erstellt, um die Verteilung der Genkategorien zu quantifizieren:
# Zähle die Anzahl der Gene in jeder Kategorie table(df_summary$Kategorie) # Berechne die Kategorienanteile prop.table(table(df_summary$Kategorie))
Dies umfasst die Gesamtzahl und den Anteil der Gene in jeder Kategorie.
Um die intuitive Interpretation der pan-genomischen Struktur und der Dynamik der Genkategorien zu erleichtern, werden mehrere Visualisierungsstrategien eingesetzt:
Zweck: Visualisierung des Anteils der Gene in jeder Kategorie.
ggplot(df_summary, aes(x = "", fill = Kategorie)) +
geom_bar(width = 1, color = "weiß") +
coord_polar("y") +
theme_void() +
scale_fill_manual(values = c("#F8766D", "#7CAE00", "#00BFC4", "#C77CFF")) +
geom_text(aes(label = paste0(round(..count../sum(..count..)*100, 2), "%")),
stat = "count",
position = position_stack(vjust = 0.5),
color = "schwarz", size = 4)
Dies bietet einen sofortigen Überblick über die genomweite Genzusammensetzung.
Abbildung 2. Der Anteil der Gene in jeder Kategorie.
Zweck: Anzeige der Verteilung der Frequenzen der Genpräsenz, wobei die Schwellenwerte der Kategorien hervorgehoben werden.
ggplot(df_summary, aes(x = frequency, fill = Kategorie)) +
geom_histogram(binwidth = 0.05, alpha = 0.8) +
scale_fill_manual(values = c("#F8766D", "#7CAE00", "#00BFC4", "#C77CFF")) +
labs(x = "Häufigkeit der Präsenz", y = "Anzahl der Gene",
title = "Verteilung der Genhäufigkeit (Pan/Core Gene)") +
theme_minimal() +
geom_vline(xintercept = c(0.9, 1/n_samples), linetype = "dashed")
Abbildung 3. Die Verteilung der Frequenzen des Vorhandenseins von Genen.
Zweck: Vergleich der Genkategorie-Zusammensetzung zwischen einzelnen Genomen oder Stichprobengruppen.
# Matrix in langes Format umformen und mit Genkategorie-Informationen zusammenführen
df_long <- df_combined %>%
as.data.frame() %>%
rownames_to_column("gen") %>%
pivot_longer(-gen, names_to = "Probe", values_to = "Präsenz") %>%
left_join(df_summary, by = "gen") %>%
filter(Präsenz == 1)
# Anteil jeder Kategorie pro Probe berechnen
df_stack <- df_long %>%
group_by(Probe, Kategorie) %>%
summarise(Anzahl = n(), .groups = "drop") %>%
group_by(Probe) %>%
mutate-Anteil = Anzahl / sum(Anzahl))
ggplot(df_stack, aes(x = Probe, y = Anteil, fill = Kategorie)) +
geom_bar(stat = "identity", position = "fill") +
ylab("Anteil der Gene") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
Nützlich für bevölkerungsbezogene Vergleiche und zur Aufdeckung von stichproben-spezifischen Anreicherungsmustern.
Abbildung 4. Zusammensetzung der Genkategorien über einzelne Genome.
Zweck: Cluster von Genomen und Genen, um die Struktur und potenzielle funktionale Module aufzudecken.
Bibliothek(pheatmap)
reihe_reihenfolge <- order(rowMeans(binary_matrix), decreasing = TRUE)
binary_matrix <- binary_matrix[reihe_reihenfolge, ]
pheatmap(binary_matrix,
farbe = c("#2166AC", "#B2182B"),
zeilen_namen_anzeigen = FALSE,
spalten_namen_anzeigen = TRUE,
zeilen_clustern = FALSE,
spalten_clustern = FALSE,
brüche = seq(0, 1, length.out = 3),
legende = TRUE,
legende_brüche = c(0, 1),
legende_etiketten = c("Abwesenheit", "Präsenz"),
haupt = "Gen Präsenz/Abwesenheit in 27 Genomen",
annotation_reihe = data.frame(Kategorie=df_summary$Kategorie, zeilen_namen=df_summary$gen),
annotation_farben = list(Kategorie = c(Kern="#F8766D", Softkern="#7CAE00",
Entbehrlich="#00BFC4", Privat="#C77CFF")))
Cluster können Subpopulationen, Ökotypen oder selektive Drücke entsprechen.
Abbildung 5. Anwesenheits- und Abwesenheitsinformationen aller Genfamilien.
Die Pan-Genom-Analyse bietet einen umfassenden Rahmen zur Charakterisierung der genomischen Variation innerhalb von Arten. Die Klassifizierung von Genen in Kern-, Softcore-, dispensierbare und private Kategorien ermöglicht es Forschern, essentielle Gene zu priorisieren, adaptive Merkmale zu identifizieren und die Populationsvielfalt zu bewerten. Durch die Integration robuster Pipelines wie PSVCP zur Erkennung struktureller Variationen und Tools wie OrthoFinder zur Clusterbildung von Genfamilien können Forscher hochauflösende Präsenz/Abwesenheitsmatrizen ableiten, die für nachgelagerte Analysen unerlässlich sind. Kombiniert mit quantitativer Profilierung und intuitiven Visualisierungstechniken - von Kreisdiagrammen bis hin zu hierarchischen Heatmaps - bieten diese Strategien leistungsstarke Einblicke in die Genomevolution, die Populationsstruktur und die funktionale Vielfalt und ebnen somit den Weg für informiertere genomische Selektions- und Assoziationsstudien sowohl in der Grundlagen- als auch in der angewandten Forschung.
Referenzen: