Source: https://github.com/markziemann/bioinformatics_intro_workshop

Introduction

In this workshop, we will start working on some RNA-seq data. Here is the citation:

Cho JW, Shim HS, Lee CY, Park SY et al. The importance of enhancer methylation for epigenetic regulation of tumorigenesis in squamous lung cancer. Exp Mol Med 2022 Jan;54(1):12-22. PMID: 34987166

# install CRAN packages
#install.packages(c("kableExtra","gplots"))

# install bioconductor packages
#if (!require("BiocManager", quietly = TRUE))
#    install.packages("BiocManager")
#BiocManager::install(c("DESeq2","fgsea"))

suppressPackageStartupMessages({
  library("kableExtra")
  library("DESeq2")
  library("gplots")
  library("fgsea")
  library("beeswarm")
})

Download gene expression counts and read the file

Download from NCBI.

DATA="GSE158420.counts.txt.gz"

if ( ! file.exists(DATA) ) {
  download.file("https://www.ncbi.nlm.nih.gov/geo/download/?acc=GSE158420&format=file&file=GSE158420%5Fcounts%2Etxt%2Egz",
    destfile=DATA)
}

Read data. Note that there are a couple of duplicated gene symbols. Here I use aggregate() command to deal with them.

mx <- read.table(DATA,row.names = NULL)
str(mx)
## 'data.frame':    18747 obs. of  75 variables:
##  $ row.names: chr  "OR4F5" "OR4F29" "OR4F16" "LINC00115" ...
##  $ X10N     : int  6 0 0 14 15 1727 43 8 53 98 ...
##  $ X10T     : int  30 6 10 54 115 1232 190 227 215 107 ...
##  $ X11N     : int  10 0 0 66 59 2342 55 57 70 57 ...
##  $ X11T     : int  2 0 0 27 18 3205 74 120 59 68 ...
##  $ X12N     : int  1 0 0 22 15 1563 21 6 28 64 ...
##  $ X12T     : int  2 0 0 31 12 1393 36 20 24 29 ...
##  $ X14N     : int  2 0 0 41 7 1651 49 13 34 43 ...
##  $ X14T     : int  0 0 0 34 18 2373 55 45 87 282 ...
##  $ X15N     : int  2 0 0 37 3 1418 41 7 35 34 ...
##  $ X15T     : int  0 0 0 18 18 1004 33 11 17 52 ...
##  $ X16N     : int  0 0 0 30 12 1939 49 3 69 106 ...
##  $ X16T     : int  0 0 0 44 16 2216 63 25 38 37 ...
##  $ X17N     : int  1 0 0 31 13 1653 39 6 63 76 ...
##  $ X17T     : int  0 0 0 15 12 2787 18 11 9 54 ...
##  $ X18N     : int  0 0 0 18 9 1540 46 9 80 99 ...
##  $ X18T     : int  0 0 5 89 271 994 420 351 64 95 ...
##  $ X19N     : int  0 0 0 22 14 1510 29 8 28 30 ...
##  $ X19T     : int  13 2 0 55 72 2051 149 138 125 70 ...
##  $ X20N     : int  0 0 0 25 16 1656 44 17 83 51 ...
##  $ X20T     : int  4 0 0 43 30 1723 60 21 62 29 ...
##  $ X21N     : int  0 0 0 39 12 1824 47 7 139 705 ...
##  $ X21T     : int  0 0 0 22 30 3537 47 25 34 112 ...
##  $ X22N     : int  0 0 0 25 9 1590 54 15 40 97 ...
##  $ X22T     : int  9 0 0 79 90 5094 90 11 101 95 ...
##  $ X23N     : int  0 0 0 28 25 1499 44 12 79 52 ...
##  $ X23T     : int  0 0 0 31 57 1723 64 46 56 25 ...
##  $ X24N     : int  0 0 0 32 2 1613 44 5 54 86 ...
##  $ X24T     : int  0 0 0 31 15 4485 124 78 249 90 ...
##  $ X25N     : int  0 0 0 34 19 1533 47 13 60 39 ...
##  $ X25T     : int  0 0 0 30 11 2369 59 35 58 49 ...
##  $ X26N     : int  1 0 0 31 16 1407 40 9 44 57 ...
##  $ X26T     : int  6 1 3 31 26 1772 45 36 61 23 ...
##  $ X27N     : int  0 0 0 39 13 2051 74 15 28 48 ...
##  $ X27T     : int  3 0 0 29 29 1808 52 64 81 110 ...
##  $ X28N     : int  0 0 0 13 15 1824 73 11 71 74 ...
##  $ X28T     : int  0 0 0 8 1 3714 35 49 31 60 ...
##  $ X29N     : int  0 0 0 18 28 1591 39 22 62 19 ...
##  $ X29T     : int  0 0 0 29 19 3730 90 55 47 92 ...
##  $ X2N      : int  0 0 0 32 16 1739 54 8 45 118 ...
##  $ X2T      : int  0 0 0 19 15 3025 93 64 100 108 ...
##  $ X30N     : int  0 0 0 23 41 2500 51 21 98 106 ...
##  $ X30T     : int  0 0 1 48 119 5999 231 41 79 44 ...
##  $ X31N     : int  0 0 0 35 14 1729 66 15 51 28 ...
##  $ X31T     : int  0 0 0 24 26 4151 105 103 130 67 ...
##  $ X32N     : int  0 0 0 27 16 1666 59 19 48 45 ...
##  $ X32T     : int  0 0 0 16 4 1195 50 17 10 57 ...
##  $ X33N     : int  0 0 0 46 16 1731 122 23 52 52 ...
##  $ X33T     : int  0 0 0 36 50 2503 49 28 67 48 ...
##  $ X34N     : int  0 0 0 29 16 1745 97 12 60 62 ...
##  $ X34T     : int  0 0 0 39 92 1673 56 3 91 64 ...
##  $ X35N     : int  0 0 0 32 19 1678 31 13 114 689 ...
##  $ X35T     : int  1 0 0 27 43 1709 91 67 134 698 ...
##  $ X36N     : int  0 0 0 17 10 1885 26 14 95 63 ...
##  $ X36T     : int  1 0 0 24 48 1105 142 72 114 269 ...
##  $ X37N     : int  0 0 0 28 7 2478 39 19 59 59 ...
##  $ X37T     : int  0 0 0 7 25 1630 32 9 53 52 ...
##  $ X38N     : int  0 0 0 12 15 1576 24 4 70 110 ...
##  $ X38T     : int  0 0 0 27 85 2113 137 117 107 70 ...
##  $ X39N     : int  1 0 0 10 11 1519 38 12 15 42 ...
##  $ X39T     : int  0 0 0 29 40 2100 80 27 47 33 ...
##  $ X3N      : int  0 0 0 70 6 1788 53 10 48 47 ...
##  $ X3T      : int  0 2 0 53 56 3764 149 188 117 48 ...
##  $ X4N      : int  1 0 0 18 35 2057 47 44 68 44 ...
##  $ X4T      : int  0 0 0 23 28 2110 58 48 42 19 ...
##  $ X5N      : int  0 0 0 53 13 1273 43 2 34 47 ...
##  $ X5T      : int  0 0 0 41 12 2708 62 114 101 382 ...
##  $ X6N      : int  1 0 0 14 11 1478 26 6 48 48 ...
##  $ X6T      : int  0 0 0 29 4 2454 47 52 97 378 ...
##  $ X7N      : int  0 0 0 44 10 1722 49 13 77 75 ...
##  $ X7T      : int  0 0 0 28 21 1892 54 49 64 240 ...
##  $ X8N      : int  23 0 0 53 33 1442 110 51 53 38 ...
##  $ X8T      : int  10 0 0 46 28 1931 72 75 64 83 ...
##  $ X9N      : int  0 0 0 11 16 1701 23 16 43 55 ...
##  $ X9T      : int  0 0 0 15 5 2018 25 13 92 15 ...
which(duplicated(mx$row.names))
## [1]  4765 15632
xa <- aggregate(. ~ row.names,mx,sum)
rownames(xa) <- xa$row.names
str(xa)
## 'data.frame':    18745 obs. of  75 variables:
##  $ row.names: chr  "1-Dec" "1-Mar" "1-Sep" "10-Mar" ...
##  $ X10N     : int  0 431 160 286 3541 0 3164 1 0 1075 ...
##  $ X10T     : int  31 461 131 217 4311 40 2874 72 94 440 ...
##  $ X11N     : int  0 478 280 130 2174 6 4758 10 4 816 ...
##  $ X11T     : int  1 98 131 58 3675 1 1750 12 1 204 ...
##  $ X12N     : int  0 862 132 2 2856 0 5592 1 0 729 ...
##  $ X12T     : int  1 635 383 18 1864 0 4185 3 0 619 ...
##  $ X14N     : int  0 489 381 19 3306 0 3610 0 0 988 ...
##  $ X14T     : int  0 499 124 39 1546 0 2181 10 1 589 ...
##  $ X15N     : int  0 543 114 417 3507 0 5148 0 1 828 ...
##  $ X15T     : int  0 608 217 68 2483 1 3100 1 0 818 ...
##  $ X16N     : int  0 707 258 12 3568 0 4271 0 0 1339 ...
##  $ X16T     : int  0 498 886 90 1294 0 2933 0 3 882 ...
##  $ X17N     : int  0 700 302 9 3658 0 3515 4 1 1192 ...
##  $ X17T     : int  1 411 162 122 542 2 3093 13 2 317 ...
##  $ X18N     : int  0 607 133 123 3337 1 3549 0 0 1108 ...
##  $ X18T     : int  79 446 279 313 1050 38 1356 171 127 554 ...
##  $ X19N     : int  0 608 138 70 4527 0 3569 0 0 1290 ...
##  $ X19T     : int  18 463 88 127 1865 18 2033 61 97 318 ...
##  $ X20N     : int  0 361 239 1481 2656 0 3061 7 2 783 ...
##  $ X20T     : int  1 488 533 1010 1314 0 2811 9 2 759 ...
##  $ X21N     : int  0 615 212 97 4449 1 4153 0 3 1301 ...
##  $ X21T     : int  1 350 53 7 1060 3 1586 2 358 182 ...
##  $ X22N     : int  0 673 258 94 3196 0 3975 0 1 998 ...
##  $ X22T     : int  0 1838 126 21 400 3 1693 10 3 414 ...
##  $ X23N     : int  0 297 197 588 3499 1 4309 3 0 871 ...
##  $ X23T     : int  1 262 229 694 1709 2 3004 1 1 551 ...
##  $ X24N     : int  0 762 137 92 3280 0 3403 0 0 927 ...
##  $ X24T     : int  2 529 236 24 3528 5 2128 36 1 498 ...
##  $ X25N     : int  1 534 132 87 3463 4 2852 0 0 802 ...
##  $ X25T     : int  0 860 66 23 2832 3 4208 2 4 375 ...
##  $ X26N     : int  0 451 98 126 2893 0 4659 3 0 727 ...
##  $ X26T     : int  3 1110 56 368 3445 3 1820 9 1 351 ...
##  $ X27N     : int  0 798 573 192 2442 0 3134 0 1 1092 ...
##  $ X27T     : int  2 380 190 114 3703 4 2245 7 0 480 ...
##  $ X28N     : int  0 572 211 441 3250 0 5131 1 2 1150 ...
##  $ X28T     : int  2 336 75 5 5465 0 2009 86 2 156 ...
##  $ X29N     : int  0 289 79 2242 2028 2 3068 8 3 414 ...
##  $ X29T     : int  0 514 205 19 1971 1 2151 1 1 389 ...
##  $ X2N      : int  0 575 151 23 3502 0 4091 0 3 1056 ...
##  $ X2T      : int  0 257 147 80 2354 0 3502 0 0 404 ...
##  $ X30N     : int  0 464 183 616 2605 1 4596 1 0 836 ...
##  $ X30T     : int  0 483 144 24 934 3 3291 5 1 111 ...
##  $ X31N     : int  0 535 212 589 3291 1 3648 0 1 913 ...
##  $ X31T     : int  2 478 144 28 4226 5 2889 6 8 200 ...
##  $ X32N     : int  0 311 302 48 3135 0 1931 5 0 950 ...
##  $ X32T     : int  0 280 1086 27 1416 0 1278 2 0 155 ...
##  $ X33N     : int  0 630 231 4 3072 0 5982 1 0 1038 ...
##  $ X33T     : int  0 437 363 11 1702 1 2752 6 0 752 ...
##  $ X34N     : int  1 713 185 956 3356 1 3695 1 0 1495 ...
##  $ X34T     : int  0 334 290 13 2515 0 2415 1 0 708 ...
##  $ X35N     : int  0 643 125 640 3034 0 4439 2 0 1104 ...
##  $ X35T     : int  1 789 199 63 2532 1 3526 13 1 948 ...
##  $ X36N     : int  0 286 61 654 3678 1 2726 1 1 1142 ...
##  $ X36T     : int  1 339 355 19 502 6 1806 12 4 612 ...
##  $ X37N     : int  0 488 59 1234 1512 0 2326 0 0 419 ...
##  $ X37T     : int  0 320 121 2076 1324 6 2052 0 0 413 ...
##  $ X38N     : int  0 427 92 380 2684 0 3143 0 0 829 ...
##  $ X38T     : int  4 507 203 185 2542 9 2961 22 12 841 ...
##  $ X39N     : int  0 695 329 43 1770 1 2849 1 2 671 ...
##  $ X39T     : int  1 458 174 135 1446 2 2355 10 1 1100 ...
##  $ X3N      : int  1 628 120 11 2921 0 5548 0 1 797 ...
##  $ X3T      : int  3 287 114 63 1688 10 2582 25 9 257 ...
##  $ X4N      : int  0 305 119 323 2692 2 3613 8 3 762 ...
##  $ X4T      : int  2 255 59 33 2447 3 1558 17 15 344 ...
##  $ X5N      : int  0 801 144 78 3367 0 5042 1 0 1067 ...
##  $ X5T      : int  8 364 44 63 4396 1 1563 8 4 88 ...
##  $ X6N      : int  2 626 110 28 3830 0 4163 0 1 1024 ...
##  $ X6T      : int  0 320 184 6 2841 0 2520 2 2 216 ...
##  $ X7N      : int  1 638 181 323 2623 2 3087 0 1 1052 ...
##  $ X7T      : int  1 412 327 16 3671 1 2413 7 4 629 ...
##  $ X8N      : int  17 264 101 185 1614 7 2039 37 44 376 ...
##  $ X8T      : int  2 436 217 168 2102 9 1930 20 11 307 ...
##  $ X9N      : int  0 504 191 76 3507 0 3858 3 5 973 ...
##  $ X9T      : int  2 317 48 7 2482 5 2377 0 1 232 ...
xa$row.names = NULL

