内容

1展示:RNA-seq工作流程

资源:安德斯CSAMA 2015爱,CSAMA, 2015Huber CSAMA 2015皮门特尔,YouTube, 2015

1.1实验设计

1.1.1保持简单

  • 经典的实验设计
  • 时间序列
  • 在可能的情况下,不遗漏值
  • 预期的分析必须是可行的——可用的样本和感兴趣的假设能否结合起来形成一个可测试的统计假设?

1.1.2复制

  • 复制的程度决定了生物问题的细微差别。
  • 无复制(每次处理1个样本):统计选项有限的定性描述。
  • 每个处理3-5个重复:用细胞系或其他定义良好的实体设计实验操作;2倍(?)变化的组间平均表达。
  • 每次治疗10-50个重复:人群研究,例如癌细胞系。
  • 1000个重复:前瞻性研究,如SNP发现
  • 一个资源:RNASeqPower

1.1.3避免将实验因素与其他因素混淆

  • 常见问题:同一处理的样品都在同一个流池上;处理1的样品先处理,处理2的样品再处理,以此类推。

1.1.4记录co-variates

1.1.5注意批处理的影响

  • 已知的
    • 表型协变量,如年龄、性别
    • 实验协变量,如实验室或处理日期
    • 合并到线性模型中,至少近似
  • 未知的
  • 代理变量分析
    • Leek等人,2010,《自然评论遗传学》11733 - 739,韭菜和故事PLoS Genet 3(9):e161
    • 科学发现:普遍的批次效应
    • 统计见解:代理变量分析:识别和构建代理变量;删除已知的批处理效应
    • 好处:减少依赖性,稳定错误率估计,提高可重复性
    • 战斗软件/股东价值分析Bioconductor

单体型图样本来自一个设施,按处理日期排序。

1.1.6湿实验室

  • 混淆因素-记录或避免

  • 你的工件特定的协议

    • 序列的污染物
    • 富集偏倚,例如,非统一转录本表征。
    • PCR伪影-适配器污染物,序列特异性扩增偏倚,…

1.1.7测序

  • 轴的变异

    • 单和paired-end
    • 长度:50 - 200元
    • 每个样本的读取数
  • 特定于应用程序,例如,

    • ChIP-seq:短的单端读取通常就足够了
    • RNA-seq,已知基因:单端或双端读取
    • RNA-seq,转录本或新变体:成对端读取
    • 拷贝数:单端或双端读取
    • 结构变体:成对端读取
    • 变体:深度通过更长的、成对的端读取
    • 微生物组:长配对末端读取(重叠末端)

1.2对齐

1.2.1 "定位策略

  • 新创
    • 没有参考基因组;大量的排序和计算资源
  • 基因组
    • 建立参考基因组
    • Splice-aware对准器
    • 小说记录发现
  • 转录组
    • 建立参考基因组;可靠的基因模型
    • 简单的调整器
    • 已知基因/转录本表达

1.2.2Splice-aware对准器(Bioconductor包装器)

1.3简化为“计数表”

  • 使用已知基因模型来计数感兴趣区域/基因模型重叠的对齐reads
  • 基因模型可以是公共的(例如,UCSC, NCBI, ensemble)或特别的(人造石铺地面文件)
  • GenomicAlignments: summarizeOverlaps ()
  • Rsubread: featureCount ()
  • HTSeqhtseq-count

1.3.2(kallisto /旗鱼)

  • “下一代”差分表达工具;转录组对齐
  • 例如,kallisto采用了完全不同的方法:从FASTQ到没有BAM文件的计数表。
  • 非常快,几乎一样准确。
  • 上的提示它是如何工作的arXiv
  • 与基因水平分析的整合Soneson等

1.4分析

1.4.1独特的统计方面

  • 数据大,样本少
  • 样本中每个基因的比较;单变量措施
  • 每个基因都由相同实验设计,下相同零假设

1.4.2摘要

  • 计数本身,而不是一个总结(RPKM, FPKM,…),是相关的分析
  • 对于一个给定的基因,数量越多意味着信息越多;RPKM等,将所有的估计都视为同等的信息。
  • 样本之间的比较每一个感兴趣的区域;所有样本都有相同的感兴趣区域,因此模库大小不需要校正,如基因长度或可编图性。

3归一化

  • 库的大小(每个样本的总读取数)不同,原因很无趣;我们需要在统计分析中考虑到库大小的差异。
  • 每个样本的读取计数总数为对库大小的一个很好的估计。它不一定会受到数量大的区域的影响,而且可能会引入基因间的偏倚和相关性。相反,使用一个考虑到计数分布的倾斜的健壮的库大小度量(最简单的:裁剪的几何平均值;更先进/更适合在实验室遇到)。
  • 库大小(已计数的读取总数)在样本之间不同,应该包括在内作为统计偏移量在差分表达式分析中,而不是在分析早期“除以”库大小。

1.4.4适当的误差模型

  • 统计数据正态分布或泊松过程分布,而不是负二项分布。
  • 结合泊松(“射散”噪声,即样本内技术和读取计数的抽样变化)与生物样本之间的变化的结果。
  • 负二项模型需要估计一个额外的参数(“离散度”),在小样本中估计得很差。
  • 基本策略是用从具有相似表达值的基因中获得的更可靠的局部估计来调整每个基因的估计(下面将提供更多关于借用信息的信息)。

1.4.5预滤器

  • 很天真,可以对计数表的每一行应用统计检验(例如,t检验)。然而,我们有相对较少的样本(10个)和非常多的比较(10,000个),所以一个天真的方法可能是非常不足的,导致非常高错误发现率
  • 一个简单的方法是通过删除不可能产生统计显著性的区域来进行更少的检验,而不管考虑的假设是什么。
  • 例如:一个在所有样本中计数为0的区域不可能显著,无论假设如何,因此从进一步的分析中排除。
  • 基本方法:' K / A '型过滤器-要求至少K个样本中至少有A(规范化)读计数。方差滤波器,例如IQR(四分位间范围)提供了变异性的可靠估计;可用于对变化最小的区域进行排序和丢弃。
  • 更微妙的方法:刨边机装饰图案;今天的工作流程。

1.4.6贷款信息

  • 为什么低统计能力会提高错误发现率?
  • 发展直觉的一种方法是将t检验(例如)识别为方差比。分子是治疗特异性的,但分母是对整体可变性的衡量。
  • 用不确定度测量方差;过高或过低估计分母方差对t统计量或类似比率有不对称影响,如果低估膨胀这个统计数字比高估统计数字更能使统计数字缩水。因此错误发现率升高。
  • 在微阵列或RNA-seq实验中使用的原假设下,一个基因的预期总体变异性是相同的,至少对于平均表达相似的基因是这样
  • 这个策略是估计基因的分母方差作为组间方差,主持通过所有基因组间方差的平均值。
  • 这种策略利用了相同的实验设计已被应用于所有基因的事实,并有效地调节错误发现率。

1.5深度统计问题:归一化与离散

1.5.1归一化

DESeq2estimateSizeFactors (),安德斯和胡贝尔,2010

  • 对于每个基因:所有样本的几何平均值。
  • 对于每个样本:样本基因的中位数与所有样本的几何平均值之比
  • 可以使用中值以外的函数;可以用控制基因代替

1.5.2分散

  • DESeq2estimateDispersions ()
  • 估计每个基因分散
  • 拟合离散度和丰度之间的平滑关系

1.6理解:将不同表达的区域置于语境中

  • 与基因组范围相关的基因名称
  • 基因集富集及相似分析
  • 接近法规标志
  • 与其他分析结合,例如甲基化,拷贝数,变异,…

拷贝号/表达式QC基因组拷贝数和mRNA表达之间的相关性在TCGA卵巢癌Affymetrix微阵列数据集中发现了38个错误标记的样本。

2实验室:基因级rna序列差异表达

2.1背景

本实验室来源于:RNA-Seq工作流:基因水平探索性分析和差异表达,作者:Michael Love, Simon Anders, Wolfgang Huber;由马丁·摩根修改,2015年10月。

本实验室将带领您通过端到端RNA-Seq差分表达工作流程,使用DESeq2连同其他Bioconductor包。完整的工作流程从FASTQ文件开始,但我们将在读取对齐到参考基因组和读取重叠的已知基因被计数之后开始。我们将进行探索性数据分析(EDA),差异基因表达分析DESeq2,并在视觉上探索结果。

还有一些其他的Bioconductor包是重要的统计推断差异表达在基因水平,包括Rsubread刨边机limmaBaySeq等等。

2.2实验数据

本工作流程中使用的数据是用地塞米松(一种具有抗炎作用的合成糖皮质激素)处理气道平滑肌细胞的RNA-Seq实验。例如,糖皮质激素被用于哮喘患者,以防止或减少气道炎症。在实验中,四种原代人气道平滑肌细胞系用1微摩尔地塞米松处理18小时。对于这四种细胞系,我们分别有处理过的和未处理过的样本。实验参考资料为:

Himes BE, Jiang X, Wagner P, Hu R, Wang Q, Klanderman B, Whitaker RM, Duan Q, Lasky-Su J, Nikolos C, Jester W, Johnson M, Panettieri R Jr, Tantisira KG, Weiss ST, Lu Q.“RNA-Seq转录组分析鉴定CRISPLD2为糖皮质激素响应基因,调节气道平滑肌细胞细胞因子功能。”PLoS One. 2014年6月13日;9(6):e99625。PMID:24926665.地理:GSE52778

