Source: https://github.com/markziemann/bioinformatics_intro_workshop
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 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
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))
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
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))
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
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)
| 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 |
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))
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)
| 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)
| 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)
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