head(xa)
##        X10N X10T X11N X11T X12N X12T X14N X14T X15N X15T X16N X16T X17N X17T
## 1-Dec     0   31    0    1    0    1    0    0    0    0    0    0    0    1
## 1-Mar   431  461  478   98  862  635  489  499  543  608  707  498  700  411
## 1-Sep   160  131  280  131  132  383  381  124  114  217  258  886  302  162
## 10-Mar  286  217  130   58    2   18   19   39  417   68   12   90    9  122
## 10-Sep 3541 4311 2174 3675 2856 1864 3306 1546 3507 2483 3568 1294 3658  542
## 11-Mar    0   40    6    1    0    0    0    0    0    1    0    0    0    2
##        X18N X18T X19N X19T X20N X20T X21N X21T X22N X22T X23N X23T X24N X24T
## 1-Dec     0   79    0   18    0    1    0    1    0    0    0    1    0    2
## 1-Mar   607  446  608  463  361  488  615  350  673 1838  297  262  762  529
## 1-Sep   133  279  138   88  239  533  212   53  258  126  197  229  137  236
## 10-Mar  123  313   70  127 1481 1010   97    7   94   21  588  694   92   24
## 10-Sep 3337 1050 4527 1865 2656 1314 4449 1060 3196  400 3499 1709 3280 3528
## 11-Mar    1   38    0   18    0    0    1    3    0    3    1    2    0    5
##        X25N X25T X26N X26T X27N X27T X28N X28T X29N X29T  X2N  X2T X30N X30T
## 1-Dec     1    0    0    3    0    2    0    2    0    0    0    0    0    0
## 1-Mar   534  860  451 1110  798  380  572  336  289  514  575  257  464  483
## 1-Sep   132   66   98   56  573  190  211   75   79  205  151  147  183  144
## 10-Mar   87   23  126  368  192  114  441    5 2242   19   23   80  616   24
## 10-Sep 3463 2832 2893 3445 2442 3703 3250 5465 2028 1971 3502 2354 2605  934
## 11-Mar    4    3    0    3    0    4    0    0    2    1    0    0    1    3
##        X31N X31T X32N X32T X33N X33T X34N X34T X35N X35T X36N X36T X37N X37T
## 1-Dec     0    2    0    0    0    0    1    0    0    1    0    1    0    0
## 1-Mar   535  478  311  280  630  437  713  334  643  789  286  339  488  320
## 1-Sep   212  144  302 1086  231  363  185  290  125  199   61  355   59  121
## 10-Mar  589   28   48   27    4   11  956   13  640   63  654   19 1234 2076
## 10-Sep 3291 4226 3135 1416 3072 1702 3356 2515 3034 2532 3678  502 1512 1324
## 11-Mar    1    5    0    0    0    1    1    0    0    1    1    6    0    6
##        X38N X38T X39N X39T  X3N  X3T  X4N  X4T  X5N  X5T  X6N  X6T  X7N  X7T
## 1-Dec     0    4    0    1    1    3    0    2    0    8    2    0    1    1
## 1-Mar   427  507  695  458  628  287  305  255  801  364  626  320  638  412
## 1-Sep    92  203  329  174  120  114  119   59  144   44  110  184  181  327
## 10-Mar  380  185   43  135   11   63  323   33   78   63   28    6  323   16
## 10-Sep 2684 2542 1770 1446 2921 1688 2692 2447 3367 4396 3830 2841 2623 3671
## 11-Mar    0    9    1    2    0   10    2    3    0    1    0    0    2    1
##         X8N  X8T  X9N  X9T
## 1-Dec    17    2    0    2
## 1-Mar   264  436  504  317
## 1-Sep   101  217  191   48
## 10-Mar  185  168   76    7
## 10-Sep 1614 2102 3507 2482
## 11-Mar    7    9    0    5

Basic QC - number of reads per sample

Less than 10 million is not acceptable. More than 20 million is considered good.

mycolsums <- colSums(xa)

mycolsums
##     X10N     X10T     X11N     X11T     X12N     X12T     X14N     X14T 
## 25014713 21358077 23719271 23009875 23540231 23439861 22829532 21990640 
##     X15N     X15T     X16N     X16T     X17N     X17T     X18N     X18T 
## 25092201 22135465 27933368 24850610 26095454 24379916 24331203 15718196 
##     X19N     X19T     X20N     X20T     X21N     X21T     X22N     X22T 
## 24878899 21283611 21487092 22777921 27374413 19265745 24658124 25809845 
##     X23N     X23T     X24N     X24T     X25N     X25T     X26N     X26T 
## 22491399 23508958 24018825 31021885 22675122 25197199 21507129 20386730 
##     X27N     X27T     X28N     X28T     X29N     X29T      X2N      X2T 
## 29175712 27733951 27749273 26197405 23156956 25636790 24559488 24150017 
##     X30N     X30T     X31N     X31T     X32N     X32T     X33N     X33T 
## 30343041 24469122 26249413 26005385 23779411 19207983 25951651 21803146 
##     X34N     X34T     X35N     X35T     X36N     X36T     X37N     X37T 
## 27848853 27618533 29607974 26996895 25443403 21856651 27091529 24555047 
##     X38N     X38T     X39N     X39T      X3N      X3T      X4N      X4T 
## 21897996 28799121 21262314 25770806 26104237 24647793 23048255 25691004 
##      X5N      X5T      X6N      X6T      X7N      X7T      X8N      X8T 
## 24139646 25661963 24030603 24994714 23238440 24211560 18291010 22430032 
##      X9N      X9T 
## 22689392 21734211
summary(mycolsums)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 15718196 22678690 24355560 24319084 25916200 31021885
mycolsums <- sort(mycolsums)
head(mycolsums,10)
##     X18T      X8N     X32T     X21T     X26T     X39N     X19T     X10T 
## 15718196 18291010 19207983 19265745 20386730 21262314 21283611 21358077 
##     X20N     X26N 
## 21487092 21507129
tail(mycolsums,10)
##     X34T     X27T     X28N     X34N     X16N     X38T     X27N     X35N 
## 27618533 27733951 27749273 27848853 27933368 28799121 29175712 29607974 
##     X30N     X24T 
## 30343041 31021885
barplot(mycolsums)