2.3准备数矩阵

作为输入,DESeq2包期望计数数据从RNA-Seq或其他高通量测序实验中获得,以整数值矩阵的形式。的值-th行和j矩阵的-th列表示有多少reads被映射到基因在示例j.类似地,对于其他类型的分析,矩阵的行可能对应,例如,结合区域(使用ChIP-Seq)或肽序列(使用定量质谱)。

计数值必须是序列读取的原始计数。这对于DESeq2的统计模型成立,因为只有实际计数才能正确评估测量精度。因此,请不要提供其他数量,例如(四舍五入)归一化计数,或覆盖碱基对的计数——这只会导致无意义的结果。

我们将在后面的课程中讨论如何将BAM文件中的数据汇总到一个计数表中。在这里,我们将“直接进入”,从一个准备好的开始SummarizedExperiment

2.4SummarizedExperiment

我们现在用R数据()命令加载已准备的SummarizedExperiment这是由与上文所述的Himes等人的论文相关的公开的测序数据文件生成的。我们用于生产这个对象的步骤与您在前几节中完成的步骤相同,不同的是我们使用了所有的读取和所有的基因。有关创建此对象类型的具体步骤的详细信息装饰图案(“气道”)进入你的R阶段。

库(气道)数据(“气道”)se <-气道

的资料SummarizedExperiment对象可以通过访问器函数访问。例如,要查看实际数据,也就是这里的读取计数,我们使用分析()函数。(头()函数将输出限制在前几行。)

(试验(se))
# # # # SRR1039508 SRR1039509 SRR1039512 SRR1039513 SRR1039516 ENSG00000000003 679 448 873 408 1138 # # ENSG00000000005 0 0 0 0 0 # # ENSG00000000419 467 515 621 365 587 260 211 263 164 245 # # ENSG00000000457 60 55 40 35 78 # # # # ENSG00000000460 ENSG00000000938 0 0 2 0 1 # # SRR1039517 SRR1039520 SRR1039521 # # # # ENSG00000000005 ENSG00000000003 1047 770 572 0 0 0 # # ENSG00000000419 799 417 508 331 233 229 # # ENSG00000000457 60 # # # # ENSG00000000460 63 76 ENSG00000000938 0 0 0

在这个计数矩阵中,每一行代表一个基因组基因,每一列代表测序的RNA文库,值给出了每个文库中映射到各自基因的测序读取的原始数量。我们还拥有每个样本的元数据(计数矩阵的列)。如果已经使用其他软件进行了读取计数,则需要在这一步检查计数矩阵的列是否与列元数据的行对应。

我们可以快速检查数以百万计的与基因唯一匹配的片段。

colSums(化验(se))
## srr1039508 srr1039509 srr1039512 srr1039513 srr1039516 srr1039517 srr1039520 ## 20637971 18809481 25348649 15163415 24448408 30818215 19126151 ## srr1039521 ## 21164133

假设我们构建了aSummarizedExperiment使用前一节中描述的方法之一,我们现在需要确保对象包含关于样本的所有必要信息,即,一个包含关于计数矩阵列的元数据的表colData槽:

colData (se)
## 8行9列的DataFrame ## SampleName cell dex albut运行avgLength ##       ## SRR1039508 GSM1275862 N61311 untrt untrt SRR1039508 126 ## SRR1039509 GSM1275863 N61311 trt untrt SRR1039509 126 ## SRR1039513 GSM1275866 N052611 untrt untrt SRR1039513 87 ## SRR1039516 GSM1275867 N052611 untrt untrt SRR1039516 120 ## srr1275871 N080611 trt untrt SRR1039517 126 ## SRR1039517SRR1039520 GSM1275874 N061011 untrt untrt SRR1039520 101 ## SRR1039521 GSM1275875 N061011 trt untrt SRR1039521生物样品## <因子> <因子> <因子> ## SRR1039508 SRX384345 SRS508568 SAMN02422675 ## SRR1039509 SRX384346 SRS508567 SAMN02422675 ## SRR1039513 SRX384349 SRS508571 SAMN02422678 ## SRR1039513 SRX384353 SRS508575 SAMN02422682 ## SRR1039517 SRX384354 SRS508576 SAMN02422673 ## SRR1039521 SRX384354 SRS508576 SRS508575 ## SRR1039521 srx1039522 SRX384353 SRS508575 SAMN02422670 ## SRR1039517 SRX384354 SRS508576 srs508557 SRS508579Samn02422683 ## srr1039521 srx384358 srs508580 samn02422677

