这个非常开放的主题指向了一些最突出的Bioconductor包,用于序列分析。利用这个实验室的机会探索下面突出显示的包小插图和帮助页面;欧洲杯2021体育彩票许多材料将在后续的实验和讲座中更详细地介绍。
特定于领域的分析——探索以下两个或三个包的登陆页、小插图和参考手册。
处理序列、对齐、常见的web文件格式和原始数据;这些方案非常依赖于IRanges/GenomicRanges基础设施。
consensusMatrix ?
为例。也可以查看BSgenome用于处理全基因组序列的软件包,例如,?”getSeq BSgenome-method”
readGAlignments ?
帮助页面,vigentte(包=“GenomicAlignments”、“summarizeOverlaps”)
进口
而且出口
函数可以读取许多常见的文件类型,例如BED, WIG, GTF,…,除了查询和导航UCSC基因组浏览器。检查进口吗?
页的基本用法。可视化
本节的目的是强调编写正确、健壮和高效的R代码的实践。
相同的()
,all.equal ()
)NA
值,…向量化——操作向量,而不是显式循环
x < - 1:10日志(x) # #不是(我在seq_along (x)) x[我]< -日志(x[我])
## [1] 0.0000000 0.6931472 1.0986123 1.3862944 1.6094379 1.7917595 1.9459101 2.0794415 2.1972246 ## [10] 2.3025851
预分配内存,然后填充结果
Result <- numeric(10) Result [1] <- runif(1) for (i in 2:length(Result)) Result [i] <- runif(1) * Result [i - 1] Result
## [1] 0.4951848784 0.2865352417 0.1203113475 0.0282785626 0.0117993505 0.0040204726 0.0025406804 ## [8] 0.0011436998 0.0010444164 0.0002276832
为
循环lm.fit ()
而不是重复拟合相同的设计矩阵。汇总()
,rowSums ()
和朋友,%, %
,……这是一个明显低效的函数:
f0 < -函数(n = 2) {# # stopifnot (is.integer (n) & &(长度(n) = = 1) & & # # ! is.na (n) & & (n > 0))结果< -数字()(我在seq_len (n))结果[[我]]< - *日志(i)结果}
使用system.time ()
研究这个算法是如何扩展的n
,主要关注运行时间。
system.time (f0 (10000))
##用户系统运行## 0.284 0.004 0.285
n < - 1000 * seq(2) 1, 20日t < -酸式焦磷酸钠(n,函数(i) system.time (f0(我)[[3]])情节(t ~ n、类型=“b”)
记住当前的“正确”值和一个近似的时间
N <- 10000系统。预计时间(< - f0 (n))
##用户系统运行## 0.272 0.000 0.270
(预计)
## [1] 0.000000 1.386294 2.197225 2.772589 3.218876 3.583519
修改提升常用乘法器的功能,一个
,在圈子之外。确保“优化”的结果和原来的计算是相同的。使用微基准测试包来比较两个版本
F1 <- function(n, a=2) {result <- numeric() for (i in seq_len(n)) result[[i]] <- log(i) a * result}相同(预期,F1 (n))
# # [1]
微基准测试(f0(n), f1(n), times=5)
##单位:毫秒## expr min lq mean median uq max neval cld ## f0(n) 246.0423 264.9063 261.8002 264.9214 265.3211 267.8099 5 a ## f1(n) 219.2913 221.7509 246.0515 261.9951 263.2040 264.0162 5 a
采用“预分配和填充”策略
F2 <- function(n, a=2) {result <- numeric(n) for (i in seq_len(n)) result[[i]] <- log(i) a * result}相同(预期,F2 (n))
# # [1]
微基准测试(f0 (n), f2 (n),时间= 5)
##单位:毫秒## expr min lq mean median uq max neval cld ## f0(n) 214.56280 236.09284 268.35744 244.4207 323.00509 323.7058 5 b# # f2(n) 11.68582 11.75021 12.18971 11.8478 12.04433 13.6204 5 a
使用一个*应用()
函数,以避免必须显式预分配,并使向量化的机会更明显。
F3 <- function(n, a=2) a * sapply(seq_len(n), log)相同(预期,F3 (n))
# # [1]
微基准测试(f0(n), f2(n), f3(n),乘以=10)
##单位:毫秒## expr min lq mean median uq max neval cld ## f0(n) 210.639096 212.705845 254.638491 214.667187 315.358004 321.404387 10 b ## f2(n) 11.724926 11.803303 12.009622 11.916915 12.079235 12.733139 10 a ## f3(n) 6.126175 6.152834 6.335576 6.339932 6.441334 6.720913 10 a
既然代码是在单行中显示的,显然可以很容易地向量化它。抓住机会向量化它:
F4 <- function(n, a=2) a * log(seq_len(n))相同(期望,F4 (n))
# # [1]
微基准(f0(n), f3(n), f4(n), times=10)
##单位:microseconds ## expr min lq mean median uq max neval cld ## f0(n) 207472.674 210034.700 251660.864 212280.688 312108.901 317604.029 10 b ## f3(n) 6043.009 6085.972 6148.863 6122.600 6228.416 6292.337 10 a ## f4(n) 364.354 365.775 374.082 373.359 382.867 392.421 10 a
f4 ()
看起来绝对是赢家。它是如何缩放的n
?(重复几次)
N <- 10 ^ (5:8) # 100x大于f0 t <- sapply(N, function(i) system.time(f4(i))[[3]]) plot(t ~ N, log="xy", type="b")
对不同的反应模式有什么解释吗?
经验教训:
*应用()
函数有助于避免显式预分配的需要,并使向量化的机会更加明显。这可能会带来较小的性能代价,但通常是值得的当数据太大而无法装入内存时,我们可以以块的形式遍历文件,或按字段或基因组位置将数据划分为子集。
迭代
open ()
,阅读块(s),close ()
.yieldSize
参数Rsamtools: BamFile ()
GenomicFiles: reduceByYield ()
限制
Rsamtools: ScanBamParam ()
Rsamtools: PileupParam ()
VariantAnnotation: ScanVcfParam ()
平行进行
BiocParallel为简单的并行计算提供了标准化的接口。包构建提供对雪
而且多核
功能的平行
包装和BatchJobs
用于运行集群作业。
一般的想法:
bplapply ()
而不是拉普兰人()
论点BPPARAM
影响并行评估的发生方式
MulticoreParam ()
:单个(非windows)机器上的线程SnowParam ()
:同一或不同机器上的进程BatchJobsParam ()
:集群的资源调度程序DoparParam ()
:并行执行foreach ()
这个小示例鼓励使用并行执行,并演示如何使用并行执行bplapply ()
可以顺便来一下吗拉普兰人
.
使用system.time ()
为了探索这需要多长时间来执行n
从1增加到10。使用相同的()
而且微基准测试比较选择f0 ()
而且f1 ()
为了正确性和性能。
有趣的
先睡1秒,然后再回来我
.
library(BiocParallel) fun <- function(i) {Sys.sleep(1) i} ## serial f0 <- function(n) lapply(seq_len(n), fun) ## parallel f1 <- function(n) bplapply(seq_len(n), fun)