barplot(head(mycolsums))

Does this dataset need filtering of lowly expressed genes?

There are ~60k genes in the main annotation sets. We can count the number of rows to see how many genes included in this dataset.

I also run my own threshold, which is average of 10 reads per sample.

dim(xa)
## [1] 18745    74
hist(rowMeans(xa))

table(rowMeans(xa)>=10)
## 
## FALSE  TRUE 
##  2309 16436
xf <- xa[which(rowMeans(xa)>=10),]
dim(xa)
## [1] 18745    74
dim(xf)
## [1] 16436    74

Principal component analysis

Use PCA to understand the overall variation between samples in the dataset.

mds <- cmdscale(dist(t(scale(xf))),k=10)
barplot(colSums(abs(mds)),names.arg = 1:10)

head(mds)
##            [,1]       [,2]        [,3]       [,4]       [,5]        [,6]
## X10N  37.643694 -13.024427   0.8597808   4.097087   6.112696  10.7146140
## X10T -76.198299 -19.565410 -12.7071833  -4.364407 -15.251200  -0.5565757
## X11N  30.689243  -1.139396  -1.9729685  -6.541190  -4.298140  -2.8939500
## X11T -38.586767  -1.714293  34.3064374  -4.932127  16.569860  17.1527763
## X12N  38.975575  -6.187959 -10.0227906 -12.146277 -12.417868 -10.0294316
## X12T   3.294181  45.630846 -38.5169987  -8.184535 -29.904639  12.8409121
##            [,7]       [,8]       [,9]       [,10]
## X10N   7.568131  -3.935890  5.9196796   8.1464807
## X10T -24.416829 -14.702973 10.6437095   6.0036817
## X11N  -1.875214   3.404213  0.3012157  -0.1634874
## X11T  -4.899219   2.537063 -4.3955324 -10.1840018
## X12N  -3.669772   1.359340  1.6358922   1.5074445
## X12T  -3.015237   2.774796 -1.9950542   5.0620557
plot(mds[,1:2],pch=19,col="gray",
     main="Dim 1 and 2",xlab="PCA1",ylab="PCA2")
text(mds[,1],mds[,2],labels = colnames(xf))

plot(mds[,c(1,3)],pch=19,col="gray",
      main="Dim 1 and 3",xlab="PCA1",ylab="PCA3")
text(mds[,1],mds[,3],labels = colnames(xf))

plot(mds[,2:3],pch=19,col="gray",
      main="Dim 2 and 3",xlab="PCA2",ylab="PCA3")
text(mds[,2],mds[,3],labels = colnames(xf))

Curate samplesheet

The samplesheet is the sample level metadata, which we need for the differential expression step.

ss <- as.data.frame(colnames(xa))
head(ss)
##   colnames(xa)
## 1         X10N
## 2         X10T
## 3         X11N
## 4         X11T
## 5         X12N
## 6         X12T
ss$tumor <- as.numeric(grepl("T",ss[,1]))

ss$patient <- gsub("T","" , gsub("N","",ss[,1]))

rownames(ss) <- ss[,1]

head(ss)
##      colnames(xa) tumor patient
## X10N         X10N     0     X10
## X10T         X10T     1     X10
## X11N         X11N     0     X11
## X11T         X11T     1     X11
## X12N         X12N     0     X12
## X12T         X12T     1     X12

DE

We will use DESeq2 for differential expression.

dds <- DESeqDataSetFromMatrix(countData = xf , colData=ss, design = ~ patient + tumor)
## Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in
## design formula are characters, converting to factors
##   the design formula contains one or more numeric variables with integer values,
##   specifying a model with increasing fold change for higher values.
##   did you mean for this to be a factor? if so, first convert
##   this variable to a factor using the factor() function
res <- DESeq(dds)
## estimating size factors
## estimating dispersions
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## fitting model and testing
z <- results(res)
vsd <- vst(dds, blind=FALSE)
zz <- cbind(as.data.frame(z),assay(vsd))
dge <- as.data.frame(zz[order(zz$pvalue),])

