Eine Tabelle mit differentiellen Ausdrücken (DEG) ist ein nützlicher Ausgangspunkt – aber sie ist selten das Ende der Geschichte. Die meisten Menschen stoßen auf die gleiche nächste Frage: Was bedeuten diese genebenen Veränderungen auf der Ebene von Signalwegen und biologischen Funktionen? Hier kommt die funktionelle Anreicherungsanalyse ins Spiel.
Dieser ressourcenorientierte Leitfaden zeigt einen vollständigen, wiederholbaren Workflow in R: QC → Normalisierung → differentielle Expression → Anreicherung (ORA und GSEA) → Visualisierung, unter Verwendung von clusterProfiler (einem Bioconductor R-Paket) für Anreicherung und anreicherungsfreundliche Plots. Er ist so geschrieben, dass Sie die Struktur in Ihr eigenes Analyse-Notizbuch kopieren oder in ein kleines Skript anpassen können. Nahe dem Ende finden Sie auch ein kompaktes R-Skript-Skelett.
Unterwegs werden wir uns auf die praktischen Details konzentrieren, die in realen Projekten am wichtigsten sind: Eingabeformate, Gen-IDs, das Hintergrund-Genuniversum, wie man zwischen ORA und GSEA wählt und wie man die drei Diagramme erstellt, die die Leute tatsächlich verwenden (Volcano + Bar + Dot).
Wenn Sie noch entscheiden, wie Sie Schwellenwerte definieren, log2FC und FDR interpretieren oder Ihre DEG-Tabelle für die nachgelagerte Analyse strukturieren, könnte Ihnen dieser Überblick über die differentielle Expression hilfreich sein: Differenzielle Genexpressionsanalyse.
Workflow-Übersicht des auf clusterProfiler basierenden DEG-zu-Anreicherungs-Pipelines.
Bis Sie diesen Workflow abgeschlossen haben, sollten Sie eine kleine Menge an Ausgaben haben, die leicht wiederverwendbar und teilbar sind:
Wenn Sie einen Blogbeitrag im Methodenstil oder ein internes SOP schreiben, lassen sich diese Ergebnisse gut in einer einfachen Ordnerstruktur abbilden:
Option A: Von Zählungen aus starten (empfohlen)
Du hast:
Dies ist die sauberste Route, da Sie die gesamte Kette kontrollieren.
Option B: Beginnen Sie mit einer DEG-Tabelle (am schnellsten)
Sie haben bereits Ergebnisse von DESeq2/edgeR/limma:
Das ist in Ordnung für die Anreicherung, solange die DEG-Tabelle gut strukturiert ist und Sie eine Rangfolge für GSEA rekonstruieren können, wenn Sie das möchten.
In Anreicherungs-Workflows ist der häufigste Grund für das "Warum ist das leer?" ein ID-Mismatch.
Typische Ausweise, die Sie sehen werden:
clusterProfiler kann mit mehreren Typen arbeiten, aber viele GO/KEGG-Workflows sind am einfachsten, wenn Sie in ENTREZID für die Anreicherung umwandeln. Der praktische Ansatz ist:
Diese Zuordnungstabelle wird zu Ihrem "Kleber", wenn Sie Treffer interpretieren oder Genlisten für nachfolgende Analysen erstellen müssen.
Ein stabiler, gängiger Stapel sieht folgendermaßen aus:
Hinweis: Die Verfügbarkeit und das Verhalten von KEGG können je nach Organismus und der Handhabung von IDs variieren. Wenn Sie mit einer weniger verbreiteten Art arbeiten, kann GO einfacher sein als KEGG, es sei denn, Sie haben eine starke Unterstützungsannotation.
QC muss nicht kompliziert sein, aber es sollte absichtlich sein. Das Ziel ist einfach: Stellen Sie sicher, dass Ihre Proben sich so verhalten, wie es Ihr Studiendesign erwartet..
Drei Prüfungen decken viel ab:
PCA ist schnell, visuell und in der Regel informativ.
PCA-basierte Stichproben-QC-Visualisierung.
Kleine Unterschiede sind normal. Große Unterschiede können ein Zeichen für technische Probleme sein.
Eine praktische Anmerkung zu Ausreißern:
Wenn Sie eine Probe entnehmen, notieren Sie sich bitte. warum Halten Sie alles in einem Satz fest und führen Sie ein Protokoll. Selbst für interne Arbeiten wird Ihr zukünftiges Ich dankbar sein.
Normalisierung ist eines dieser Wörter, die in verschiedenen Kontexten unterschiedliche Bedeutungen haben.
Für die differentielle Expression erwarten die meisten etablierten Methoden Rohzählungen und führen die Normalisierung als Teil des Modells durch:
Ein häufiger Umweg besteht darin, TPM/FPKM für die differentiellen Expressionen (DE) zu verwenden. TPM ist für bestimmte Arten von Vergleichen nützlich, aber bei zählbasierten DE wirft es normalerweise mehr Fragen auf, als es beantwortet. Wenn Ihr Ziel zuverlässige differenzielle Tests ist, bleiben Sie im zählbasierten Bereich.
Einige Filterung ist hilfreich:
Die Filterung verbessert die Leistung und reduziert das Rauschen, insbesondere in kleinen Studien.
Ihr DEG-Tabelle ist der Dreh- und Angelpunkt zwischen genebezogenen Statistiken und Anreicherung. Eine "gute" DEG-Tabelle für die nachgelagerte Anreicherung umfasst:
Ein häufiger Ausgangspunkt ist:
Aber viele Analysen profitieren davon, etwas flexibler zu sein:
Wenn Sie wissen, dass Ihr Signal subtil ist (oder Ihre Stichprobengröße bescheiden), ziehen Sie in Betracht, sich eher auf rangbasierte GSEA zu stützen, anstatt zu versuchen, eine große DEG-Liste "zu erzwingen".
Für ORA ist es oft informativ, die Anreicherung separat für Folgendes durchzuführen:
Das hält die Richtung klar. Andernfalls kann es passieren, dass Sie einen gemischten Gen-Satz haben, bei dem ein Begriff "angereichert" ist, aber die Gene darin in beide Richtungen bewegen.
Dies ist der Kern des Leitfadens. clusterProfiler unterstützt mehrere Anreicherungsansätze, aber zwei sind besonders häufig für RNA-Seq Interpretation:
Eingaben, die Sie benötigen
Über das Universum (Hintergrund-Genset)
Wenn Sie kein Universum festlegen, wird Ihre Anreicherung oft mit einem breiten Standardhintergrund aus der Annotationsdatenbank verglichen. In vielen Fällen ist ein praktischer und besser verteidigbarer Rahmen:
Dies stimmt den Anreicherungs-Hintergrund mit dem ab, was Ihr Experiment realistisch erkennen könnte.
GO-Anreicherung (empfohlener Ausgangspunkt)
KEGG-Anreicherung (optional)
KEGG kann sehr nützlich sein, aber hier treten auch häufiger ID- und Organismusprobleme auf. Wenn KEGG leere Ergebnisse zurückgibt:
GSEA verändert die Fragestellung. Anstatt einen "signifikanten Genuntergruppe" auszuwählen, werden alle Gene nach einer Statistik eingestuft und es wird gefragt, ob Gene aus einem Weg tendenziell oben oder unten erscheinen.
Was Sie für GSEA benötigen
Rangfolge von Optionen, die leicht zu erklären sind
Wenn Sie den Ansatz mit dem signierten Log-p-Wert wählen, schützen Sie sich vor Nullen und NAs (z. B. indem Sie p-Werte auf ein Minimum wie 1e-300 beschränken).
Dieser Workflow konzentriert sich absichtlich auf drei Diagramme, da sie die meisten Bedürfnisse abdecken, ohne Ihre Ausarbeitung in ein Figurenmuseum zu verwandeln.
Ein Vulkanplot zeigt:
Gute Gewohnheiten:
Vulkanplot, der die Ergebnisse der differentiellen Expression zusammenfasst.
Verwenden Sie Balkendiagramme, um eine kurze Liste der am stärksten angereicherten Begriffe anzuzeigen. Halten Sie es prägnant:
Punktdiagramme sind eine großartige "Ein-Panel"-Zusammenfassung:
Wenn Sie Punktdiagramme veröffentlichen, halten Sie die Legende leserlich und vermeiden Sie es, zu viele Begriffe anzuzeigen.
Punktdiagramm zur Zusammenfassung angereicherter funktioneller Begriffe mit Größen- und Farbcodierung.
Dieser Abschnitt soll eine schnelle "Checkliste vor dem Export der Ergebnisse" sein.
Tipp: Exportieren Sie eine Mapping-Tabelle und bewahren Sie sie mit Ihren Ergebnissen auf. Das verhindert später Verwirrung.
Wenn die ORA-Ergebnisse seltsam aussehen (zu breit, zu leer, zu allgemein), überprüfen Sie das Universum erneut.
Ein praktischer Standard:
Wenn Sie mit den ORA-Ergebnissen nicht zufrieden sind, versuchen Sie GSEA, bevor Sie Ihre Schwellenwerte fünfmal neu schreiben.
GO ist von Natur aus hierarchisch und redundant. Wenn Ihre besten Ergebnisse wie Wiederholungen aussehen:
Häufige Gründe:
Ein technisch korrekter Plot kann dennoch schwer zu lesen sein.
Unten finden Sie ein kompaktes Skriptgerüst, das Sie anpassen können. Es geht davon aus:
Es ist absichtlich minimal gehalten, damit du es in einen Blog-Ressourcendownload einfügen und den Lesern erlauben kannst, ein paar Zeilen zu ändern.
UnterdrückePaketStartNachrichten({
Bibliothek(DESeq2)
Bibliothek(clusterProfiler)
Bibliothek(enrichplot)
Bibliothek(AnnotationDbi)
library(org.Hs.eg.db) # tauschen Sie es gegen Ihr Organismus aus
Bibliothek(ggplot2)
Bibliothek(dplyr)
}
# ---- Eingaben (bearbeiten) ----
counts_datei <- "counts.csv" # Gene x Proben, rohe Zählungen
meta_datei <- "meta.csv" # Probe, Bedingung (und optionaler Batch)
id_type_in <- "SYMBOL" # SYMBOL oder ENSEMBL
cond_a <- "behandelt"
cond_b <- "Kontrolle"
dir.create("tabellen", showWarnings = FALSE)
dir.create("plots", showWarnings = FALSE)
# ---- Laden ----
counts <- read.csv(counts_datei, row.names = 1, check.names = FALSE)
meta <- read.csv(meta_datei, stringsAsFactors = FALSE)
counts <- counts[, meta$probe]
# ---- DE ----
dds <- DESeqDataSetFromMatrix(
countData = round(as.matrix(counts)),
colData = data.frame(meta, row.names = meta$sample),
design = ~ Bedingung
)
# Einfache Filterung
dds <- dds[rowSums(counts(dds) >= 10) >= 2, ]
dds <- DESeq(dds)
res <- Ergebnisse(dds, Kontrast = c("Bedingung", cond_a, cond_b))
res <- as.data.frame(res) %>%
mutate(gene = rownames(.)) %>%
filter(!is.na(padj))
write.csv(res, "tables/DEG_results.csv", row.names = FALSE)
# ---- Vulkan ----
vol <- res %>% mutate(sig = padj < 0,05 & abs(log2FoldChange) >= 1)
p_vol <- ggplot(vol, aes(log2FoldChange, -log10(padj))) +
geom_point(aes(alpha = sig), size = 1) +
scale_alpha_manual(values = c(`TRUE` = 0.8, `FALSE` = 0.2), guide = "none") +
theme_bw() +
labs(x = "log2 Faltungsänderung", y = "-log10(FDR)", title = "Volcano-Diagramm")
ggsave("plots/volcano.pdf", p_vol, width = 6.5, height = 5)
# ---- ID-Zuordnung ----
mapped <- bitr(res$gene,
fromType = id_typ_in,
toType = "ENTREZID",
OrgDb = org.Hs.eg.db)
res_entrez <- res %>%
inner_join(mapped, by = c("gene" = id_type_in)) %>%
distinct(ENTREZID, .keep_all = TRUE)
write.csv(res_entrez, "tables/DEG_mit_ENTREZID.csv", row.names = FALSE)
write.csv(mapped, "tables/ID_mapping.csv", row.names = FALSE)
# ---- ORA (GO BP) ----
deg_up <- res_entrez %>% filtern(padj < 0.05, log2FoldChange >= 1) %>% ziehen(ENTREZID)
deg_dn <- res_entrez %>% filter(padj < 0.05, log2FoldChange <= -1) %>% pull(ENTREZID)
universum <- res_entrez$ENTREZID
ego_up <- enrichGO(gene = deg_up, universum = universum,
OrgDb = org.Hs.eg.db, keyType = "ENTREZID",
ont = "BP", pAnpassungsMethode = "BH", qwertCutoff = 0.05)
ego_dn <- enrichGO(gene = deg_dn, universum = universum,
OrgDb = org.Hs.eg.db, keyType = "ENTREZID",
ont = "BP", pAdjustMethod = "BH", qvalueCutoff = 0,05)
write.csv(as.data.frame(ego_up), "tables/GO_ORA_up.csv", row.names = FALSE)
write.csv(as.data.frame(ego_dn), "tables/GO_ORA_down.csv", row.names = FALSE)
# ---- Plots: Balken + Punkte ----
ggsave("plots/GO_ORA_up_bar.pdf", barplot(ego_up, showCategory = 15), width = 7, height = 5)
ggsave("plots/GO_ORA_up_dot.pdf", dotplot(ego_up, showCategory = 15), width = 7, height = 5)
# ---- Optional: GSEA ----
rank_vec <- res_entrez$stat
wenn (alle(is.na(rank_vec))) {
p <- pmax(res_entrez$pvalue, 1e-300)
rank_vec <- sign(res_entrez$log2FoldChange) * -log10(p)
}
names(rank_vec) <- res_entrez$ENTREZID
rank_vec <- sort(rank_vec, decreasing = TRUE)
gse_bp <- gseGO(geneList = rang_vec,
OrgDb = org.Hs.eg.db, Schlüsseltyp = "ENTREZID",
ont = "BP", pAnpassungsMethode = "BH", ausführlich = FALSE)
write.csv(as.data.frame(gse_bp), "tables/GO_GSEA_BP.csv", row.names = FALSE)
ggsave("plots/GO_GSEA_dot.pdf", dotplot(gse_bp, showCategory = 15), width = 7, height = 5)
Wie man dies in eine herunterladbare Ressource umwandelt
Muss ich DESeq2 ausführen, um clusterProfiler zu verwenden?
Nein. Sie können clusterProfiler mit Ergebnissen aus jeder DE-Methode verwenden, solange Sie eine Genliste für ORA oder einen rangierten Genvektor für GSEA haben.
Sollte ich ORA oder GSEA für die Pfadanreicherung verwenden?
Verwenden Sie ORA, wenn Sie eine Anreicherung in einem ausgewählten DEG-Set wünschen. Verwenden Sie GSEA, wenn Sie lieber die Anreicherung über eine rangierte Liste testen möchten, ohne sich auf einen strengen Cutoff zu verlassen.
Warum liefert die Anreicherung keine Ergebnisse?
Am häufigsten handelt es sich um eine ID/Organismus-Unstimmigkeit (insbesondere bei KEGG) oder die Eingabeliste ist zu klein. Die Überprüfung der ID-Konvertierung und der Wechsel zu GSEA sind gängige Lösungen.
Was sollte ich als Hintergrund-Gen-Set (Universum) für ORA verwenden?
Ein praktischer Standard ist die Menge der Gene, die in Ihrer DE-Analyse getestet wurden (nach der Filterung), nicht das gesamte Genom.
Wie viele Terme sollte ich darstellen?
In der Regel sind 10–20 Begriffe ausreichend für eine klare Darstellung; mehr wird tendenziell repetitiv und schwer lesbar.
Referenzen: