Expresión diferencial RNA-seq: G1E-MK

Author

Diana_Trujillo

Este documento se creó con los datos generados y editados por el Dr. Carlos Yebra y es un complemento del Tutorial de Análisis de Expresión Diferencial en Galaxy de la Dra. Alejandra Rougon Cardozo, para llevar a cabo el DESeq con R.

También está basado en:

Analyzing RNA-seq data with DESeq2 de Michael I. Love, Simon Anders y Wolfgang Huber.

RNA-seq workflow: gene-level exploratory analysis and differential expression de Michael I.Love, Simon Anders, Vladislav Kim y Wolfgang Huber.

Panorama general de análisis de datos de RNA-seq con R de la Red Mexicana de Bioinformática.

Expresión diferencial RNA-seq: G1E-MK

El análisis de expresión diferencial es un método para identificar genes cuya expresión varía significativamente en diferentes grupos de muestras. El método compara los niveles de expresión de genes en diferentes condiciones y determina qué genes están sobreexpresados o subexpresados en cada condición. El G1E es una línea celular que deriva de células madre embrionarias de ratón, son parte de la diferenciación eritroide y se usan como modelo de estudio (Weiss et al. 1997). Los megacariocitos son células precursoras de las plaquetas. Se localizan en la médula ósea y son responsables de la producción y liberación de plaquetas al torrente sanguíneo. Los megacariocitos tienen un papel fundamental en la hemostasia y la coagulación sanguínea, ya que las plaquetas son esenciales para la formación de coágulos sanguíneos y la reparación de vasos sanguíneos dañados (Italiano y Shivdasani 2003; González-Villalva et al. 2019).

Cargar paqueterías

Code
library(tidyverse)
library(RColorBrewer)
library(pheatmap)
library(factoextra)
library(kableExtra)
library(plotly)
library(DESeq2)
library(PoiClaClu)
library(vsn)
library(Glimma)
library(EnhancedVolcano)
library(hexbin)

Importar datos

Code
# Se leen los archivos

G1E_rep1 <- read.table("./data/G1E_rep1.tabular", header = TRUE, sep="\t")
G1E_rep2 <- read.table("./data/G1E_rep2.tabular", header = TRUE, sep="\t")
MK_rep1 <- read.table("./data/MK_rep1.tabular", header = TRUE, sep="\t")
MK_rep2 <- read.table("./data/MK_rep2.tabular", header = TRUE, sep="\t")

# Se unen con left_join

countdata_df <- left_join(G1E_rep1, G1E_rep2) |> left_join(MK_rep1) |> 
                left_join(MK_rep2)

# Se transforma en una matriz

countdata <- as.matrix(dplyr::select(countdata_df, -Geneid))
row.names(countdata) <- countdata_df$Geneid

# Es necesario que la columna que contiene los nombres de las muestras se llame "names"

coldata <- data.frame(names = factor(colnames(countdata)),
                      cell = factor(c("G1E", "G1E", "MK", "MK")))
row.names(coldata) <- coldata$names

Matriz de conteos

Se muestra la matriz de conteos.

Por lo que entendí, una matriz de conteos es una tabla donde se muestran los recuentos de expresión génica para cada gen. Los recuentos pueden ser el número de lecturas de secuenciación que se alinean a dicho gen o el número de fragmentos de secuencias.

Code
kable(countdata, align = "c") %>% kable_styling(c("striped", "hover"), full_width = F)%>% scroll_box(width="100%", height="300px", fixed_thead = TRUE)
G1E_rep1 G1E_rep2 MK_rep1 MK_rep2
NM_001024952 9 8 0 1
NM_080844 0 0 0 0
MSTRG.7.1 7 22 27 0
MSTRG.8.1 8 10 40 0
MSTRG.1.1 10 8 4 0
MSTRG.9.1 18 6 0 0
MSTRG.26.1 4 51 0 0
MSTRG.27.1 18 41 5 0
NR_002840 9 22 15 0
NR_028543 0 0 0 0
MSTRG.20.2 0 0 0 0
MSTRG.20.1 6 11 0 0
NR_131029 0 0 0 0
NR_131030 0 0 0 0
NR_131028 0 0 0 0
NM_001159930 0 0 0 0
MSTRG.22.1 112 334 119 3
MSTRG.23.1 245 400 119 0
MSTRG.31.1 19 15 0 0
MSTRG.32.1 213 291 48 5
MSTRG.32.2 0 0 0 0
MSTRG.33.1 70 139 15 0
MSTRG.34.1 61 101 79 1
NM_173424 1 0 0 0
MSTRG.28.1 1 3 0 0
MSTRG.28.2 0 0 0 0
MSTRG.28.3 0 5 0 0
NM_172644 4 5 0 0
MSTRG.3.1 671 939 173 3
MSTRG.4.1 3 7 0 0
MSTRG.5.1 3 18 14 0
NM_001039482 4 1 10 0
MSTRG.24.1 0 0 0 7
NM_199028 7 2 1 0
MSTRG.11.1 375 607 531 6
NM_009846 87 126 0 0
NR_033558 0 0 0 0
MSTRG.14.1 105 154 29 1
MSTRG.14.2 1405 1564 210 1
MSTRG.16.1 225 286 45 0
MSTRG.17.1 166 182 265 5
MSTRG.18.1 111 126 55 0
MSTRG.6.1 104 56 119 18
NM_026411 2 0 16 0
MSTRG.12.1 22681 31970 79 6
MSTRG.37.1 2 13 0 0
MSTRG.39.1 269 490 3 0
NM_030093 5 1 0 2
MSTRG.41.2 0 0 0 0
MSTRG.41.1 2 1 9 0
MSTRG.41.3 0 1 1 0
MSTRG.42.1 0 1 1 0
MSTRG.42.2 0 0 0 0
MSTRG.43.1 0 0 8 0
MSTRG.43.2 0 0 0 0
NM_010822 2 14 3 0
MSTRG.46.1 5053 6558 808 149
NM_010405 0 0 0 0
NM_001083955 28 21 54 4
NM_001033981 4 1 0 0
NM_175000 0 0 0 0
NM_177364 0 0 0 0
NM_172799 0 0 0 1
MSTRG.47.1 19 17 0 0
NM_008267 25 13 0 0
MSTRG.59.3 61 113 0 0
MSTRG.59.4 0 0 0 0
MSTRG.59.1 18 21 0 0
MSTRG.59.2 0 0 0 0
NR_108029 68 127 0 0
NR_037977 0 0 0 0
NR_029721 0 0 0 0
NM_008270 0 0 0 0
NM_010461 0 1 0 0
NM_010460 1 0 0 0
MSTRG.62.1 0 0 0 0
MSTRG.62.2 0 0 0 0
MSTRG.62.3 3 2 0 0
NM_008374 0 0 0 0
NM_001134458 0 0 0 0
MSTRG.36.1 1857 2110 1375 19
NM_010117 0 0 0 0
NM_001291818 0 0 0 0
MSTRG.45.1 0 0 0 0
MSTRG.45.2 2 1 0 0
NR_104306 0 0 0 0
NM_181569 0 0 0 0
NM_001284360 0 0 0 0
NM_001284359 0 0 0 0
MSTRG.52.1 1 0 0 0
MSTRG.52.5 0 0 0 0
MSTRG.52.3 3 5 6 1
MSTRG.52.2 0 0 0 0
MSTRG.52.4 273 417 165 64
MSTRG.52.7 0 1 0 1
MSTRG.52.6 0 2 0 0
NM_001271018 0 0 0 0
MSTRG.48.1 11092 14273 2 1
MSTRG.50.1 71 98 0 0
MSTRG.60.1 502 690 2 0
MSTRG.55.1 171 186 2 0
MSTRG.56.1 394 1195 567 22
MSTRG.58.1 18 9 0 0
NR_131758 2 1 0 0
MSTRG.63.1 6 13 0 0
NM_001177354 77 50 16 7
NR_003368 0 0 0 0
NR_132747 0 0 0 0
NR_132746 0 0 0 0
MSTRG.68.1 1 7 46 0
MSTRG.69.1 5 11 132 2
MSTRG.70.1 11 44 2 0
MSTRG.71.1 99 205 279 3
NM_010463 0 0 0 0
NM_001024842 1 0 0 0
NM_010462 0 0 0 0
NR_029722 0 0 0 0
MSTRG.77.1 154 174 0 0
NM_008272 9 8 0 0
MSTRG.78.2 140 151 0 0
NM_010466 17 10 0 0
MSTRG.81.1 7 12 0 0
NM_010465 24 55 0 0
MSTRG.80.1 11 12 0 0
NM_175730 20 19 0 0
NR_030526 21 32 0 0
MSTRG.89.1 6 17 0 0
NM_013553 68 104 0 0
MSTRG.92.1 39 97 17 0
MSTRG.65.3 0 0 0 0
MSTRG.65.2 0 0 0 0
MSTRG.65.1 0 0 0 0
MSTRG.66.1 4 11 48 2
NR_047528 0 0 0 0
MSTRG.73.1 8 20 5 0
MSTRG.79.1 1793 1751 2 4
MSTRG.74.1 1 7 0 0
MSTRG.75.1 1516 1618 4 1
MSTRG.82.2 0 2 0 0
MSTRG.82.1 0 0 0 0
MSTRG.82.3 0 0 0 0
MSTRG.82.5 0 0 0 0
MSTRG.82.4 5 0 0 0
MSTRG.82.6 0 0 0 0
MSTRG.87.1 1980 2517 0 0
MSTRG.88.1 44 159 0 0
MSTRG.90.1 21 66 0 0
MSTRG.85.1 100 218 1 0
MSTRG.84.1 82 99 0 0
MSTRG.91.1 89 231 0 1
MSTRG.95.1 758 963 1 1
MSTRG.97.1 8 7 0 0
MSTRG.97.2 217 284 0 0
MSTRG.93.1 132 85 6 1
NR_045743 0 4 0 0
MSTRG.94.1 46 95 39 0
NM_007757 634 495 17 2
NM_171826 0 0 0 0
NM_001252451 0 0 0 0
NM_001252450 0 0 0 0
NM_172469 0 0 0 0
MSTRG.108.1 142 246 1347 15
MSTRG.110.1 249 199 659 49
MSTRG.111.1 24 36 56 2
MSTRG.112.1 41 98 41 2
MSTRG.113.1 20066 23364 27300 3946
MSTRG.104.1 1 0 170 21
NM_001271687 0 0 0 0
NM_001271690 0 0 0 0
NM_001271692 0 0 0 0
NM_001271694 0 0 0 0
NM_019664 0 0 0 0
NM_001271695 0 0 0 0
NM_001271693 0 0 0 0
NM_001271691 0 0 0 0
NM_001271689 0 0 0 0
NM_001039057 0 0 0 0
NM_001039056 0 0 0 0
MSTRG.106.1 181 251 246 0
MSTRG.107.1 9 23 40 1
MSTRG.98.1 0 0 1 0
MSTRG.99.1 0 0 2 0
NM_001033404 1 0 0 0
NM_175011 0 0 0 0
MSTRG.100.1 68667 77846 2722 86
NM_001162955 0 0 0 0
MSTRG.103.1 226 358 80 8
NM_147001 0 0 0 0
NM_009821 0 0 0 0
NM_001111023 0 0 0 0
NM_001111022 0 0 0 0
NM_001111021 0 0 0 0
NM_001302154 0 0 0 0
NM_001302153 0 0 0 0
NM_133659 0 0 0 0
NM_001302183 0 0 0 0
NM_001302179 0 0 0 0
NM_001302152 0 0 0 0
MSTRG.115.1 1 6 70 0
NM_178652 0 0 0 0
NM_001271631 0 0 0 0
NM_001271630 0 0 0 0
NM_001145920 0 0 0 0
NM_009820 0 0 0 0
NM_001271627 0 0 0 0
NM_001146038 0 0 0 0
MSTRG.116.1 445 449 236 6
NM_029257 1 0 0 0
NM_010721 38 32 10 3
MSTRG.122.1 31 40 19 0
MSTRG.122.2 10 31 2 0
MSTRG.124.1 305 247 42 6
MSTRG.124.2 0 0 0 0
MSTRG.126.1 851 1401 208 15
NM_177115 0 4 0 0
MSTRG.119.1 27 58 39 1
MSTRG.120.1 5 4 1 1
MSTRG.123.1 2 22 2 0
NM_008275 0 0 2 0
NM_008274 0 0 0 0
NR_073086 0 0 0 1
NM_008273 0 0 0 0
NM_013554 0 0 0 1
NM_013555 0 0 0 0
MSTRG.129.1 16 15 0 0
MSTRG.129.2 4 2 0 0
NM_010468 0 0 0 0
NM_001290731 7 4 0 0
NM_008276 0 0 0 0
NM_001290730 0 0 0 0
NM_010469 0 2 0 0
NR_029566 0 0 0 0
NR_110447 0 0 0 0
NM_010467 0 0 0 0
NM_001077514 0 0 0 0
NM_011393 0 0 0 0
NM_001077515 0 0 0 0
MSTRG.128.1 0 0 0 5
MSTRG.137.1 229 467 1266 19
MSTRG.138.1 396 729 750 25
MSTRG.140.1 5 18 1 0
MSTRG.139.1 3 5 4 1
NM_007967 0 0 6 3
NR_027899 0 0 0 0
MSTRG.131.2 13 11 0 0
MSTRG.131.3 113 163 0 0
MSTRG.134.1 987 952 0 0
MSTRG.135.1 13 14 0 0
NR_110445 1 0 0 0
NM_001177785 0 0 0 0
NM_001177787 0 0 0 0
NM_009851 0 0 0 0
NM_001177786 0 0 0 0
NM_001039151 0 0 0 0
NM_001039150 0 0 0 0
NM_001111026 0 0 0 0
NM_001111027 0 0 0 0
NM_009822 0 0 0 0
MSTRG.142.1 909 1635 552 1
MSTRG.142.2 1 0 0 0
MSTRG.142.3 0 0 0 0
NM_001304555 0 0 0 0
NM_009185 0 0 0 0
NM_001304559 0 0 0 0
NM_001304553 0 0 0 0
NM_001304551 0 0 0 0
NM_011527 14 18 26 11
MSTRG.150.2 47 69 68 8
NM_001287388 0 0 0 0
MSTRG.152.1 1 2 0 0
NM_026018 0 0 0 0
NM_001164558 0 0 0 0
NM_001164557 0 0 0 0
NR_131922 2 0 57 0
NM_025647 17 36 14 0
MSTRG.144.1 340 635 18 0
MSTRG.145.1 13 14 1 0
MSTRG.146.1 373 493 100 0
MSTRG.151.1 42554 41020 7676 617
MSTRG.153.1 1008 1529 393 12
MSTRG.154.1 2865 2689 820 17
MSTRG.149.2 0 0 0 0
MSTRG.149.1 0 1 2 0
NM_001003947 0 0 1 0
MSTRG.155.1 0 0 0 0
MSTRG.155.3 0 0 0 0
NM_009141 2 2 48 0
NM_023785 0 0 194 4
NM_019932 1 3 505 3
NM_203320 3 1 0 0
NM_011339 0 0 8 0
MSTRG.162.1 0 0 0 6
MSTRG.166.1 1721 3043 2152 55
NM_031408 264 230 164 5
MSTRG.169.1 34298 39464 18665 1336
NM_031404 4 7 0 0
NM_015799 0 0 0 0
NM_001289509 0 0 0 0
NM_001289511 0 0 0 0
NM_001289507 0 2 0 0
MSTRG.179.1 2195 2118 40 2
MSTRG.172.1 11 17 12 0
MSTRG.175.1 54 47 17 0
MSTRG.176.1 29 63 59 2
MSTRG.183.1 357 459 171 8
MSTRG.181.1 93 140 3 2
MSTRG.182.1 677 620 114 23
MSTRG.187.1 228 363 43 2
MSTRG.187.3 1 2 0 0
MSTRG.187.2 0 0 0 0
MSTRG.187.4 1 5 0 0
MSTRG.187.5 17 25 1 0
MSTRG.184.1 3 1 29 0
MSTRG.189.1 1 9 27 1
MSTRG.191.1 8218 37329 101935 754
MSTRG.192.1 85704 188296 253635 11114
NM_007984 1 0 0 0
MSTRG.197.1 1644 1591 1460 147
MSTRG.198.1 4480 6473 1174 93
NR_040686 0 0 0 0
NR_040429 0 0 6 0
MSTRG.201.1 8 36 31 0
MSTRG.202.1 22 79 47 0
MSTRG.203.1 16249 22268 6590 13
MSTRG.147.1 0 0 43 0
MSTRG.157.1 0 0 0 0
MSTRG.157.2 28 37 19266 468
MSTRG.161.1 73 160 63261 856
MSTRG.163.1 18 42 800 41
NM_011741 1 1 0 2
NM_007942 0 0 0 0
NM_001312875 0 0 0 0
NM_028753 15 13 7 0
MSTRG.167.2 111 86 0 0
MSTRG.167.1 0 0 0 0
MSTRG.167.3 0 0 0 0
NM_010312 41 18 2 7
NR_105846 0 0 0 0
MSTRG.186.1 31 54 0 1
MSTRG.186.2 1 4 0 0
MSTRG.186.3 0 0 0 0
NM_001122730 0 0 0 0
NM_178242 0 0 0 0
MSTRG.180.1 3 7 0 0
MSTRG.171.1 156 133 38 1
MSTRG.173.1 10 20 5 0
MSTRG.174.1 11 13 1 0
MSTRG.177.1 0 0 0 6
NM_001033312 1 0 0 9
NM_007393 121 133 486 7
MSTRG.194.1 1 0 31 0
MSTRG.195.1 1 0 97 16
NM_207110 0 0 0 0
NM_080561 0 0 0 0
NR_102383 0 0 0 0
NR_102384 0 0 0 0
NM_001313894 0 0 1 6
NM_010439 1 2 0 0
NR_015478 0 0 0 0
NM_133933 11 6 3 0
MSTRG.199.1 1 8 0 0
MSTRG.204.1 26 35 0 0
MSTRG.208.1 4 14 0 0
MSTRG.209.1 21 28 0 0
MSTRG.210.1 15 24 0 9
MSTRG.211.1 14 18 3 0
MSTRG.212.1 21 37 0 0
MSTRG.213.1 21 32 1 1
MSTRG.214.1 326 376 0 0
MSTRG.215.1 378 702 18 1
MSTRG.215.2 11 15 15 0
MSTRG.215.3 3 11 0 0
NM_008090 316 224 17 2
NM_019964 2 0 0 0
MSTRG.223.1 2633 3146 728 14
MSTRG.206.1 1795 2847 3755 41
NR_105795 0 6 0 0
MSTRG.216.1 65 48 0 0
MSTRG.221.1 233983 233798 13104 1015
NM_023060 4 0 1 0
MSTRG.217.1 7 0 0 0
MSTRG.219.1 3 12 2 0
MSTRG.229.2 58 49 32 1
MSTRG.229.1 4674 7074 15880 994
MSTRG.225.1 2 0 0 0
MSTRG.227.1 2 5 73 5
MSTRG.231.1 0 0 0 0
MSTRG.231.2 0 0 0 0
NM_013616 0 0 0 0
NM_147119 0 0 0 0
MSTRG.218.1 83 599 162 0
NM_146821 0 0 0 0
NM_147098 0 0 0 0
NM_013621 0 0 0 0
NM_013620 0 0 0 0
NM_013619 0 0 0 0
NM_016956 2 0 15 0
NM_001278161 11 8 17 7
NM_001127686 0 0 0 0
NM_008219 0 0 0 0
NM_008221 0 0 1 0
NM_013618 0 0 0 0
NM_013617 1 0 0 0
MSTRG.234.1 20 36 32 2
MSTRG.235.1 45 71 21 0
MSTRG.232.1 7 12 13 0
MSTRG.237.1 154 292 15 0
MSTRG.238.1 168 241 30 0
MSTRG.239.1 43 55 0 0
MSTRG.240.1 0 2 0 0
NM_133224 22 15 15 0
NM_198101 19 15 0 0
NM_020028 1 2 0 0
NM_001024954 0 0 0 0
MSTRG.242.1 4 0 31 1
MSTRG.248.1 0 0 0 0
MSTRG.248.2 9 13 9 2
MSTRG.255.1 7627 12787 8783 73
NM_032004 33 19 274 23
MSTRG.258.1 12 8 8 3
MSTRG.258.3 0 0 0 0
MSTRG.258.2 0 0 0 0
MSTRG.258.4 0 0 0 0
MSTRG.259.1 23 57 0 0
MSTRG.263.1 1434 1415 14 4
NM_026014 59 54 0 2
MSTRG.270.1 7639 18610 9063 381
MSTRG.272.1 3 2 0 0
MSTRG.272.2 44 64 100 10
MSTRG.273.2 0 0 0 0
MSTRG.273.1 0 0 0 0
NM_021502 5 2 0 0
MSTRG.276.1 0 1 57 0
MSTRG.280.1 1115 1680 2242 207
MSTRG.280.2 6 7 0 0
MSTRG.280.3 0 0 0 0
MSTRG.278.1 3 14 0 0
NM_144932 0 0 0 0
NM_001200023 7 0 0 0
NM_177899 4 1 0 3
MSTRG.244.1 704 576 118 22
MSTRG.244.3 1 6 0 0
MSTRG.244.2 0 0 0 0
MSTRG.244.4 0 0 0 0
MSTRG.245.1 203 642 197 9
MSTRG.249.2 1 6 0 0
MSTRG.249.1 0 0 0 0
MSTRG.249.3 15 24 1 0
MSTRG.251.2 0 0 0 0
MSTRG.251.1 2 5 1 0
MSTRG.253.1 30 47 14 0
MSTRG.246.1 108 84 5 1
MSTRG.246.2 7 11 5 0
NM_026818 0 0 9 1
NM_023312 9 18 44 0
NM_001113346 0 0 0 0
NM_145596 0 0 0 0
NM_001286450 0 0 0 0
NM_001037298 23 13 143 13
MSTRG.264.1 0 4 29 0
MSTRG.265.1 0 2 26 0
MSTRG.260.1 0 0 8 0
MSTRG.261.1 0 6 5 0
MSTRG.266.1 38325 39909 2392 156
MSTRG.268.1 31413 32063 3343 337
NM_009698 1 3 0 0
MSTRG.269.1 0 8 0 0
NM_016722 0 0 0 0
NM_001193645 0 0 0 0
MSTRG.275.1 45 85 86 0
NM_001007462 0 1 0 2
NR_105821 0 0 0 0
NM_177289 0 0 0 0
NM_001109873 0 0 0 0
NM_009824 8 2 2 0
MSTRG.277.1 6 6 14 0
MSTRG.282.1 12 17 79 0
MSTRG.283.1 109 175 136 0
MSTRG.284.3 0 0 0 0
MSTRG.284.2 0 0 0 0
MSTRG.284.1 0 0 0 0
MSTRG.288.3 0 0 0 0
MSTRG.288.2 0 0 0 0
MSTRG.288.1 0 0 0 0
NM_025977 0 0 0 0
NM_001164614 0 0 0 0
NM_001290299 0 0 0 0
NM_144935 0 0 0 0
NM_025870 101 102 85 0
MSTRG.294.1 12420 16940 11883 715
MSTRG.296.1 0 0 69 0
NM_008925 0 0 0 0
NM_001293651 0 0 0 0
NM_001293650 0 0 0 0
MSTRG.306.2 0 0 0 0
MSTRG.306.1 0 0 0 0
MSTRG.306.3 0 0 0 0
MSTRG.301.1 0 0 41 0
MSTRG.302.1 0 0 77 0
NM_019659 0 0 0 0
NM_001168354 0 0 0 0
MSTRG.308.1 3 15 133 12
MSTRG.309.1 287 420 5268 111
MSTRG.310.1 1 0 0 11
MSTRG.311.1 207 407 2999 46
MSTRG.313.1 2 0 65 0
MSTRG.314.1 2 4 178 9
NM_031874 1 0 5 1
NM_001253869 0 0 0 0
NM_178577 0 0 0 0
NR_045606 0 0 0 2
NM_001253870 0 0 0 0
NM_001253868 0 0 0 0
NM_001253867 0 0 0 0
MSTRG.290.1 0 4 0 0
MSTRG.291.1 15 3 0 1
MSTRG.292.1 7 12 20 9
MSTRG.298.1 0 1 0 0
MSTRG.298.4 0 0 0 0
MSTRG.298.3 0 0 0 0
MSTRG.298.2 0 0 0 0
MSTRG.299.1 322 295 148 6
NR_132099 0 0 0 0
MSTRG.285.1 110 143 16 0
MSTRG.287.1 62 83 54 3
NM_010149 15 16 43 0
NM_023622 0 0 1 0
NM_029939 0 0 0 0
NM_001163787 0 0 0 0
MSTRG.304.1 0 0 0 0
MSTRG.304.2 0 0 0 0
MSTRG.304.3 0 0 0 0
MSTRG.304.4 0 0 0 0
NM_010487 0 1 0 2
NM_177318 0 0 0 0
NM_001310759 0 0 0 0
NR_030448 0 0 0 0
NM_010605 0 0 0 0
NM_008026 5 8 23 7
MSTRG.312.1 6 15 500 49
NM_138604 0 0 0 0
NM_001290536 0 0 0 0
NM_001290537 0 0 0 0
NM_138606 4 3 6 0
NM_001083937 0 0 0 0
NM_078484 0 0 0 0
MSTRG.328.1 9891 11411 9337 283
MSTRG.329.1 51 144 12 0
NR_132589 0 0 0 0
NM_011591 0 0 0 0
NM_001313693 0 0 0 0
NM_013892 0 0 1 0
MSTRG.333.1 359 639 105 48
MSTRG.334.1 43 99 16 0
MSTRG.335.1 102 191 0 0
MSTRG.335.2 0 0 0 0
MSTRG.340.1 5064 6160 16401 3518
MSTRG.338.1 1 5 12 0
MSTRG.343.1 30 22 3 0
MSTRG.343.2 0 0 0 0
NR_131207 1 0 0 0
MSTRG.353.1 2 4 0 0
MSTRG.353.2 7 4 4 0
MSTRG.355.1 159 421 106 1
MSTRG.356.1 220 251 89 15
MSTRG.356.2 2 5 0 0
MSTRG.356.4 0 1 0 0
MSTRG.356.3 0 0 0 0
MSTRG.356.5 22 59 4 0
MSTRG.356.7 0 0 0 0
MSTRG.356.6 5 8 0 0
MSTRG.356.10 0 0 0 0
MSTRG.356.12 0 0 0 0
MSTRG.356.8 21 31 0 0
MSTRG.356.9 0 0 0 0
MSTRG.356.11 0 0 0 0
MSTRG.356.13 0 0 0 0
MSTRG.356.15 0 0 0 0
MSTRG.356.14 0 0 0 0
NM_009767 0 0 0 0
NM_009440 0 0 0 0
NR_002844 1 7 145 0
MSTRG.347.1 0 2 618 3
MSTRG.348.1 0 0 52 0
MSTRG.349.1 1 1 89 0
MSTRG.350.1 0 2 155 10
NR_015508 0 0 0 2
NR_033398 4 0 0 0
NR_037298 0 0 0 0
MSTRG.316.1 9047 11590 7512 644
MSTRG.317.1 25 39 3 0
MSTRG.318.3 0 0 0 0
MSTRG.318.2 0 0 0 0
MSTRG.318.1 16 16 82 1
MSTRG.320.1 25 27 286 13
MSTRG.325.1 1121 1148 639 36
MSTRG.325.2 55 93 88 2
MSTRG.325.3 0 0 0 0
NM_019478 0 0 0 0
NM_001252528 0 0 0 0
NM_001252529 0 0 0 0
MSTRG.331.1 9107 11549 7682 576
MSTRG.322.1 0 0 52 6
MSTRG.323.1 0 0 83 9
NM_181548 0 0 0 0
NM_010413 0 0 0 0
NM_001130416 0 0 0 0
NM_008089 13 14 15 3
MSTRG.341.1 20 39 19 1
MSTRG.336.1 10 14 6 0
NM_027227 0 2 0 0
NM_001290716 0 0 0 0
NM_011514 0 0 0 0
MSTRG.352.1 9 18 0 0
NR_015505 9 8 0 0
MSTRG.346.2 0 0 0 0
MSTRG.346.1 1 2 0 0
NR_001570 0 0 0 0
NR_001463 0 5 0 0
MSTRG.344.1 29 95 0 0
MSTRG.357.1 5 12 1 0
MSTRG.361.1 17 7 79 5
MSTRG.362.1 0 1 23 0
MSTRG.358.1 0 0 33 0
MSTRG.359.1 0 0 27 0
NR_028381 0 0 1 0
NR_028380 0 0 0 0
NR_030558 0 0 0 0
NR_030418 0 0 0 0

Información de la condición experimental

Code
kable(coldata, align = "c") %>% kable_styling(c("striped", "hover"), full_width = F)%>% scroll_box(width="50%", height="200px", fixed_thead = TRUE)
names cell
G1E_rep1 G1E_rep1 G1E
G1E_rep2 G1E_rep2 G1E
MK_rep1 MK_rep1 MK
MK_rep2 MK_rep2 MK

DESeqDataSet

Con la matriz de conteos y la tabla con la información de la condición experimental (en este caso línea celular) se crea un objeto de la clase DESeqDataSet, el cual tiene una fórmula de diseño asociada. La formula de diseño indica qué columnas de la tabla de información de las muestras especifican el diseño experimental y cómo se deben utilizar estos factores en el análisis. Aquí se usa la formula design = ~ cell. A continuación se muestra la información del objeto generado.

Code
dds <- DESeqDataSetFromMatrix(countData = countdata,
                              colData = coldata,
                              design = ~ cell)

dds$cell <- relevel(dds$cell, "MK")
dds
class: DESeqDataSet 
dim: 629 4 
metadata(1): version
assays(1): counts
rownames(629): NM_001024952 NM_080844 ... NR_030558 NR_030418
rowData names(0):
colnames(4): G1E_rep1 G1E_rep2 MK_rep1 MK_rep2
colData names(2): names cell

A partir de este objeto se puede acceder a la matriz de conteos por medio de las funciones counts(dds) o assay(dds); y a la tabla con la información de las muestras con colData(dds).

Filtro preliminar

Dado que en la matriz de conteos existen muchas filas que sólo contienen ceros, estas se eliminan.

# Número inicial de filas 
nrow(dds)
[1] 629
keep <- rowSums(counts(dds))>1
dds <- dds[keep, ]
# Número de filas después del filtro
nrow(dds)
[1] 359

Normalización y transformaciones

La normalización en DESeq es crucial ya que los datos de cuentas crudas de RNA-seq pueden estar sujetos a variaciones técnicas y biológicas que pueden dificultar la comparación entre las muestras. La normalización tiene como objetivo corregir estas variaciones para que los datos sean más comparables y se puedan realizar análisis de expresión diferencial más confiables.

DESeq utiliza un enfoque llamado “normalización de factores de tamaño” para lograr esto. El proceso general de normalización en DESeq involucra los siguientes pasos:

1. Cálculo de factores de tamaño (size factor): Para cada muestra, se calcula un “factor de tamaño” que ajusta los conteos brutos para reflejar la cantidad total de lecturas secuenciadas en esa muestra en relación con la cantidad total de lecturas en todas las muestras. Los factores de tamaño son esenciales para tener en cuenta las diferencias en la profundidad de secuenciación entre las muestras. El factor de tamaño para la \(j\)-ésima columna (muestra) está dado por:

2. Aplicación de factores de tamaño: Se aplican los factores de tamaño a los datos de conteo de cada muestra, dividiendo las cuents crudas por el factor de tamaño correspondiente. Esto tiene el efecto de normalizar los datos para que sean comparables entre todas las muestras.

A menudo, después de la normalización, a los datos se les aplica alguna transformación para reducir la heterocedasticidad y hacer que los datos sean más adecuados para análisis estadísticos posteriores. DESeq2 cuenta con dos transformaciones para datos de conteo que estabilizan la varianza: variance stabilizing transformation (VST) y la regularized-logarithm transformation (rlog).

Gráfica de medias y desviación estándar, alta heterocedasticidad.

Code
meanSdPlot(counts(dds), ranks = FALSE)

A continuación se aplica la normalización a la matriz de cuentas crudas, además de aplicar las transformaciones VST y rlog (el diseño del experimento no contribuye a la tendencia esperada media-varianza). Para mostrar los efectos de las transformaciones se hace un scatterplot de las primeras dos muestras con los valores obtenidos.

Code
# Normalización 
dds <- estimateSizeFactors(dds)
# variance stabilizing transformation (VST), la función vst() se utiliza para conjuntos con muchos datos, en esta caso utilizamos la siguiente función:
vsd <- varianceStabilizingTransformation(dds, blind = FALSE)
# regularized-log transformation (rlog)
rld <- rlog(dds, blind=FALSE)
Code
# Juntar los datos de las tres normalizaciones
df <- bind_rows(
  as_tibble(log2(counts(dds, normalized=TRUE)[, 1:2]+1)) %>%
         mutate(transformation = "log2(x + 1)"),
  as_tibble(assay(vsd)[, 1:2]) %>% mutate(transformation = "vst"),
  as_tibble(assay(rld)[, 1:2]) %>% mutate(transformation = "rlog"))

# Renombrar columnas
colnames(df)[1:2] <- c("x", "y")  

# Nombre de las graficas
lvls <- c("log2(x + 1)", "vst", "rlog")

# Agrupar los tres tipos de normalizacion en grupos como factores
df$transformation <- factor(df$transformation, levels=lvls)

# Plotear los datos
ggplot(df, aes(x = x, y = y)) + 
  geom_hex(bins = 80) +
  coord_fixed() + 
  facet_grid( . ~ transformation)

Exploración de datos

Distancia entre las muestras

Inicialmente se evalúa la similitud general entre las muestras visualizando las matrices de distancias con la función pheatmat(). Al calcular la matriz de distancias es necesario brindar la matriz transpuesta de los conteos, pues las funciones dist() y PoissonDistance() calculan las distancias entre las filas. A continuación se muestran los heatmaps para las métricas Euclidiana, basada en la correlación de Pearson y la distancia de Poisson.

Heatmap con la métrica Euclidiana sobre las cuentas crudas.

Code
# Se encuentra la matriz de distancias
sample_dist_euc_raw <- dist(t(assay(dds)))

sampleDistMatrix_euc_raw <- as.matrix(sample_dist_euc_raw)
colors <- colorRampPalette( rev(brewer.pal(9, "Blues")) )(255)
pheatmap(sampleDistMatrix_euc_raw,
         clustering_distance_rows = sample_dist_euc_raw,
         clustering_distance_cols = sample_dist_euc_raw,
         col = colors)

Para que se tenga una contribución approximadamente igual de todos los genes, se consideran los datos transformados por VST (almacenados en el objeto vsd) y se calcula la distancia Euclidiana.

Code
# Se encuentra la matriz de distancias
sample_dist_euc_vst <- dist(t(assay(vsd)))
sampleDistMatrix_euc_vst <- as.matrix(sample_dist_euc_vst)
colors <- colorRampPalette( rev(brewer.pal(9, "Blues")) )(255)
pheatmap(sampleDistMatrix_euc_vst,
         clustering_distance_rows = sample_dist_euc_vst,
         clustering_distance_cols = sample_dist_euc_vst,
         col = colors)

Code
# Se encuentra la matriz de distancias
sample_dist_pear_vst <- get_dist(t(assay(vsd)), method = "pearson")

sampleDistMatrix_pear_vst <- as.matrix(sample_dist_pear_vst)
colors <- colorRampPalette( rev(brewer.pal(9, "Blues")) )(255)
pheatmap(sampleDistMatrix_pear_vst,
         clustering_distance_rows = sample_dist_pear_vst,
         clustering_distance_cols = sample_dist_pear_vst,
         col = colors)

Otra opción para calcular distancias de muestra es utilizar la distancia de Poisson, implementada en el package PoiClaClu. Esta medida de disimilitud entre conteos también tiene en cuenta la estructura de varianza inherente de las cuentas al calcular las distancias entre muestras. La función PoissonDistance toma la matriz de conteos original (no normalizada) con las muestras como filas en lugar de columnas.

Code
# Se encuentra la matriz de distancias
sample_dist_pois <- PoissonDistance(t(counts(dds)))

sampleDistMatrix_pois <- as.matrix(sample_dist_pois$dd)
rownames(sampleDistMatrix_pois) <- dds$names
colnames(sampleDistMatrix_pois) <- dds$names
colors <- colorRampPalette( rev(brewer.pal(9, "Blues")) )(255)
pheatmap(sampleDistMatrix_pois,
         clustering_distance_rows = sample_dist_pois$dd,
         clustering_distance_cols = sample_dist_pois$dd,
         col = colors)

En las gráficas anteriores se observa que cuando no se realiza la normalización y transformación de los datos los resultados del análisis de distancias pueden tener errores. Como es el caso del análisis con distancias Eucllidianas sin transformar en el que pareciera que las replicas de la línea celular MK no son nada parecidas. Mientras que al analizar las líneas celulares con la transformación VST aumenta la similitud entre las réplicas, aunque se observa que las réplicar de G1E son más parecidas entre sí que las de MK. Con la correlación de Pearson se obtienen los valores más altos mayores.