head(dge) |> kbl(caption="Top significant genes") |> kable_paper("hover", full_width = F)
Top significant genes
baseMean log2FoldChange lfcSE stat pvalue padj X10N X10T X11N X11T X12N X12T X14N X14T X15N X15T X16N X16T X17N X17T X18N X18T X19N X19T X20N X20T X21N X21T X22N X22T X23N X23T X24N X24T X25N X25T X26N X26T X27N X27T X28N X28T X29N X29T X2N X2T X30N X30T X31N X31T X32N X32T X33N X33T X34N X34T X35N X35T X36N X36T X37N X37T X38N X38T X39N X39T X3N X3T X4N X4T X5N X5T X6N X6T X7N X7T X8N X8T X9N X9T
PDK1 937.9546 2.135424 0.1258421 16.96908 0 0 8.650724 10.642692 8.967844 10.498565 8.134786 10.591653 8.785903 11.14347 8.485555 10.412894 8.189842 10.296493 8.159750 10.280791 8.159321 10.781402 8.458943 10.425273 8.240900 10.331761 8.397134 10.466147 8.421420 10.163560 7.907398 9.883056 8.210950 10.372989 8.587317 10.701480 8.335644 10.221055 8.471277 11.556073 8.307837 11.93393 8.305307 11.445798 8.478097 10.881920 8.466341 10.564357 8.595947 10.852931 9.207234 11.698324 8.398851 9.424032 8.181294 8.731565 8.342664 9.416161 8.281758 11.181796 8.360702 8.514954 8.423486 9.84759 8.694980 9.129945 8.386976 11.067119 8.327773 11.114540 8.555494 11.065938 8.289550 10.367968 8.561558 9.485563 9.621530 10.95606 8.125341 10.319693
SPP1 17975.1510 4.417666 0.2693309 16.40237 0 0 9.802055 14.176006 10.870985 16.825314 8.688407 12.657360 10.557322 14.38728 9.522463 10.686337 10.352215 12.227207 7.823136 14.615519 8.604498 15.602296 7.498959 13.301173 10.576368 14.946618 8.665934 13.679833 8.535472 12.638242 9.390863 16.252230 10.644801 15.998609 13.139803 16.993093 10.831879 17.094131 9.481431 14.384866 11.619320 16.09676 7.953639 11.337801 8.943416 12.980642 9.274685 14.442331 10.909059 12.623616 8.333667 9.721764 9.142822 15.083419 9.177301 12.935540 8.667962 13.620272 9.482104 14.573337 16.849238 15.089669 9.714998 14.94413 9.434579 13.164718 7.680159 10.922952 9.831650 12.937267 8.243920 13.900129 8.454609 16.218752 9.710107 14.391171 14.844814 14.09893 8.620635 11.166524
AGER 11559.6967 -5.477084 0.3355681 -16.32183 0 0 15.168655 6.893846 12.872945 7.774126 14.211504 12.702896 14.940987 11.01977 13.667223 12.246874 14.571089 12.406805 15.184985 8.875605 14.333295 9.462969 14.876306 7.152258 13.901056 11.208358 15.016984 7.368619 14.376976 7.482998 14.913960 8.644041 14.072504 6.911631 15.072956 6.885683 13.749445 9.719213 13.588306 8.179431 14.250593 8.67864 13.218267 9.261431 14.676718 9.386520 12.926690 6.397908 14.500176 7.615689 15.010608 7.614820 14.180083 13.422113 14.567144 7.235510 13.978117 13.814287 14.741739 8.525701 10.651539 8.721279 14.509769 12.47292 13.486554 11.975142 14.101910 8.018593 14.218300 6.865988 13.891117 6.501559 14.948956 6.406268 14.411703 10.787851 12.133789 10.50014 15.309568 7.681559
KRT6A 101501.5369 6.204478 0.3804130 16.30985 0 0 9.193072 18.281839 9.516516 16.677201 5.958339 6.729277 12.537963 17.66984 6.000258 9.543121 6.498843 9.294537 6.309422 7.986419 7.160003 12.763140 5.583972 18.514452 6.573442 8.585020 5.795055 10.728299 5.594051 8.746860 7.648745 11.048317 5.015499 8.242924 10.509087 14.326646 7.329671 16.666850 10.764745 19.773745 12.810230 19.99644 8.846682 17.016851 7.263105 16.482515 8.695843 7.076781 8.834410 18.518557 9.164710 15.061089 7.451653 12.464818 7.733001 12.179191 8.488879 13.376917 8.754957 11.945147 12.481967 15.021821 8.826293 16.07453 7.053591 12.239078 7.148210 19.568155 12.172154 19.513793 6.482059 19.631411 10.718135 19.547211 10.227181 17.802126 10.890398 15.85074 8.951693 17.814489
MMP12 1248.2652 4.513220 0.2774515 16.26670 0 0 8.657790 12.099376 6.731019 9.882017 5.567395 7.050066 6.715331 10.78122 7.200864 9.530651 8.358858 9.221172 5.939377 12.950840 6.216791 10.401415 4.961707 13.143017 6.620989 9.432495 6.324553 11.631126 6.749005 9.939984 8.058865 10.756126 7.296140 9.847195 6.777252 9.647318 6.496149 9.749994 6.683024 13.499608 6.954529 11.63506 7.290949 12.360101 5.156713 10.941399 6.538170 11.154319 6.740462 10.804220 7.485237 12.103772 6.245587 10.292210 5.864011 8.131906 5.810554 9.550398 5.351996 7.667948 10.131743 9.428738 7.772350 10.98200 7.189583 9.352967 5.697359 9.779781 6.557662 10.953639 5.408323 11.284251 5.870229 11.361134 5.962280 12.491766 8.308241 11.67313 5.158645 7.796870
KRT16 6223.7362 5.838103 0.3652821 15.98245 0 0 5.963193 13.704380 7.391931 12.286157 4.995210 6.307710 7.257980 12.00832 5.181189 6.695150 5.090391 7.000848 5.670905 9.215005 5.204919 11.382030 5.150114 12.312411 5.220550 6.160121 4.659063 8.918967 5.695141 9.258571 5.288214 8.678109 5.015499 10.872856 7.620772 10.344609 5.949783 12.881752 6.488183 14.915779 7.121346 12.84905 6.890291 15.232684 5.399736 9.331258 5.818049 5.854666 5.921749 13.815014 7.237825 11.726095 5.990253 7.302332 4.651784 7.213946 5.061602 9.060504 6.179562 9.365155 7.727509 8.901664 6.032531 13.42783 6.005928 7.697149 5.955840 17.031628 7.900307 11.917893 5.012995 16.420047 6.995940 16.074262 6.230885 11.809046 9.548481 12.06656 6.189654 12.323947

Heatmap visualisation

Heatmaps are great for showing high dimensional data.

topgenes <- head(rownames(dge),50)

colfunc <- colorRampPalette(c("blue", "white", "red"))

