и его применение в биоинформатике
Лекция 11
Арина Никольская, Анастасия Жарикова
14 ноября 2025
установку пакетов
CRAN - https://cran.r-project.org/ - install.packages()
Bioconductor - https://www.bioconductor.org/
Github - https://github.com/
…
remove.packages("packagename") - удалить пакет
update.packages() - обновить все пакеты
library() - список доступных пакетов
library("packagename") - загрузить установленный пакет в текущую R сессию
vignette("packagename") - посмотреть “красивый” мануал по пакету, есть не для всех пакетов
sessionInfo() - информация о загруженной сессии R
Установить пакет нужно один раз, но подгружать при каждом запуске рабочего сеанса
После уcтановки нужно только подгрузить пакет с помощью library("packagename")
С каждой новой версией R выходит и новая версия Bioconductor с новыми версиями пакетов. Поэтому определенной версии R соотвествует определенная версия пакета из Bioconductor. Посмотреть соответствие версий можно на сайте.
Пакеты из Bioconductor предпочтительнее устанавливать с помощью специальной системы управления пакетами - BiocManager.
[1] '3.21'
* sessionInfo()
R version 4.5.1 (2025-06-13 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 26100)
Matrix products: default
LAPACK version 3.12.1
locale:
[1] LC_COLLATE=Russian_Russia.utf8 LC_CTYPE=Russian_Russia.utf8
[3] LC_MONETARY=Russian_Russia.utf8 LC_NUMERIC=C
[5] LC_TIME=Russian_Russia.utf8
time zone: Europe/Moscow
tzcode source: internal
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] htmlwidgets_1.6.4 BiocManager_1.30.26 compiler_4.5.1
[4] fastmap_1.2.0 cli_3.6.5 tools_4.5.1
[7] htmltools_0.5.8.1 rstudioapi_0.17.1 yaml_2.3.10
[10] rmarkdown_2.29 knitr_1.50 jsonlite_2.0.0
[13] xfun_0.52 digest_0.6.37 rlang_1.1.6
[16] evaluate_1.0.4
Bioconductor version '3.21'
* 64 packages out-of-date
* 0 packages too new
create a valid installation with
BiocManager::install(c(
"BiocFileCache", "BiocGenerics", "BiocParallel", "broom", "Cairo",
"colorspace", "crosstalk", "dbplyr", "DESeq2", "devtools", "digest", "DT",
"dtplyr", "emmeans", "evaluate", "flextable", "forcats", "gargle",
"gdtools", "GenomeInfoDb", "ggiraph", "ggplot2", "ggplotify", "ggpubr",
"ggridges", "ggsci", "googledrive", "googlesheets4", "hexSticker", "Hmisc",
"hms", "later", "latticeExtra", "listenv", "magick", "magrittr", "officer",
"openssl", "openxlsx", "pillar", "pkgdown", "promises", "purrr", "ragg",
"rbibutils", "RcppArmadillo", "reformulas", "reshape2", "rmarkdown",
"Rsamtools", "RSQLite", "rstatix", "rversions", "rvest", "rvg", "statmod",
"stringr", "systemfonts", "testthat", "textshaping", "vroom", "xfun",
"XML", "xml2"
), update = TRUE, ask = FALSE, force = TRUE)
more details: BiocManager::valid()$too_new, BiocManager::valid()$out_of_date
[1] "BSgenome.Mmusculus.UCSC.mm10" "BSgenome.Mmusculus.UCSC.mm10.masked"
[3] "BSgenome.Mmusculus.UCSC.mm39" "BSgenome.Mmusculus.UCSC.mm8"
[5] "BSgenome.Mmusculus.UCSC.mm8.masked" "BSgenome.Mmusculus.UCSC.mm9"
[7] "BSgenome.Mmusculus.UCSC.mm9.masked" "EnsDb.Mmusculus.v75"
[9] "EnsDb.Mmusculus.v79" "PWMEnrich.Mmusculus.background"
[11] "TxDb.Mmusculus.UCSC.mm10.ensGene" "TxDb.Mmusculus.UCSC.mm10.knownGene"
[13] "TxDb.Mmusculus.UCSC.mm39.knownGene" "TxDb.Mmusculus.UCSC.mm39.refGene"
[15] "TxDb.Mmusculus.UCSC.mm9.knownGene"
Можно скачать архив с пакетом из любого репозитория
Сохранить архив
Установить пакет из архива
Локус или набор локусов в конкретном месте генома
Для точного определения геномного интервала нужно знать:
хромосому (имя соответствует таковому в референсном геноме)
начало интервала
конец интервала
цепь: “+” или “-” (может не быть)
версию референсного генома, относительно которого указаны координаты
Пример: chr1:2000000-3000000
Пример: chr1 2000000 3000000 -
Можно дополнительно задавать столбцы с метаданными интервалов
Для работы с геномными интервалами вне R можно использовать
GenomicRangesGenomicRangesgr <- GRanges(
seqnames = Rle(c(rep("chr1", 4), "chrK")),
ranges = IRanges(start=c(10,20,100,10,0), width = 50,
names = head(letters,5)),
strand = Rle(strand(c("+", "+", "-", "-", "*"))),
score = 1:5,
GC = seq(1, 0, length=5))
grGRanges object with 5 ranges and 2 metadata columns:
seqnames ranges strand | score GC
<Rle> <IRanges> <Rle> | <integer> <numeric>
a chr1 10-59 + | 1 1.00
b chr1 20-69 + | 2 0.75
c chr1 100-149 - | 3 0.50
d chr1 10-59 - | 4 0.25
e chrK 0-49 * | 5 0.00
-------
seqinfo: 2 sequences from an unspecified genome; no seqlengths
GenomicRangesGenomicRangesGenomicRangesGenomicRangesGRanges object with 5 ranges and 3 metadata columns:
seqnames ranges strand | score GC len
<Rle> <IRanges> <Rle> | <integer> <numeric> <integer>
a chr1 10-59 + | 1 1.00 50
b chr1 20-69 + | 2 0.75 50
c chr1 100-149 - | 3 0.50 50
d chr1 10-59 - | 4 0.25 50
e chrK 0-49 * | 5 0.00 50
-------
seqinfo: 2 sequences from an unspecified genome; no seqlengths
GenomicRangesGenomicRangesGRanges object with 4 ranges and 3 metadata columns:
seqnames ranges strand | score GC len
<Rle> <IRanges> <Rle> | <integer> <numeric> <integer>
a chr1 10-59 + | 1 1.00 50
b chr1 20-69 + | 2 0.75 50
c chr1 100-149 - | 3 0.50 50
d chr1 10-59 - | 4 0.25 50
-------
seqinfo: 2 sequences from an unspecified genome; no seqlengths
Например, изменить границы интервала
С набором интервалов внутри одного объекта GRanges
С двумя наборами интервалами из разных GRanges
Например, объединить или пересечь интервалы
Посмотрим на интервалы
GenomicRanges — promotersGRanges object with 4 ranges and 3 metadata columns:
seqnames ranges strand | score GC len
<Rle> <IRanges> <Rle> | <integer> <numeric> <integer>
a chr1 5-19 + | 1 1.00 50
b chr1 15-29 + | 2 0.75 50
c chr1 140-154 - | 3 0.50 50
d chr1 50-64 - | 4 0.25 50
-------
seqinfo: 2 sequences from an unspecified genome; no seqlengths
GenomicRanges — promotersОбласть выделяется с учетом цепи
GenomicRanges — shiftGRanges object with 4 ranges and 3 metadata columns:
seqnames ranges strand | score GC len
<Rle> <IRanges> <Rle> | <integer> <numeric> <integer>
a chr1 20-69 + | 1 1.00 50
b chr1 30-79 + | 2 0.75 50
c chr1 110-159 - | 3 0.50 50
d chr1 20-69 - | 4 0.25 50
-------
seqinfo: 2 sequences from an unspecified genome; no seqlengths
GenomicRanges — shiftСдвигаем вправо
GenomicRanges — resizeGRanges object with 4 ranges and 3 metadata columns:
seqnames ranges strand | score GC len
<Rle> <IRanges> <Rle> | <integer> <numeric> <integer>
a chr1 10-39 + | 1 1.00 50
b chr1 20-49 + | 2 0.75 50
c chr1 120-149 - | 3 0.50 50
d chr1 30-59 - | 4 0.25 50
-------
seqinfo: 2 sequences from an unspecified genome; no seqlengths
GenomicRanges — resizeИзменяем размер от start
Вспомним, как выглядели исходные интервалы
GenomicRanges — reduceGenomicRanges — reduceНеперекрывающиеся интервалы с учетом цепи
gr_a <- GRanges(seqnames = c("chr1", "chr1"), strand = c("+", "-"),
ranges = IRanges(start = c(50, 75), width = 20, names = c("a1", "a2")))
gr_aGRanges object with 2 ranges and 0 metadata columns:
seqnames ranges strand
<Rle> <IRanges> <Rle>
a1 chr1 50-69 +
a2 chr1 75-94 -
-------
seqinfo: 1 sequence from an unspecified genome; no seqlengths
gr_b <- GRanges(seqnames = c("chr1", "chr1"), strand = c("+", "+"),
ranges = IRanges(start = c(60, 100), width = 25, names = c("b1", "b2")))
gr_bGRanges object with 2 ranges and 0 metadata columns:
seqnames ranges strand
<Rle> <IRanges> <Rle>
b1 chr1 60-84 +
b2 chr1 100-124 +
-------
seqinfo: 1 sequence from an unspecified genome; no seqlengths
Создадим интервалы с перекрытием
GenomicRanges — findOverlapsHits object with 1 hit and 0 metadata columns:
queryHits subjectHits
<integer> <integer>
[1] 1 1
-------
queryLength: 2 / subjectLength: 2
Hits object with 2 hits and 0 metadata columns:
queryHits subjectHits
<integer> <integer>
[1] 1 1
[2] 2 1
-------
queryLength: 2 / subjectLength: 2
GenomicRanges — unionGenomicRanges — unionПерекрывающиеся интервалы объединяются
GenomicRanges — intersectGenomicRanges — setdiffGenomicRanges — setdiffИмена хромосом в разметках могут быть представлены в разных стилях:
UCSC
NCBI
Ensembl
Разные консорциумы
“chr1” - “1” - “NC_000001.11”
GenomicRanges — хромосомыGRanges object with 4 ranges and 3 metadata columns:
seqnames ranges strand | score GC len
<Rle> <IRanges> <Rle> | <integer> <numeric> <integer>
a chr1 10-59 + | 1 1.00 50
b chr1 20-69 + | 2 0.75 50
c chr1 100-149 - | 3 0.50 50
d chr1 10-59 - | 4 0.25 50
-------
seqinfo: 1 sequence from an unspecified genome; no seqlengths
circular auto sex NCBI UCSC dbSNP Ensembl
1 FALSE TRUE FALSE 1 chr1 ch1 1
2 FALSE TRUE FALSE 2 chr2 ch2 2
3 FALSE TRUE FALSE 3 chr3 ch3 3
4 FALSE TRUE FALSE 4 chr4 ch4 4
5 FALSE TRUE FALSE 5 chr5 ch5 5
circular auto sex NCBI UCSC Ensembl
1 FALSE TRUE FALSE I chrI I
2 FALSE TRUE FALSE II chrII II
3 FALSE TRUE FALSE III chrIII III
4 FALSE TRUE FALSE IV chrIV IV
5 FALSE TRUE FALSE V chrV V
auto
circular
sex
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15"
[16] "16" "17" "18" "19" "20" "21" "22"
[1] "MT"
[1] "X" "Y"
GenomicRanges — хромосомыМожно изменить стиль имен хромосом
GRanges object with 3 ranges and 0 metadata columns:
seqnames ranges strand
<Rle> <IRanges> <Rle>
[1] 1 10-69 +
[2] 1 10-59 -
[3] 1 100-149 -
-------
seqinfo: 2 sequences from an unspecified genome; no seqlengths
Продемонстрировать результаты, привязанные к геномным координатам
отрисовать покрытие локуса чтениями
сравнить характеристики двух треков по высоте покрытия, количеству вариантов, …
посмотреть характеристики любого заданного локуса
отрисовать особенность генома (GC-состав, покрытие, генную разметку, …) полногеномно
…
karyoploteRвыбираем локус, хромосому или несколько хромосом
выбираем, что хотим отрисовать (работает с GRanges объектами)
рисовать можно сверху или снизу хромосомы
karyoploteRВыбираем две хромосомы
karyoploteRМожно добавить опорные координаты
karyoploteRРасположить хромосомы в линию
karyoploteRТреки можно рисовать сверху или снизу хромосомы
kp <- plotKaryotype(plot.type=2, chromosomes=c("chr1"))
kpDataBackground(kp)
kpDataBackground(kp, data.panel = 2)
kpAxis(kp, data.panel=1)
kpAxis(kp, data.panel=2)
kpText(kp, chr="chr1", x=60e6, y=0.5, labels="data.panel=1", data.panel = 1)
kpText(kp, chr="chr1", x=60e6, y=0.5, labels="data.panel=2", data.panel = 2)karyoploteR — покрытиеGvizОтдельно создаем необходимые треки
Отрисовываем в желательном типе и порядке
Работает с GRanges объектами
Большое количество референсных геномов
GvizGRanges object with 10 ranges and 0 metadata columns:
seqnames ranges strand
<Rle> <IRanges> <Rle>
[1] chr7 26549019-26550183 *
[2] chr7 26564119-26564500 *
[3] chr7 26585667-26586158 *
[4] chr7 26591772-26593309 *
[5] chr7 26594192-26594570 *
[6] chr7 26623835-26624150 *
[7] chr7 26659284-26660352 *
[8] chr7 26721294-26721717 *
[9] chr7 26821518-26823297 *
[10] chr7 26991322-26991841 *
-------
seqinfo: 1 sequence from hg19 genome; no seqlengths
Gvizatrack визуализация CpG островков
Gvizgtrack трек с детальной разметкой выбранного локуса
Gvizitrack миниатюра хромосомы, где красным указан выбранный локус
GvizДобавляем генную разметку
Gviz — zoomУдобный способ приближать данные …
Gviz zoom… вплоть до нуклеотидов
Gviz — покрытиеПринимает распространенные форматы файлов
bamFile <- system.file("extdata/test.bam", package = "Gviz")
itrack <- IdeogramTrack(genome = gen, chromosome = "chr1")
cov_track <- DataTrack(range = bamFile, genome = "hg19", type = "l",
name = "Coverage", window = -1, chromosome = "chr1")
plotTracks(list(itrack, cov_track), from = 189990000, to = 190000000, sizes=c(1,2))circlizecirclizelibrary(circlize)
cell_cycle = data.frame(phase = factor(c("G1", "S", "G2", "M"), levels = c("G1", "S", "G2", "M")),
hour = c(11, 8, 4, 1))
color = c("#66C2A5", "#FC8D62", "#8DA0CB", "#E78AC3")
circos.par(start.degree = 90)
circos.initialize(cell_cycle$phase, xlim = cbind(rep(0, 4), cell_cycle$hour))
circos.track(ylim = c(0, 1), panel.fun = function(x, y) {
circos.arrow(CELL_META$xlim[1], CELL_META$xlim[2],
arrow.head.width = CELL_META$yrange*0.8, arrow.head.length = cm_x(0.5),
col = color[CELL_META$sector.numeric.index])
circos.text(CELL_META$xcenter, CELL_META$ycenter, CELL_META$sector.index,
facing = "downward")
circos.axis(h = 1, major.at = seq(0, round(CELL_META$xlim[2])), minor.ticks = 1,
labels.cex = 0.6)
}, bg.border = NA, track.height = 0.3)circlize genomiccircos.initializeWithIdeogram(species = "mm10")
mouse_chromInfo = read.chromInfo(species = "mm10")$df # длины хромосом
# получим координаты середин хромосом
mouse_mid = data.frame(
chr = paste0("chr", 1:19),
mid = round((mouse_chromInfo[1:19, 2] + mouse_chromInfo[1:19, 3])/2)
)
circos.genomicLink(sample_n(mouse_mid ,5),
sample_n(mouse_mid ,5), col = rand_color(5))