在这里,我们看到这个对象已经包含了一个信息colData插槽-因为我们已经为你准备了它,如描述气道装饰图案。然而,当您处理自己的数据时,您必须在此阶段为实验添加相关的样本/表型信息。我们强烈建议将此信息保存在逗号分隔值(CSV)或制表符分隔值(TSV)文件中,该文件可以从Excel电子表格导出,并将其分配给colData槽,确保行对应于的列SummarizedExperiment.通过使用示例表的一列指定BAM文件,我们确保了这种通信。

检查rowRanges ()总结实验;这些是计数发生的基因组范围。

rowRanges (se)
长度为64102的GRangesList对象:## $ENSG00000000003 ## GRanges对象有17个范围和2个元数据列:## seqnames ranges strand | exon_id exon_name ##    |   ## [1] X [99883667,99884983] - | 667145 ENSE00001459322 ## [2] X [99885756, 99885863] - | 667146 ENSE00000868868 ## [3] X [99887482,99887565] - | 667147 ENSE00000401072 ## [4] X [99887538,99887565] - | 667148 ENSE00001849132 ## | 667149 ENSE00003554016 ## ... ... ... ... . ... ...## | 667158 ense00001886883 ## [15] x [99891605,99891803] - | 667159 ense00001855382 ## | 667160 ense00001863395 ## [17] x [99894942,99894988] - | 667161 ense00001828996 ## ##…## <64101 more elements> ## ------- ## seqinfo:来自一个未指定基因组的722个序列(1个圆形)

2.5SummarizedExperimentDESeqDataSet

我们将使用DESeq2用于评估差异表达式的包。的扩展版本SummarizedExperiment类,叫做DESeqDataSet.很容易从一个SummarizedExperimentDESeqDataSet

library("DESeq2") dds <- DESeqDataSet(se, design = ~ cell + dex)

“设计”论证是一个公式,它表达了每个基因的计数如何依赖于变量colData.记住,您总是可以获取方法参数的信息?,如DESeqDataSet ?

2.6差异表达分析

这样做很方便untrt第一层是在敏捷因子,这样默认的log2倍的变化是按处理过的和未处理过的进行计算的(默认情况下R将选择第一个字母级别,记住:除非您告诉计算机,否则计算机不知道该做什么)。这个函数relevel ()实现:

Dds $dex <- relevel(Dds $dex, "untrt")

此外,如果在任意点上有子集合DESeqDataSet您应该类似地调用droplevels ()如果细分导致某些水平有0个样本。

2.6.1运行管道

最后,我们准备运行差分表达式管道。准备好数据对象后,将DESeq2分析现在可以通过对函数的一次调用来运行DESeq ()

dds < - DESeq (dds)
##估计大小因素
# #估计分散
基因方面的散布估计
# #平均分散关系
##最终的分散估计
拟合模型和测试

这个函数将为它执行的各个步骤打印一条消息。这些在手册页中有更详细的描述DESeq ?.简单地说,这些是:大小因素的估计(控制测序实验文库大小的差异),每个基因的色散估计,以及拟合一个广义线性模型。

一个DESeqDataSet返回,其中包含所有拟合信息,下一节描述如何从该对象中提取感兴趣的结果表。

2.6.2构建结果表

调用结果()不带任何参数将提取估计的log2倍变化和p设计公式中最后一个变量的值。如果这个变量有2个以上的级别,结果()将提取结果表,以比较最后一个级别与第一个级别。

(res < -结果(dds))
## log2 fold change (MLE): dex trt vs untrt# ENSG00000000003 708.60217 -0.38125388 0.1006560 -3.7876928 0.0001520527 ## ENSG00000000419 520.29790 0.20681271 0.1122218 1.8428925 0.0653447023 ## ENSG00000000457 237.16304 0.1434532 0.2643405 0.7915175170 ## ensg000000004460 57.93263 -0.08816322 0.2871677 -0.3070095 0.7588361136 ##…... ... ... ... ...## LRG_94 0 NA NA NA NA ## LRG_96 0 NA NA NA NA ## LRG_97 0 NA NA NA NA ## LRG_98 0 NA NA NA NA ## LRG_99 0 NA NA NA NA ## padj # <数值> ## ENSG00000000003 0.001283937 ## ENSG00000000005 NA ## ENSG00000000419 0.196568379 ## ENSG00000000457 0.911483176 ## ENSG00000000460 0.895073113 ## ... ...# lrg_94 na ## lrg_96 na ## lrg_97 na ## lrg_98 na ## lrg_99 na

作为res是一个DataFrame对象时,它携带关于列含义的元数据:

mcols (res use.names = TRUE)
## 6行2列的数据帧##类型描述## <字符> <字符> ## baseMean所有样本的标准化计数的中间平均值## log2FoldChange结果log2 fold change (MLE): dex trt vs untrt# lfcSE结果标准错误:dex trt vs untrt# stat结果Wald统计:dex trt vs untrt# pvalue结果Wald测试p值:dex trt vs untrt # padj结果BH调整p值

第一列,baseMean,是所有样本归一化计数值除以大小因子的平均值。其余四列是指一种具体的对比,即比较泰爱泰党水平在untrt水平为因素变量敏捷.参见帮助页结果()(通过输入结果呢?)查阅有关如何取得其他对比的资料。

log2FoldChange是效应量估计。它告诉我们,与未经处理的样本相比,由于使用地塞米松治疗,基因表达似乎发生了多大的变化。该值以2为基数的对数刻度报告:例如,1.5的log2倍变化意味着基因的表达增加了乘以的因子\(2 ^{1.5} \ \)约2.82

当然,这个估计有一个与之相关的不确定性,在这一列中可以得到lfcSE,为log2倍变化估计的标准误差估计。我们也可以用统计检验的结果来表示特定效应量估计的不确定性。微分表达式检验的目的是检验数据是否提供了足够的证据来得出这个值确实不同于零的结论。DESeq2执行每个基因a假设检验看是否有足够的证据来判定零假设治疗对基因没有影响,治疗和对照组之间观察到的差异仅仅是由实验的可变性引起的(也就是说,你可以预期在同一治疗组的不同样本之间的可变性类型)。和通常的统计一样,这个测试的结果被报告为p值,并在列中找到它pvalue.(记住,pValue表示在零假设所描述的情况下,看到与观测到的一样强,甚至更强的折叠变化的概率。)

我们还可以用下面的代码行总结结果,它报告了一些额外的信息。

总结(res)
## ##在33469中有非零的总读计数##调整p值< 0.1 ## LFC > 0(上):2604,7.8% ## LFC < 0(下):2212,6.6% ##异常值[1]:0,0% ##低计数[2]:15441,46% ##(平均计数< 5)## [1]see 'cooksCutoff'参数的结果## [2]see 'independentFiltering'参数的结果

注意,由于FDR水平为10%的地塞米松治疗,有许多基因表达差异。这是有道理的,因为已知气道的平滑肌细胞会对糖皮质激素产生反应。然而,有两种方法可以更严格地判断哪些基因是重要的:

  • 降低错误发现率阈值padj在结果表中)
  • 将log2倍的变化阈值从0提高lfcThreshold的观点结果().看到DESeq2这篇文章展示了这个论证的用法。

有时是一个子集presNA(“不可用”)。这是DESeq ()fda报告该基因的计数为零的方式,因此没有进行检测。此外,p可以分配值NA如果基因被排除在分析之外,因为它包含一个极端的计数异常值。有关更多信息,请参见小插图的离群值检测部分。

2.6.3多个测试

高通量生物学的新手通常认为阈值p较低的值,如在其他设置中经常使用的0.05,将是合适的,但事实并非如此。我们简要解释原因:

有5676个基因p值在33469个基因中小于0.05,检测成功报告ap值:

sum(res$pvalue < 0.05, na.rm=TRUE)
# # 5676年[1]
总和(! is.na (res pvalue美元))
# # 33469年[1]

现在,假设零假设对所有基因都成立,也就是说,没有基因受到地塞米松治疗的影响。然后,根据的定义p价值,我们预计有5%的基因有p值低于0.05。这相当于1673个基因。如果我们只考虑a的基因列表p值低于0.05作为差异表达,因此该列表应该包含高达1673 / 5676 = 29%的假阳性。

DESeq2使用Benjamini-Hochberg (BH)平差,如基准R所述p.adjust函数;简单地说,这种方法计算每个基因的调整p值,回答了以下问题:如果一个称为显著的所有基因带有p值小于或等于该基因的p值阈值,假阳性的百分比是多少错误发现率(在上述计算的意义上)?这些值称为bh调整值p值,在列中给出padjres对象。

因此,如果我们认为10%的假阳性是可以接受的,我们就可以认为所有的基因都有一个调整p下面的值= 0.1 \ \ (10%)是重要的。有多少这样的基因?

sum(res$padj < 0.1, na.rm=TRUE)
# # 4816年[1]

我们将结果表子集到这些基因,然后按log2倍变化估计排序,得到下调最强的显著基因。