PCA

DESeq2 cuenta con la función plotPCA() la cual lleva a cabo un análisis de componentes principales considerando como variables los transcritos (toma por default los primeros ntop=500) y como observaciones las muestras. El resultado es la gráfica de los scores en el subespacio generado por las dos primeras componentes principales.

Code
plotPCA(vsd , intgroup="cell")

En esta gráfica se observa que las réplicas de G1E son muy parecidas entre sí, mientras que las de MK no.

O bien, podemos utilizar el script que desarrollamos previamente, nótese que es necesario aplicar la función sobre la matriz transpuesta de las cuentas (en este caso las correspondientes a VST)

En este caso, los dos primeros componetes explican alrededor del 90% de la variación. El análisis de PCA puede ayudar a identificar patrones de variación en la expresión génica entre las diferentes líneas celulares. Al proyectar los datos de transcritos en un espacio de menor dimensión se puede revelar la variación y agrupar las muestras (G1E y MK ambas con dos réplicas) en función de su similitud. Además, el PCA puede proporcionar información sobre los transcritos que contribuyen más a la variación, y de esta forma pueden ayudar a identificar genes entre las líneas estudiadas.

Análisis de expresión diferencial

El análisis de expresión diferencial se lleva a cabo sobre las cuentas originales por medio de la función DESeq:

dds <- DESeq(dds)
using pre-existing size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
dds
class: DESeqDataSet 
dim: 359 4 
metadata(1): version
assays(4): counts mu H cooks
rownames(359): NM_001024952 MSTRG.7.1 ... MSTRG.358.1 MSTRG.359.1
rowData names(22): baseMean baseVar ... deviance maxCooks
colnames(4): G1E_rep1 G1E_rep2 MK_rep1 MK_rep2
colData names(3): names cell sizeFactor

Esta función muestra mensajes de los pasos realizados (ver ?DESeq). Los cuales son: estimar los factores de tamaño (controlando las diferencias en la profundidad de secuenciación de las muestras), la estimación de los valores de dispersión para cada gen y el ajuste de un modelo lineal generalizado.

El objeto generado es de la clase DESeqDataSet que contiene todos los parámetros ajustados y tablas de resultados.

Tabla de resultados

Al llamar los resultados sin ningún argumento muestra los log2 fold changes y p-values para la última variable en la fórmula del diseño experimental (en este caso sólo es una variable). Si existieran más de dos niveles en esta variable, los resultados mostrarían la tabla de comparación del último nivel respecto al primer nivel.

Code
res <- results(dds)
res
log2 fold change (MLE): cell G1E vs MK 
Wald test p-value: cell G1E vs MK 
DataFrame with 359 rows and 6 columns
              baseMean log2FoldChange     lfcSE       stat    pvalue      padj
             <numeric>      <numeric> <numeric>  <numeric> <numeric> <numeric>
NM_001024952   4.58123      0.0488519   3.18513  0.0153375  0.987763        NA
MSTRG.7.1      6.55401     -0.6334148   2.46508 -0.2569551  0.797213   0.85974
MSTRG.8.1      7.43120     -1.7231046   2.35914 -0.7303961  0.465148   0.57815
MSTRG.1.1      2.54861      0.9148084   3.47067  0.2635829  0.792101        NA
MSTRG.9.1      2.86126      3.1664089   4.01910  0.7878394  0.430791        NA
...                ...            ...       ...        ...       ...       ...
MSTRG.357.1    1.83409        1.62935   3.93965   0.413577 0.6791837        NA
MSTRG.361.1   27.29284       -3.11403   1.34622  -2.313173 0.0207131 0.0515021
MSTRG.362.1    3.26117       -5.11248   4.00011  -1.278084 0.2012196        NA
MSTRG.358.1    4.55392       -6.95601   4.21178  -1.651563 0.0986236        NA
MSTRG.359.1    3.72594       -6.66930   4.53816  -1.469605 0.1416687        NA

La tabla muestra los valores de expresión de G1E con respecto a MK. Los valores positivos indican que los transcritos de G1E tienen mayor expresión que en las líneas de MK. Por el contrario, los valores negativos indican una expresión menor en G1E.

Es posible extraer la tabla como una DataFrame, la cual contiene metadatos con información del significado de las columnas:

Code
res_df <- results(dds, contrast = c("cell", "G1E", "MK"))
# Se crea una versión tibble
res_tibble <- as_tibble(res_df)
#Se crea una data frame usual
res_data_frame <- as.data.frame(res_df)
mcols(res_df, use.names = TRUE)
DataFrame with 6 rows and 2 columns
                       type            description
                <character>            <character>
