In dieser Übung benutzen wir die Daten aus dem Evo-Devo-Datensatz der Kaesmann-Gruppe für ein einfaches Beispiel zur Bestimmung differentiel exprimierter Gene (DGE).
Wir arbeiten wieder mit der Count-Matrix zur Maus und beschränken uns diesmal auf die Daten vom Herz, und zwar auf die zwei Zeitpunkte P3 und P63. Wir fragen, welche Gene sich zwischen jungen Mäusen (P3, also 3 Tage nach Geburt) und ausgewachsenen Mäusen (P63, also zwei Monate alt) in ihrer Expressionstärke im Herz ändern.
Laden Sie also zunächst die Count-Matrix und reduzieren Sie diese auf nur die 8 Proben vom Herz zu den Zeitpunkten P3 und P63. Sie können hierzu den Code aus der Vorlesung verwenden, mit dem wir dort die Matrix erst von breit auf lang pivotiert ahben, dann auf nur die Leber-Proben (diesmal eben, die benötigen Herz-Proben) reduziert haben.
So könnte die lange Tabelle aussehen:
Rows: 36141 Columns: 317
── Column specification ────────────────────────────────────────────────────────
Delimiter: "\t"
chr (1): gene_id
dbl (316): Brain_e10.5_1, Brain_e10.5_2, Brain_e10.5_3, Brain_e11.5_1, Brain...
ℹ 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.
Joining with `by = join_by(sample)`
# A tibble: 289,128 × 6
gene_id sample columns tissue timepoint replicate
<chr> <chr> <dbl> <chr> <fct> <chr>
1 ENSMUSG00000000001 Heart_P3_1 2149 Heart P3 1
2 ENSMUSG00000000001 Heart_P3_2 2371 Heart P3 2
3 ENSMUSG00000000001 Heart_P3_3 2044 Heart P3 3
4 ENSMUSG00000000001 Heart_P3_4 2269 Heart P3 4
5 ENSMUSG00000000001 Heart_P63_1 1501 Heart P63 1
6 ENSMUSG00000000001 Heart_P63_2 1012 Heart P63 2
7 ENSMUSG00000000001 Heart_P63_3 756 Heart P63 3
8 ENSMUSG00000000001 Heart_P63_4 1137 Heart P63 4
9 ENSMUSG00000000003 Heart_P3_1 0 Heart P3 1
10 ENSMUSG00000000003 Heart_P3_2 0 Heart P3 2
# ℹ 289,118 more rows
Falls Ihr Computer mit der sehr großen Ausgangs-Matrix nicht zurecht kommt, können Sie auch diese Matrix laden, die nur die benötigten 8 Proben enthält:
# A tibble: 36,141 × 9
gene_id Heart_P3_1 Heart_P3_2 Heart_P3_3 Heart_P3_4 Heart_P63_1 Heart_P63_2
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 ENSMUSG0… 2149 2371 2044 2269 1501 1012
2 ENSMUSG0… 0 0 0 0 0 0
3 ENSMUSG0… 478 570 511 532 97 46
4 ENSMUSG0… 271 241 294 256 74 32
5 ENSMUSG0… 1 0 1 2 4 0
6 ENSMUSG0… 2170 2765 2413 3075 5838 2976
7 ENSMUSG0… 2070 2710 2393 1945 3101 2429
8 ENSMUSG0… 2454 3089 2405 2245 4539 2289
9 ENSMUSG0… 1809 2199 1825 2373 1762 929
10 ENSMUSG0… 11090 14032 13048 10557 18465 13336
# ℹ 36,131 more rows
# ℹ 2 more variables: Heart_P63_3 <dbl>, Heart_P63_4 <dbl>
Normalisieren Sie nun die Count-Werte, indem Sie auf CPM (counts per million) umrechnen. Berechnen Sie dann die logarithmische Expressionsstärke, wieder als lcpm = log10( cpm + 0.03)
. Sie sollten eine Tabelle in etwa wie diese erhalten:
# A tibble: 289,128 × 5
# Groups: sample [8]
gene_id sample count cpm lcpm
<chr> <chr> <dbl> <dbl> <dbl>
1 ENSMUSG00000000001 Heart_P3_1 2149 104. 2.02
2 ENSMUSG00000000001 Heart_P3_2 2371 98.0 1.99
3 ENSMUSG00000000001 Heart_P3_3 2044 98.9 2.00
4 ENSMUSG00000000001 Heart_P3_4 2269 87.2 1.94
5 ENSMUSG00000000001 Heart_P63_1 1501 51.0 1.71
6 ENSMUSG00000000001 Heart_P63_2 1012 62.1 1.79
7 ENSMUSG00000000001 Heart_P63_3 756 36.2 1.56
8 ENSMUSG00000000001 Heart_P63_4 1137 39.2 1.59
9 ENSMUSG00000000003 Heart_P3_1 0 0 -1.52
10 ENSMUSG00000000003 Heart_P3_2 0 0 -1.52
# ℹ 289,118 more rows
Nun können Sie über die Replikate mitteln, um einmal die Mittwelwerte für P3 und einmal für P36 zu erhalten. Setzen Sie die Werte nebeneinander, z.B. so:
Joining with `by = join_by(sample)`
`summarise()` has grouped output by 'gene_id'. You can override using the
`.groups` argument.
# A tibble: 36,141 × 3
# Groups: gene_id [36,141]
gene_id P3 P63
<chr> <dbl> <dbl>
1 ENSMUSG00000000001 1.99 1.66
2 ENSMUSG00000000003 -1.52 -1.52
3 ENSMUSG00000000028 1.36 0.511
4 ENSMUSG00000000037 1.07 0.225
5 ENSMUSG00000000049 -1.18 -0.731
6 ENSMUSG00000000056 2.05 2.25
7 ENSMUSG00000000058 2.00 2.01
8 ENSMUSG00000000078 2.05 2.12
9 ENSMUSG00000000085 1.95 1.77
10 ENSMUSG00000000088 2.73 2.89
# ℹ 36,131 more rows
Bestimmen Sie nun die Gene, für die das Expressions-Verhältnis P63 zu P3 am größten ist. Denken Sie daran, dass Sie auf einer logarithmischen Skala arbeiten: Unser Expressionsverhältnis wird also zu einer Differenz. Hier ist mein Ergebnis:
# A tibble: 36,141 × 4
# Groups: gene_id [36,141]
gene_id P3 P63 diff_log10_P63_P3
<chr> <dbl> <dbl> <dbl>
1 ENSMUSG00000026418 3.11 -0.189 -3.30
2 ENSMUSG00000040856 1.69 -0.840 -2.53
3 ENSMUSG00000029814 1.69 -0.742 -2.43
4 ENSMUSG00000063446 0.973 -1.35 -2.32
5 ENSMUSG00000054446 0.843 -1.32 -2.16
6 ENSMUSG00000013415 1.28 -0.787 -2.07
7 ENSMUSG00000096445 0.620 -1.44 -2.06
8 ENSMUSG00000062393 1.09 -0.947 -2.04
9 ENSMUSG00000027966 1.42 -0.615 -2.03
10 ENSMUSG00000051159 1.56 -0.444 -2.00
# ℹ 36,131 more rows
Üblicherweise verwendet man für logarithmische Expressionsverhältnisse (“log fold change”, LFC) den Logarithmus zur Basis 2, nicht zur Basis 10. Rechnen Sie um. Fügen Sie auch die Gen-Namen an.
Hier ist das Ergebnis meines Codes:
Rows: 56305 Columns: 3
── Column specification ────────────────────────────────────────────────────────
Delimiter: "\t"
chr (3): Gene stable ID, Gene name, Gene description
ℹ 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.
Joining with `by = join_by(gene_id)`
# A tibble: 15 × 6
# Groups: gene_id [15]
gene_id P3 P63 l2fc_P63_P3 gene_name gene_descr
<chr> <dbl> <dbl> <dbl> <chr> <chr>
1 ENSMUSG00000026418 3.11 -0.189 -11.0 Tnni1 troponin I, skeletal, …
2 ENSMUSG00000040856 1.69 -0.840 -8.41 Dlk1 delta like non-canonic…
3 ENSMUSG00000029814 1.69 -0.742 -8.06 Igf2bp3 insulin-like growth fa…
4 ENSMUSG00000063446 0.973 -1.35 -7.70 Plppr1 phospholipid phosphata…
5 ENSMUSG00000054446 0.843 -1.32 -7.18 Cpa1 carboxypeptidase A1, p…
6 ENSMUSG00000013415 1.28 -0.787 -6.87 Igf2bp1 insulin-like growth fa…
7 ENSMUSG00000096445 0.620 -1.44 -6.84 Dcpp1 demilune cell and paro…
8 ENSMUSG00000062393 1.09 -0.947 -6.76 Dgkk diacylglycerol kinase …
9 ENSMUSG00000027966 1.42 -0.615 -6.74 Col11a1 collagen, type XI, alp…
10 ENSMUSG00000051159 1.56 -0.444 -6.66 Cited1 Cbp/p300-interacting t…
11 ENSMUSG00000056758 0.759 -1.24 -6.65 Hmga2 high mobility group AT…
12 ENSMUSG00000041431 1.62 -0.369 -6.62 Ccnb1 cyclin B1 [Source:MGI …
13 ENSMUSG00000033491 1.43 -0.549 -6.57 Prss35 protease, serine 35 [S…
14 ENSMUSG00000028175 0.995 -0.982 -6.57 Depdc1a DEP domain containing …
15 ENSMUSG00000096278 0.694 -1.24 -6.43 Dcpp2 demilune cell and paro…
Erinnern Sie sich, wie wir die Tabelle mit der Zuordnung von Ensembl-Gen-IDs zu Gen-Symbolen aus dem Ensembl BioMart herunter geladen haben? Versuchen Sie das selbst.
Zurück zu den DGEs. Plotten Sie die mittlere Expression zu P63 gegen die zu P3. Ihr Plot könnte z.B. so aussehen
(Mein Plot ist alledings nicht perfekt: Der Punkt ganz links unten entspricht 0 CPM in allen Replikaten; die Achsen sind dort aber nicht korrekt mit 0 beschriftet.)
Gerne verwendet man hier einen sog. MA-Plot. Dazu verwendet man den Mittelwert über beide Gruppen als x-Achse und das logarithmische Verhältnis als y-Achse:
Erstellen Sie diesen Plot. Können Sie sehen, dass das derselbe Plot wie zuvor ist, nur um 45 Grad gedreht, und mit “gedehnter” y-Achse?
Warum scheint man bei niedrig exprimierten Genen deutlich stärkere Unterschiede zu sehen?
Gehen wir nun zurück zu den Genen, die in P63 deutlich stärker als in P3 exprimiert sind. Erstellen Sie eine Liste mit den 50 Genen mit den größtem Expressions-Verhältnissen.
[1] "ENSMUSG00000026418" "ENSMUSG00000040856" "ENSMUSG00000029814"
[4] "ENSMUSG00000063446" "ENSMUSG00000054446" "ENSMUSG00000013415"
[7] "ENSMUSG00000096445" "ENSMUSG00000062393" "ENSMUSG00000027966"
[10] "ENSMUSG00000051159" "ENSMUSG00000056758" "ENSMUSG00000041431"
[13] "ENSMUSG00000033491" "ENSMUSG00000028175" "ENSMUSG00000096278"
[16] "ENSMUSG00000051048" "ENSMUSG00000073948" "ENSMUSG00000063632"
[19] "ENSMUSG00000037568" "ENSMUSG00000052353" "ENSMUSG00000022033"
[22] "ENSMUSG00000056972" "ENSMUSG00000026683" "ENSMUSG00000020330"
[25] "ENSMUSG00000024598" "ENSMUSG00000037335" "ENSMUSG00000036223"
[28] "ENSMUSG00000027715" "ENSMUSG00000044201" "ENSMUSG00000041064"
[31] "ENSMUSG00000027654" "ENSMUSG00000052854" "ENSMUSG00000048327"
[34] "ENSMUSG00000027379" "ENSMUSG00000028678" "ENSMUSG00000068122"
[37] "ENSMUSG00000047844" "ENSMUSG00000028068" "ENSMUSG00000019942"
[40] "ENSMUSG00000040204" "ENSMUSG00000054196" "ENSMUSG00000026955"
[43] "ENSMUSG00000027326" "ENSMUSG00000051378" "ENSMUSG00000032218"
[46] "ENSMUSG00000028873" "ENSMUSG00000028197" "ENSMUSG00000026622"
[49] "ENSMUSG00000020914" "ENSMUSG00000046591"
Stellen Sie nun die Werte der einzelnen Replikate für diese Gene als Heatmap dar
Joining with `by = join_by(gene_id)`
Entnehmen Sie nun für eines dieser Gene die log-CPM-Einzelwerte und führen Sie einen t-Test durch.
HIer z.B. für Cemip:
Joining with `by = join_by(gene_id)`
Joining with `by = join_by(sample)`
Welch Two Sample t-test
data: lcpm by timepoint
t = 7.5192, df = 3.3248, p-value = 0.003385
alternative hypothesis: true difference in means between group P3 and group P63 is not equal to 0
95 percent confidence interval:
1.123702 2.626872
sample estimates:
mean in group P3 mean in group P63
1.0561205 -0.8191667
Ausblick
Hier haben wir die stark differentiell exprimierten Gene per Hand gefunden. Dieses Vorgehen ist mühsam, aber leicht nachvollziehbar.
Allerdings hat es einige Probleme:
Bei sehr schwach exprimierten Genen können schon ein oder zwei zusätzliche Reads das Expressionsverhältnis stark ändern und soclhe keine Fluktuationen den Anschein starker Expressions-Änderungen erwecken.
Die Addition von 0.03 zur Behandlung von 0 Reads ist ad hoc und mathematisch schlecht motiviert.
Bis auf den t-Test am Schluss haben wir keinerlei Versuche gemacht, sicher zu stellen, dass alle 4 Replikate ein konsistentes Bild geben.
Wenn in einer Probe ein Gen außergewöhnlich hoch exprimiert ist, erscheinen alle anderen Gene etwas schwächer exprimiert, da wir auf Anteile schauen. Auch wenn die Gene tatsächlich weniger Anteil an allen Reads haben, wenn ein einzelnes Gen eine großen Teil der Reads für sich beansprucht, wäre es dennoch nicht hilfreich, alle Gene als herunter-reguliert zu betrachten.
Aus diesen Gründen gibt es eine Reihe von statistischen Methoden, die eine etwas ausgeklügeltere Analyse anbieten, und die man daher in der Praxis der einfachen Methode, die wir hier verwendet haben, vorzieht. Wir werden diese in einer der nächsten Vorlesungen ausprobieren.