rpm <- apply(xf,2,function(x) {x/sum(x) * 1e6 } )

top <- rpm[which(rownames(rpm) %in% topgenes),]

csc = as.character(ss$tumor)

heatmap.2(as.matrix(top),trace="none",col=colfunc(25),scale="row",
    margins = c(6,6), cexRow=0.6, cexCol=0.3, ColSideColors=csc )

You may want to look at a few genes in more detail.

set.seed(42)
myrows <- sample(1:nrow(top),6)

par(mfrow=c(2,3))

nullplot <- lapply(myrows,function(i) {
  nam=rownames(top)[i]
  gdata <- top[i,]
  ndat <- gdata[grep("N",names(gdata))]
  tdat <- gdata[grep("T",names(gdata))]
  plotdat <- list("non-tumor"=ndat,"tumor"=tdat)
  boxplot(plotdat,ylab="normalised expression (RPM)",cex=0,col="white",main=nam)
    beeswarm(plotdat,add=TRUE,cex=0.9,pch=19)
})

par(mfrow=c(1,1))

Pathway enrichment analysis

Here, we’ll use the fgsea package on Reactome pathways.

GMT="ReactomePathways_2025-10-15.gmt"

if ( ! file.exists(GMT) ) {
  download.file("https://ziemann-lab.net/public/bioinfo_workshop/ReactomePathways_2025-10-15.gmt",
    destfile=GMT)
}

gs <- gmtPathways("ReactomePathways_2025-10-15.gmt")
head(gs,3)
## $`2-LTR circle formation`
##  [1] "BANF1"   "HMGA1"   "LIG4"    "PSIP1"   "XRCC4"   "XRCC5"   "XRCC6"  
##  [8] "gag"     "gag-pol" "rev"     "vif"     "vpr"     "vpu"    
## 
## $`3-Methylcrotonyl-CoA carboxylase deficiency`
## [1] "MCCC1" "MCCC2"
## 
## $`3-hydroxyisobutyryl-CoA hydrolase deficiency`
## [1] "HIBCH"
dge$stat[which(is.na(dge$stat))] <- 0 # substitute 0 for NA vals

stat <- dge$stat #use DESeq2 test stat for ranking genes
names(stat) <- rownames(dge) #attach gene names to values

fres <- fgsea(pathways=gs,stats=stat,minSize=5, nproc=4) #run fgsea
##   |                                                                              |                                                                      |   0%  |                                                                              |=                                                                     |   1%  |                                                                              |=                                                                     |   2%  |                                                                              |==                                                                    |   2%  |                                                                              |==                                                                    |   3%  |                                                                              |===                                                                   |   4%  |                                                                              |===                                                                   |   5%  |                                                                              |====                                                                  |   5%  |                                                                              |====                                                                  |   6%  |                                                                              |=====                                                                 |   6%  |                                                                              |=====                                                                 |   7%  |                                                                              |======                                                                |   8%  |                                                                              |======                                                                |   9%  |                                                                              |=======                                                               |   9%  |                                                                              |=======                                                               |  10%  |                                                                              |========                                                              |  11%  |                                                                              |========                                                              |  12%  |                                                                              |=========                                                             |  12%  |                                                                              |=========                                                             |  13%  |                                                                              |==========                                                            |  14%  |                                                                              |==========                                                            |  15%  |                                                                              |===========                                                           |  15%  |                                                                              |===========                                                           |  16%  |                                                                              |============                                                          |  17%  |                                                                              |=============                                                         |  18%  |                                                                              |=============                                                         |  19%  |                                                                              |==============                                                        |  19%  |                                                                              |==============                                                        |  20%  |                                                                              |===============                                                       |  21%  |                                                                              |===============                                                       |  22%  |                                                                              |================                                                      |  22%  |                                                                              |================                                                      |  23%  |                                                                              |=================                                                     |  24%  |                                                                              |=================                                                     |  25%  |                                                                              |==================                                                    |  25%  |                                                                              |==================                                                    |  26%  |                                                                              |===================                                                   |  27%  |                                                                              |====================                                                  |  28%  |                                                                              |====================                                                  |  29%  |                                                                              |=====================                                                 |  29%  |                                                                              |=====================                                                 |  30%  |                                                                              |======================                                                |  31%  |                                                                              |======================                                                |  32%  |                                                                              |=======================                                               |  32%  |                                                                              |=======================                                               |  33%  |                                                                              |========================                                              |  34%  |                                                                              |========================                                              |  35%  |                                                                              |=========================                                             |  35%  |                                                                              |=========================                                             |  36%  |                                                                              |==========================                                            |  37%  |                                                                              |==========================                                            |  38%  |                                                                              |===========================                                           |  38%  |                                                                              |===========================                                           |  39%  |                                                                              |============================                                          |  39%  |                                                                              |============================                                          |  40%  |                                                                              |=============================                                         |  41%  |                                                                              |=============================                                         |  42%  |                                                                              |==============================                                        |  42%  |                                                                              |==============================                                        |  43%  |                                                                              |===============================                                       |  44%  |                                                                              |===============================                                       |  45%  |                                                                              |================================                                      |  45%  |                                                                              |================================                                      |  46%  |                                                                              |=================================                                     |  47%  |                                                                              |=================================                                     |  48%  |                                                                              |==================================                                    |  48%  |                                                                              |==================================                                    |  49%  |                                                                              |===================================                                   |  50%  |                                                                              |====================================                                  |  51%  |                                                                              |====================================                                  |  52%  |                                                                              |=====================================                                 |  52%  |                                                                              |=====================================                                 |  53%  |                                                                              |======================================                                |  54%  |                                                                              |======================================                                |  55%  |                                                                              |=======================================                               |  55%  |                                                                              |=======================================                               |  56%  |                                                                              |========================================                              |  57%  |                                                                              |========================================                              |  58%  |                                                                              |=========================================                             |  58%  |                                                                              |=========================================                             |  59%  |                                                                              |==========================================                            |  60%  |                                                                              |==========================================                            |  61%  |                                                                              |===========================================                           |  61%  |                                                                              |===========================================                           |  62%  |                                                                              |============================================                          |  62%  |                                                                              |============================================                          |  63%  |                                                                              |=============================================                         |  64%  |                                                                              |=============================================                         |  65%  |                                                                              |==============================================                        |  65%  |                                                                              |==============================================                        |  66%  |                                                                              |===============================================                       |  67%  |                                                                              |===============================================                       |  68%  |                                                                              |================================================                      |  68%  |                                                                              |================================================                      |  69%  |                                                                              |=================================================                     |  70%  |                                                                              |=================================================                     |  71%  |                                                                              |==================================================                    |  71%  |                                                                              |==================================================                    |  72%  |                                                                              |===================================================                   |  73%  |                                                                              |====================================================                  |  74%  |                                                                              |====================================================                  |  75%  |                                                                              |=====================================================                 |  75%  |                                                                              |=====================================================                 |  76%  |                                                                              |======================================================                |  77%  |                                                                              |======================================================                |  78%  |                                                                              |=======================================================               |  78%  |                                                                              |=======================================================               |  79%  |                                                                              |========================================================              |  80%  |                                                                              |========================================================              |  81%  |                                                                              |=========================================================             |  81%  |                                                                              |=========================================================             |  82%  |                                                                              |==========================================================            |  83%  |                                                                              |===========================================================           |  84%  |                                                                              |===========================================================           |  85%  |                                                                              |============================================================          |  85%  |                                                                              |============================================================          |  86%  |                                                                              |=============================================================         |  87%  |                                                                              |=============================================================         |  88%  |                                                                              |==============================================================        |  88%  |                                                                              |==============================================================        |  89%  |                                                                              |===============================================================       |  90%  |                                                                              |===============================================================       |  91%  |                                                                              |================================================================      |  91%  |                                                                              |================================================================      |  92%  |                                                                              |=================================================================     |  93%  |                                                                              |=================================================================     |  94%  |                                                                              |==================================================================    |  94%  |                                                                              |==================================================================    |  95%  |                                                                              |===================================================================   |  95%  |                                                                              |===================================================================   |  96%  |                                                                              |====================================================================  |  97%  |                                                                              |====================================================================  |  98%  |                                                                              |===================================================================== |  98%  |                                                                              |===================================================================== |  99%  |                                                                              |======================================================================| 100%
## Warning in fgseaMultilevel(pathways = pathways, stats = stats, minSize =
## minSize, : For some of the pathways the P-values were likely overestimated. For
## such pathways log2err is set to NA.
## Warning in fgseaMultilevel(pathways = pathways, stats = stats, minSize =
## minSize, : For some pathways, in reality P-values are less than 1e-50. You can
## set the `eps` argument to zero for better estimation.
fsig <- subset(fres,padj<0.05) # subset significant sets
nrow(fsig)
## [1] 608
fres <- fres[order(-abs(fres$ES)),]