baseMean       intermediate mean of normalized c..
log2FoldChange      results log2 fold change (ML..
lfcSE               results standard error: cell..
stat                results Wald statistic: cell..
pvalue              results Wald test p-value: c..
padj                results   BH adjusted p-values

La primera columna, baseMean, es el promedio de los valores de las cuentas normalizadas, divididos por los factores de tamaño, tomados de todas las muestras en el DESeqDataSet. Las cuatro columnas restantes se refieren a la comparación del nivel G1E sobre el nivel de referencia MK para la variable cell.

La columna log2FoldChange es la estimación del tamaño del efecto consecuencia de la condición experimental. Nos dice cuánto parece cambiar la expresión del gen entre las líneas celulares. Este valor se reporta en una escala logarítmica en base 2.

La incertidumbre asociada a esta estimación está disponible en la columna lfcSE, que es el error estándar del valor estimado del log2FoldChange.

El propósito de un análisis de expresión diferencial es comprobar si los datos proporcionan evidencia suficiente para concluir que el log2FoldChange es significativamente diferente de cero. DESeq2 realiza para cada transcrito una prueba de hipótesis para ver si la evidencia es suficiente para rechazar la hipótesis nula (que la diferencia de expresión es cero y que la diferencia observada entre líneas celulares es causada simplemente por la variabilidad experimental). Como es habitual en estadística, el resultado de esta prueba se reporta por medio de un p-value. DESeq2 utiliza la corrección de Benjamini-Hochberg (BH) que controla la False Discovery Rate (FDR) : la proporción esperada de falsos positvios entre todas las hipótesis rechazadas, es decir, la FDR mide cuántos de los casos considerados significativos (rechazo de la hipótesis nula) son probablemente falsos. En DESeq se calcula para cada gen un p-value ajustado dado en la columna padj y por default considera un treshold de 0.1 para evaluar la hipótesis.

Podemos resumir los resultados con la siguiente línea de código, que proporciona información adicional.

Code
summary(res)

out of 359 with nonzero total read count
adjusted p-value < 0.1
LFC > 0 (up)       : 55, 15%
LFC < 0 (down)     : 48, 13%
outliers [1]       : 0, 0%
low counts [2]     : 139, 39%
(mean count < 6)
[1] see 'cooksCutoff' argument of ?results
[2] see 'independentFiltering' argument of ?results

Gráficas de resultados

MA plot

El MA plot representa la distribución de los coeficientes estimados en el modelo, es decir, la distribución de los genes o transcritos en las comparaciones de interés. En el eje y, la M corresponde a “minus”, es la diferencia del logaritmo de los valores que es equivalente al logaritmo del cociente. Y en el eje de de las x, A corresponde a average, que es el promedio de las cuentas normalizadas para cada gen en todas las muestras.

Este gráfico se puede generar con la función plotMA() :

Code
plotMA(res)

El log fold change se utiliza para medir la magnitud del cambio en la expresión génica entre MK y G1E. Este se calcula con el logaritmo base 2 de la proporción entre las expresiones génicas en las dos líneas celulares. En la gráfica, un log fold chance negativo indica que la expresión génica es menor en G1E y mayor MK. Mientras que los valores cercanos a 0 indican que no hay cambio en la expresión entre G1E y MK.

O bien, podemos utilizar ggplot2 para generarla y poder modificar los atributos (se muestra una versión básica):

Code
res_tibble <- mutate(res_tibble, isDE=if_else(padj<0.1, "DE", "nDE", missing="nDE"))
res_tibble$isDE <- factor(res_tibble$isDE)
ggplot(res_tibble)+
  geom_point(aes(baseMean, log2FoldChange, color=isDE), size=2, show.legend = TRUE)+
  scale_x_log10()+
  theme_bw()

También es posible generar un MA plot interactivo y gráficas de expresión para genes específicos con el package Glimma, para ello es necesario crear una variable group que corresponda a los niveles asociados al diseño experimental.

group <- colData(dds)$cell
dds$group <- group
glimmaMA(dds)
139 of 359 genes were filtered out in DESeq2 tests

Volcano plot

De manera análoga al MA plot, en el volcano plot se distinguen los genes o transcritos que muestran expresión diferencial entre líneas celulares. En las ordenadas se grafica \(-log_{10}(padj)\) y en las abscisas el log2FoldChange. Este gráfico se puede realizar por medio de la función EnhancedVolcano , a continuación se muestra el volcano plot básico.

Code
EnhancedVolcano(res,
                lab= rownames(res),
                x='log2FoldChange',
                y= 'pvalue')

También es posible utilizar el package Glimma para una versión interactiva del gráfico.

Code
glimmaVolcano(dds)

A partir de los datos podemos generar el plot con ggplot2.

Code
res_tibble <- mutate(res_tibble, neglog10padj=if_else(is.na(padj), 0, -log10(padj)))  
ggplot(res_tibble)+   
  geom_point(aes(log2FoldChange, neglog10padj, color=isDE), size=2, show.legend = TRUE)+   
  theme_bw()

Heatmap

Por medio de un heatmap con agrupamiento podemos visualizar la expresión de los genes diferencialmente expresados en términos de las cuentas normalizadas estandarizadas.

Code
# Se filtran los transcritos con expresión diferencial
significant <- res_data_frame |>  filter(log2FoldChange > 0 & padj < 0.1 |
                                   log2FoldChange < 0 & padj < 0.1)

##Se extrae la matriz de cuentas normalizadas
norm_counts <- counts(dds, normalized = T)

##Se filtran las filas que corresponden a los transcritos significativos
norm_counts <- norm_counts[rownames(significant), ]

##Generar una tabla de anotaciones que incluye el tipo de células
annotation_col <- coldata[, c("names","cell")]
##Generar el heatmap empleando clustering jerarquico
pheatmap(norm_counts, 
         border_color = NA, 
         scale = "row",
         clustering_distance_rows = "euclidean", 
         clustering_distance_cols = "euclidean", 
         clustering_method = "average", 
         show_colnames = T, 
         show_rownames = F, 
         annotation_col = annotation_col)

Esta gráfica nos permite ver la expresión diferencial con los datos normalizados. Se observa que los genes de G1E tienen mayor expresión que los de MK. Por el contrario, MK presenta más genes con subexpresión.

La expresión diferencial tiene gran importancia ya que permite comprender cómo se regulan los genes en distintos tipos celulares. Esta comparación también permite identificar qué genes están activos o silenciados. Además, puede brindar información sobre los procesos biológicos que ocurren en cada línea celular y de esta forma identificar patrones de expresión asociados a enfermedades.

Bibliografía

- González-Villalva, A., Bizarro-Nevares, P., Rojas-Lemus, M., López-Valdez, N., Ustarroz-Cano, M., Barbosa-Barrón, F., García-Gila B., Albarrán-Alonsoa J. C., y Fortoul van der Goes, T. I. 2019. El megacariocito: una célula muy original. Revista de la Facultad de Medicina (México), 62: 6-18.

- Italiano, J. E., y Shivdasani, R. A. 2003. Megakaryocytes and beyond: the birth of platelets. Journal of thrombosis and haemostasis, 1: 1174-1182.

- Love, M. I., Huber, W., y Anders, S. 2014. Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. Genome biology, 15: 1-21.

- Weiss, M. J., Yu, C., y Orkin, S. H. 1997. Erythroid-cell-specific properties of transcription factor GATA-1 revealed by phenotypic rescue of a gene-targeted cell line. Molecular and cellular biology, 17: 1642-1651.

- Wu, W., Morrissey, C. S., Keller, C. A., Mishra, T., Pimkin, M., Blobel, G. A., Weiss M. J., y Hardison, R. C. 2014. Dynamic shifts in occupancy by TAL1 are guided by GATA factors and drive large-scale reprogramming of gene expression during hematopoiesis. Genome research, 24: 1945-1962.