resSig <-子集(res, padj < 0.1) head(resSig[order(resSig$log2FoldChange),])
## log2 fold change (MLE): dex trt vs untrt## baseMean log2FoldChange lfcSE stat pvalue ## <数值> <数值> <数值> <数值> <数值> ## ENSG00000128285 6.624741 -5.325912 1.2578863 -4.234017 2.295537e-05 ## ENSG00000267339 26.233553 0.6731316 -6.850894 7.338997e-12 ## ENSG00000019186 14.087605 -4.325920 0.8578247 -5.042895 4.58539e -07 ## ENSG00000183454 5.804171 - 4.2625920 1.1669498 -3.654045 2.581412e-04 ## ENSG00000146006 46.807597 -4.211875 0.5288797 -7.9637671.668799e-15 ## ENSG00000141469 53.436528 -4.124784 1.1297977 -3.650905 2.613174e-04 ## padj ## <数值> ## ENSG00000128285 2.382495e-04 ## ENSG00000267339 2.057658e-10 ## ENSG00000019186 6.623843e-06 ## ENSG00000183454 2.051926e-03 ## ENSG00000141469 2.073517e-03

而且上调幅度最大。的订单()函数给出的指标是递增的,所以求减序的一个简单方法就是加a-的迹象。或者,也可以使用实参减少= TRUE

head(resSig[order(-resSig$log2FoldChange),])
## log2 fold change (MLE): dex trt vs untrt## baseMean log2FoldChange lfcSE stat pvalue ## <数值> <数值> <数值> <数值> <数值> ## ENSG00000179593 67.243048 9.505972 1.0545111 9.014578 1.976299e-19 ## ENSG00000109906 385.071029 7.352628 0.5363902 13.707610 9.141988e-43 ## ENSG00000250978 56.318194 6.327393 0.6778153 9.334981 1.010098e-20 ## ENSG00000132518 5.654654 5.885113 1.3241367 4.444491 8.810031e-06 ## ENSG00000127954 286.384119 0.4930828 10.5604194.546302e-26 ## ENSG00000249364 8.839061 5.098168 1.1596852 4.396166 1.101798e-05 ## padj ## <数值> ## ENSG00000179593 1.254532e-17 ## ENSG00000109906 2.257695e-40 ## ENSG00000109906 2.257695e-40 ## ENSG00000132518 1.002065e-04 ## ENSG00000127954 5.059304e-24 ## ENSG00000249364 1.226124e-04

2.7诊断的情节

一种可视化特定基因计数的快速方法是使用plotCounts ()函数,该函数以DESeqDataSet、一个基因名称,以及要绘制计数图的群体。

topGene <- rownames(res)[it .min(res$padj)] data <- plotCounts(dds, gene=topGene, intgroup=c("dex"), returnData=TRUE)

我们还可以使用ggplot ()函数的ggplot2包:

库(ggplot2) ggplot(data, aes(x=dex, y=count, fill=dex)) + scale_y_log10() + geom_dotplot(binaxis="y", stackdir="center")
使用' bins = 30 '的stat_bindot()。使用' binwidth '选择更好的值。

“MA-plot”为两组比较实验提供了有用的概述。在y轴上绘制了特定比较的log2倍变化,x轴上显示了按大小因子归一化的计数的平均值(“M”表示负,因为对数比等于log - log,“a”表示平均值)。

plotMA (res ylim = c (5,5))

每个基因都用一个点表示。带有调节的基因\ (p \)低于阈值(这里是默认值0.1)的值用红色表示。的DESeq2包包含log2倍的先验变化,导致低计数和高可变计数基因的调节log2倍变化,这可以从图左侧点的扩散缩小中看到。这幅图表明,只有平均归一化计数大的基因包含足够的信息来产生一个重要的呼叫。

我们也可以在MA图上标记单个点。这里我们使用与()函数为结果对象的选定行绘制圆和文本。在与()函数,只有baseMean而且log2FoldChange的选定行的res使用。

plotMA(res, ylim=c(-5,5)) with(res[topGene,], {points(baseMean, log2FoldChange, col="dodgerblue", cex=2, lwd=2) text(baseMean, log2FoldChange, topGene, pos=2, col="dodgerblue")})

一个基因是否被称为显著基因不仅取决于它的LFC,还取决于它在组内的变异性DESeq2量化的分散.对于强表达基因,离散度可以理解为变异系数的平方:离散度值为0.01意味着基因的表达倾向于典型的差异\ \√{0.01}= 10 \ % \)在同一处理组的样本之间。对于弱基因,泊松噪声是另一种噪声源。

这个函数plotDispEsts ()可视化DESeq2的分散估计:

plotDispEsts (dds)

黑点是每个基因的离散度估计值,是分别考虑每个基因的信息得到的。除非有很多样本,否则这些值会在其真实值附近剧烈波动。因此,我们拟合红色趋势线,它显示了离散度对均值的依赖性,然后将每个基因的估计值缩小到红线,得到最终的估计值(蓝点),然后用于假设检验。在主要“云”点上方的蓝色圆圈是具有高基因分散估计的基因,标记为分散离群值。因此,这些估计值没有向拟合的趋势线缩小。

