内容

1常见的Bioconductor工作流程

这个非常开放的主题指向了一些最突出的Bioconductor包,用于序列分析。利用这个实验室的机会探索下面突出显示的包小插图和帮助页面;欧洲杯2021体育彩票许多材料将在后续的实验和讲座中更详细地介绍。

特定于领域的分析——探索以下两个或三个包的登陆页、小插图和参考手册。

处理序列、对齐、常见的web文件格式和原始数据;这些方案非常依赖于IRanges/GenomicRanges基础设施。

可视化

Alt测序系统

2大数据计算:

2.1非常高效。R代码

本节的目的是强调编写正确、健壮和高效的R代码的实践。

2.2优先级

  1. 正确:与手工制作的示例一致(相同的()all.equal ()
  2. 鲁棒性:支持真实的输入,例如0长度的向量,NA值,…
  3. 简单:容易懂下个月;描述它对同事的影响很容易;容易发现逻辑错误;容易提高。
  4. 快,或者至少考虑到现代计算机的速度是合理的。

2.3策略

  1. 配置文件
    • 在脚本中大致理解它在做什么。
    • 一步通过代码了解它是如何执行的,并了解每一行的速度。
    • 时间对所选代码行或简单代码块的计算system.time ()或者是微基准测试包中。
    • 配置文件带有一个工具的代码,该工具指示每个函数调用或行花费了多少时间——内置的Rprof ()函数或包,例如lineprofaprof
  2. 向量化——操作向量,而不是显式循环

    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
  3. 预分配内存,然后填充结果

    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
  4. 将公共子表达式提升到重复计算之外,以便子表达式只计算一次
    • 简单,例如,' hoist '从a循环
    • 更高级的,例如,使用lm.fit ()而不是重复拟合相同的设计矩阵。
  5. 重用现有的、测试过的代码

2.3.1案例研究:预分配和向量化

这是一个明显低效的函数:

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")

对不同的反应模式有什么解释吗?

经验教训:

  1. 向量化比迭代提供了巨大的改进
  2. 当需要显式迭代时,预分配和填充非常有用。
  3. *应用()函数有助于避免显式预分配的需要,并使向量化的机会更加明显。这可能会带来较小的性能代价,但通常是值得的
  4. 当需要显式迭代时,提升公共子表达式有助于提高性能。

2.4平行的评价

当数据太大而无法装入内存时,我们可以以块的形式遍历文件,或按字段或基因组位置将数据划分为子集。

迭代

限制

平行进行

BiocParallel为简单的并行计算提供了标准化的接口。包构建提供对而且多核功能的平行包装和BatchJobs用于运行集群作业。

一般的想法:

2.4.1练习:连续睡眠和平行睡眠

这个小示例鼓励使用并行执行,并演示如何使用并行执行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)