head(subset(fres,padj<0.05 & ES>0),20) %>%
  kbl(caption="mRNA upregulated pathways") %>%
  kable_styling("hover",full_width=FALSE)
mRNA upregulated pathways
pathway pval padj log2err ES NES size leadingEdge
Phosphorylation of Emi1 0.0000000 0.0000009 0.7195128 0.9725996 2.153632 6 CDC20, C….
TFAP2A acts as a transcriptional repressor during retinoic acid induced cell differentiation 0.0001227 0.0009915 0.5188481 0.9202118 1.947712 5 MYBL2, T….
Unwinding of DNA 0.0000000 0.0000002 0.7477397 0.8885573 2.474835 12 CDC45, G….
G2/M DNA replication checkpoint 0.0000528 0.0004808 0.5573322 0.8871306 2.072301 7 CCNA2, C….
Condensation of Prometaphase Chromosomes 0.0000009 0.0000126 0.6594444 0.8575790 2.330754 11 NCAPH, C….
p75NTR negatively regulates cell cycle via SC1 0.0006905 0.0041487 0.4772708 0.8542886 1.891655 6 HDAC2, N….
TFAP2 (AP-2) family regulates transcription of cell cycle factors 0.0026400 0.0126246 0.4317077 0.8464129 1.791510 5 TFAP2A, ….
Vasopressin-like receptors 0.0053772 0.0226316 0.4070179 0.8144183 1.723790 5 OXT, AVP….
Regulation of gene expression in endocrine-committed (NEUROG3+) progenitor cells 0.0073721 0.0290564 0.4070179 0.8063417 1.706695 5 NKX2-2, ….
Polo-like kinase mediated events 0.0000004 0.0000069 0.6749629 0.7966416 2.407033 16 MYBL2, C….
Proton-coupled monocarboxylate transport 0.0037976 0.0172130 0.4317077 0.7887752 1.746589 6 SLC16A1,….
DNA replication initiation 0.0006570 0.0039822 0.4772708 0.7877568 1.942262 8 POLE2, P….
Deposition of new CENPA-containing nucleosomes at the centromere 0.0000000 0.0000000 0.7881868 0.7839504 2.684633 24 HJURP, C….
Nucleosome assembly 0.0000000 0.0000000 0.7881868 0.7839504 2.684633 24 HJURP, C….
Defective pyroptosis 0.0000273 0.0002845 0.5756103 0.7809912 2.175239 12 EZH2, PR….
E2F-enabled inhibition of pre-replication complex formation 0.0004121 0.0026656 0.4984931 0.7806572 1.974814 9 ORC6, CC….
Condensation of Prophase Chromosomes 0.0000314 0.0003160 0.5573322 0.7781689 2.167378 12 CCNB1, P….
CDC6 association with the ORC:origin complex 0.0015897 0.0082450 0.4550599 0.7642007 1.884183 8 CDC6, OR….
DNA strand elongation 0.0000000 0.0000000 0.8390889 0.7566933 2.762556 32 CDC45, G….
Activation of ATR in response to replication stress 0.0000000 0.0000000 0.8986712 0.7462308 2.827899 37 CDC6, CD….
head(subset(fres,padj<0.05 & ES<0),20) %>%
  kbl(caption="mRNA downregulated pathways") %>%
  kable_styling("hover",full_width=FALSE)