的直方图是另一个有用的诊断图p值。

Hist (res$pvalue, breaks=20, col="grey50", border="white")

如果排除了计数非常少的基因,这个图就变得更流畅了:

hist(res$pvalue[res$baseMean > 1], breaks=20, col="grey50", border="white")

2.8独立的过滤

MA图突出了RNA-Seq数据的一个重要特性。对于弱表达的基因,我们没有机会看到差异表达,因为低读计数受到高泊松噪声的影响,任何生物效应都淹没在读计数的不确定性中。我们也可以通过检查小的比率来证明这一点p按平均归一化计数归类的基因的值(例如,小于0.01):

#使用分位数函数qs <- c(0, quantile(res$baseMean[res$baseMean > 0], 0:7/7)) #将基因切到垃圾箱垃圾箱<- cut(res$baseMean, qs) #使用中间点的水平(垃圾箱)<- paste0("~",round(.)5*qs[-1] + .5*qs[-length(qs)])) #计算每个bin比值小于0.01的$p$值的比值(tapply(res$pvalue, bins, function(p) mean(p < .01, na.rm=TRUE)) #绘制这些比值barplot(比值,xlab="平均归一化计数",ylab="小p值的比值")

乍一看,过滤掉这些基因似乎没什么好处。毕竟,测试发现它们并不重要。然而,这些基因对多重测试调整有影响,如果去除这些基因,多重测试调整的性能会提高。通过从FDR程序的输入中删除弱表达基因,我们可以在保留的基因中发现更多的显著基因,从而提高了我们测试的能力。这种方法被称为独立的过滤

这个词独立的强调一个重要的警告。只有当过滤准则独立于实际测试统计量时,才允许这样的过滤。否则,滤波将使测试无效,从而使BH过程的假设无效。这就是为什么我们过滤了平均值所有样本:该过滤器对分配给处理组和对照组的样本是盲目的,因此是独立的。内部采用独立过滤软件DESeq2来自于genefilter软件包,其中包含对描述独立过滤的统计基础的论文的引用。

2.9注释:添加基因名

我们的结果表只使用了ensemble基因id,但基因名称可能更有信息。Bioconductor的注释包有助于将各种ID方案相互映射。

我们加载AnnotationDbi包和注释包org.Hs.eg.db

库(org.Hs.eg.db)

这是用于的有机体注释包(“org”)智人(“Hs”),组织成AnnotationDbi数据库包(" db "),使用Entrez基因id (" eg ")作为主键。要获取所有可用键类型的列表,使用:

列(org.Hs.eg.db)
#[1]“accnum”“alias”“ensembl”“ensemblprot”##[5]“ensembltrans”“entrezid”“enzyme”“evidence”##[9]“evidenceall”“genename”“go”“goall”##[13]“ipi”“map”“omim”“ontology”##[17]“ontologyall”“path”“pfam”“pmid”##[21]“prosite”“refseq”“symbol”“ucsckg”##[25]“unigene”“uniprot”
res$hgnc_symbol <- unname(mapIds(org. hs . e.g. .db, rownames(res), "SYMBOL", " synbl ")))
'select()'返回1:多个键和列之间的映射
res$entrezgene <- unname(mapIds(org. hs . e.g. .db, rownames(res), "ENTREZID", "ENSEMBL"))
'select()'返回1:多个键和列之间的映射

现在的结果有了所需的外部基因id:

resOrdered <- res[order(res$pvalue),] head(resOrdered)
## log2 fold change (MLE): dex trt vs untrt## baseMean log2FoldChange lfcSE stat pvalue ## <数值> <数值> <数值> <数值> <数值> ## ENSG00000152583 997.4398 4.1840564 24.85607 2.223017e-136 ## ENSG00000165995 495.0929 3.291062 0.1331768 24.71198 7.951622e-135 ## ENSG00000120129 3409.0294 2.947810 0.1214350 24.27480 3.619142e-130 ## ENSG00000101347 12703.3871 3.766996 0.1554336 24.23541 9.423844e-130 ## ENSG00000189221 2341.7673 0.1417802 23.653371.089779e-123 ## ENSG00000211445 12285.6151 3.730403 0.1658267 22.49579 4.563626e-112 # padj hgnc_symbol entrezgene ## <数字> <字符> <字符> ## ENSG00000152583 4.007654e-132 SPARCL1 8404 ## ENSG00000165995 7.167592e-131 CACNB2 783 ## ENSG00000120129 2.174863e-126 DUSP1 1843 ## ENSG00000101347 4.247326e-126 SAMHD1 25939 ## ENSG00000189221 3.929307e-120 MAOA 4128 ## ENSG00000211445 1.371217e-108 GPX3 2878

2.10输出结果

您可以轻松地将结果表保存到CSV文件中,然后可以使用Excel等电子表格程序加载该文件。调用as.data.frame是否需要转换DataFrame对象IRanges包)data.frame可以处理的对象write.csv

write.csv (as.data.frame (resOrdered),文件=“results.csv”)

2.11会话信息

作为本文档的最后一部分,我们将调用该函数sessionInfo,它报告R的版本号和此会话中使用的所有包。保持这样的记录是一种很好的做法,因为它将有助于跟踪发生了什么,以防R脚本因为包的新版本中的函数发生了更改而停止工作。会话信息也应该如此总是包括在任何电子邮件给Bioconductor支持网站以及分析中使用的所有代码。

sessionInfo ()
## R版本3.4.1 Patched (2017-09-07 r73217) ##平台:x86_64-pc-linux-gnu(64位)##运行在:Ubuntu 16.04.3 LTS ## ##矩阵产品:default ## BLAS: /home/ mmorgan /bin/R-3-4-branch/lib/libRblas. #因此## LAPACK: /home/ mmorgan /bin/ r -3-4-branch/lib/libRlapack。因此## ## locale: ## [1] LC_CTYPE=en_US。UTF-8 LC_NUMERIC= c# # [3] LC_TIME=en_US。utf - 8 LC_COLLATE = en_US。UTF-8 ## [5] LC_MONETARY=en_US。utf - 8 LC_MESSAGES = en_US。UTF-8 ## [7] LC_PAPER=en_US。UTF-8 LC_NAME= c# [9] LC_ADDRESS=C LC_TELEPHONE= c# [11] LC_MEASUREMENT=en_US。UTF-8 LC_IDENTIFICATION=C ## ##附加的基本包:## [1]parallel stats4 stats graphics grDevices utils datasets ## [8] methods base ## ##其他附加的包:# # # # [1] airway_0.111.0 org.Hs.eg.db_3.4.1 [3] AnnotationDbi_1.39.2 RColorBrewer_1.1-2 # # [5] ggplot2_2.2.1.9000 gplots_3.0.1 # # [7] DESeq2_1.17.15 SummarizedExperiment_1.7.5 # # [9] DelayedArray_0.3.19 matrixStats_0.52.2 # # [11] Biobase_2.37.2 GenomicRanges_1.29.12 # # [13] GenomeInfoDb_1.13.4 IRanges_2.11.14 # # [15] S4Vectors_0.15.6 BiocGenerics_0.23.0 # # [17] BiocStyle_2.5.20 # # # #通过加载一个名称空间(而不是附加):## [4] Formula_1.2-2 - latticeExtra_0.6-28 blob_1.1.0 ## [7] GenomeInfoDbData_0.99.1 yaml_2.1.14 RSQLite_2.0 ## [10] backports_1.1.0 lattice_0.20-35 digest_0.6.12 ## [13] XVector_0.17.1 checkmate_1.8.3 colorspace_1.3-2 ## [16] htmltools_0.3.6 Matrix_1.2-11 plyr_1.8.4 ## [19] pkgconfig_2.0.1 XML_3.98-1.9 genefilter_1.59.0 ## [25] scales_0.5.0 gdata_2.18.0 BiocParallel_1.11.7 ## [28] htmlTable_1.9 ## [7] GenomeInfoDbData_0.99.1tibble_1.3.4 annotate_1.55.0 # # [31] nnet_7.3-12 lazyeval_0.2.0 survival_2.41-3 # # [34] magrittr_1.5 memoise_1.1.0 evaluate_0.10.1 # # [37] foreign_0.8 - 69 tools_3.4.1 data.table_1.10.4 # # [40] stringr_1.2.0 munsell_0.4.3 locfit_1.5 - 9.1 # # [43] cluster_2.0.6 compiler_3.4.1 caTools_1.17.1 # # [46] rlang_0.1.2 grid_3.4.1 rcurl_1.95 - 4.8 # # [49] htmlwidgets_0.9 bitops_1.0-6 base64enc_0.1-3 # # [52] rmarkdown_1.6 codetools_0.2-15 gtable_0.2.0 # # [55] DBI_0.7 gridExtra_2.2.1 knitr_1.17 # # [58] bit_1.1-12Hmisc_4.0-3 rprojroot_1.2 ## [61] KernSmooth_2.23-15 stringi_1.1.5 Rcpp_0.12.12 ## [64] geneplotter_1.55.0 rpart_1 .1-11 acepack_1.4.1