mRNA downregulated pathways
pathway pval padj log2err ES NES size leadingEdge
Diseases associated with surfactant metabolism 0.0000055 0.0000695 0.6105269 -0.8749011 -2.274694 9 SFTPC, S….
Defective CSF2RA causes SMDP4 0.0000699 0.0005976 0.5384341 -0.8747946 -2.115895 7 SFTPC, S….
Defective CSF2RB causes SMDP5 0.0000699 0.0005976 0.5384341 -0.8747946 -2.115895 7 SFTPC, S….
NOSTRIN mediated eNOS trafficking 0.0006104 0.0037370 0.4772708 -0.8734137 -1.835114 5 CAV1, NO….
Classical antibody-mediated complement activation 0.0013790 0.0073724 0.4550599 -0.8501940 -1.786327 5 C1QA, C1….
TGFBR3 regulates TGF-beta signaling 0.0001964 0.0015002 0.5188481 -0.8253627 -2.045491 8 ARRB1, T….
Acyl chain remodeling of DAG and TAG 0.0035744 0.0163437 0.4317077 -0.8227138 -1.728589 5 PNPLA2, MGLL
Biosynthesis of Lipoxins (LX) 0.0037274 0.0169685 0.4317077 -0.8215246 -1.726091 5 ALOX5AP,….
Erythrocytes take up oxygen and release carbon dioxide 0.0005440 0.0034163 0.4772708 -0.7970048 -1.975211 8 CA4, HBB….
Biosynthesis of E-series 18(S)-resolvins 0.0127406 0.0449479 0.3807304 -0.7799939 -1.638831 5 LTA4H, A….
Translocation of ZAP-70 to Immunological synapse 0.0000015 0.0000208 0.6435518 -0.7697788 -2.507323 17 HLA-DRB5….
Biosynthesis of EPA-derived SPMs 0.0090387 0.0344529 0.3807304 -0.7534388 -1.700343 6 LTA4H, A….
RSK activation 0.0048461 0.0210065 0.4070179 -0.7532166 -1.821830 7 RPS6KA1,….
Mucopolysaccharidoses 0.0005837 0.0036436 0.4772708 -0.7437490 -2.090960 11 HYAL1, I….
Phosphorylation of CD3 and TCR zeta chains 0.0000005 0.0000075 0.6594444 -0.7429477 -2.517516 20 HLA-DRB5….
Loss of Function of SMAD2/3 in Cancer 0.0091066 0.0346483 0.3807304 -0.7285370 -1.762137 7 TGFBR2, ….
Erythrocytes take up carbon dioxide and release oxygen 0.0006079 0.0037370 0.4772708 -0.7181737 -2.076627 12 CA4, HBB….
O2/CO2 exchange in erythrocytes 0.0006079 0.0037370 0.4772708 -0.7181737 -2.076627 12 CA4, HBB….
Neurotransmitter clearance 0.0071720 0.0284586 0.4070179 -0.7154626 -1.773126 8 SLC6A4, ….
Signaling by TGF-beta Receptor Complex in Cancer 0.0072531 0.0286957 0.4070179 -0.7151750 -1.772413 8 TGFBR2, ….
NRES=nrow(fres)
NSIG=nrow(fsig)
NUP=nrow(subset(fsig,ES>0))
NDN=nrow(subset(fsig,ES<0))
HEADER=paste(NRES,"pathways,",NSIG,"with FDR<0.05,",NUP,"up and",NDN,"down")

plot(fres$ES,-log10(fres$pval),pch=19,cex=0.6,col="gray",
  xlab="ES",ylab="-log10 p-value",main="FGSEA")
points(fsig$ES,-log10(fsig$pval),cex=0.6,col="red",pch=19)
mtext(HEADER)

Session information

save.image("w6_workflow.Rdata")

sessionInfo()
## R version 4.5.1 (2025-06-13)
## Platform: x86_64-pc-linux-gnu
## Running under: Ubuntu 24.04.3 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
## LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so;  LAPACK version 3.12.0
## 
## locale:
##  [1] LC_CTYPE=en_AU.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_AU.UTF-8        LC_COLLATE=en_AU.UTF-8    
##  [5] LC_MONETARY=en_AU.UTF-8    LC_MESSAGES=en_AU.UTF-8   
##  [7] LC_PAPER=en_AU.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_AU.UTF-8 LC_IDENTIFICATION=C       
## 
## time zone: Australia/Melbourne
## tzcode source: system (glibc)
## 
## attached base packages:
## [1] stats4    stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] beeswarm_0.4.0              fgsea_1.34.2               
##  [3] gplots_3.2.0                DESeq2_1.48.1              
##  [5] SummarizedExperiment_1.38.1 Biobase_2.68.0             
##  [7] MatrixGenerics_1.20.0       matrixStats_1.5.0          
##  [9] GenomicRanges_1.60.0        GenomeInfoDb_1.44.1        
## [11] IRanges_2.42.0              S4Vectors_0.46.0           
## [13] BiocGenerics_0.54.0         generics_0.1.4             
## [15] kableExtra_1.4.0           
## 
## loaded via a namespace (and not attached):
##  [1] fastmatch_1.1-6         gtable_0.3.6            xfun_0.52              
##  [4] bslib_0.9.0             ggplot2_3.5.2           caTools_1.18.3         
##  [7] lattice_0.22-7          bitops_1.0-9            vctrs_0.6.5            
## [10] tools_4.5.1             parallel_4.5.1          tibble_3.3.0           
## [13] pkgconfig_2.0.3         KernSmooth_2.23-26      Matrix_1.7-3           
## [16] data.table_1.17.8       RColorBrewer_1.1-3      lifecycle_1.0.4        
## [19] GenomeInfoDbData_1.2.14 compiler_4.5.1          farver_2.1.2           
## [22] stringr_1.5.1           textshaping_1.0.1       codetools_0.2-20       
## [25] htmltools_0.5.8.1       sass_0.4.10             yaml_2.3.10            
## [28] pillar_1.11.0           crayon_1.5.3            jquerylib_0.1.4        
## [31] BiocParallel_1.42.1     DelayedArray_0.34.1     cachem_1.1.0           
## [34] abind_1.4-8             gtools_3.9.5            tidyselect_1.2.1       
## [37] locfit_1.5-9.12         digest_0.6.37           stringi_1.8.7          
## [40] dplyr_1.1.4             cowplot_1.2.0           fastmap_1.2.0          
## [43] grid_4.5.1              cli_3.6.5               SparseArray_1.8.1      
## [46] magrittr_2.0.3          S4Arrays_1.8.1          dichromat_2.0-0.1      
## [49] scales_1.4.0            UCSC.utils_1.4.0        rmarkdown_2.29         
## [52] XVector_0.48.0          httr_1.4.7              evaluate_1.0.4         
## [55] knitr_1.50              viridisLite_0.4.2       rlang_1.1.6            
## [58] Rcpp_1.1.0              glue_1.8.0              xml2_1.3.8             
## [61] svglite_2.2.1           rstudioapi_0.17.1       jsonlite_2.0.0         
## [64] R6_2.6.1                systemfonts_1.2.3