的描述PipelineDefinition微分表达式之间的交互分析和上海广电/移除不需要的变化,作为插图为构建的过程PipelineDefinition
。
pipeComp 1.10.0
这个描述是围绕的应用pipeComp(散装RNAseq)微分表达式分析(DEA)管道涉及多个步骤,如预滤器和估计技术或不必要的向量的变异。它将说明的整个过程指导创建一个新的PipelineDefinition
与一个真实的例子。装饰图案假设的一般理解pipeComp(概述,请参阅pipeComp装饰图案)。
我们将创建一个PipelineDefinition
这始于一个SummarizedExperiment(更具体的要求见下文)和执行三个步骤:1)基因筛选,2)代理变量分析(上海广电)或类比(例如,删除不必要的变化),和3)差异表达分析。前两个步骤的输出将是一个(过滤和代理变量添加到),而第三步的输出将微分表达式。
我们可以执行多步评价,例如监测基因丢失在过滤步骤中,和在多大程度上SVA-corrected数据保留相关向量与技术的变异,但为了简单起见,我们只会运行一些评价指标在最后一步。
我们将建立PipelineDefinition
这样的数据集将对象读计数试验(名为“计数”),条件
colData
与两个层面因素,rowData
至少列expected.beta
(预计log2-foldchange)和“
(逻辑表明基因差异表达- NA值是否接受)。我们已经准备了三个这样的结果部分中描述的数据集。
我们先准备一个函数,给定DEA结果(作为data.frame),收益评价指标两种:1)相关性和平均绝对误差估计foldchanges对预期的,和2)敏感性,特异性,错误发现率等:
suppressPackageStartupMessages({库(pipeComp)库(S4Vectors)}) evaluateDEA < -函数(dea,真理= NULL, th = c(0.01, 0.05, 0.1)){# #我们确保列名的dea的标准:dea < - pipeComp::: .homogenizeDEA (dea) # #在pipeComp,真相应该传递与dea的对象,所以# #我们检索:如果(is.null(真理))真理< -元数据(dea) $ dea <——cbind (dea,真理(row.names (dea)]) # #我们摆脱基因未知的事实是:dea < - dea [! is.na expected.beta美元(dea)] # #比较估计和预期log2 folchanges: res < - c (logFC。皮尔森=软木(dea dea logFC美元,美元的预期。β=“成对”)使用,logFC。斯皮尔曼=软木(dea dea logFC美元,美元的预期。β,使用=“成对”方法=“枪兵”),logFC.mad =值(abs (dea logFC-dea expected.beta美元),na.rm = TRUE), ntested =总和(! is.na PValue美元(dea) & ! is.na罗斯福美元(dea))) # #重要性评价调用名称(th) < - th它< - t (vapp (th、有趣。VALUE =向量(模式=“数值”,长度= 6),有趣= function (x){# #为每个意义阈值,计算各种指标称为= (dea罗斯福美元和< x, na.rm = TRUE) P <——“美元(dea)和TP < - sum (dea罗斯福< x & dea“美元,美元na.rm = TRUE) c (TP = TP, FP = called-TP, TPR = TP / P, PPV = TP /,罗斯福= 1-TP /,玻璃钢= (P-TP) /笔(dea !“美元)}))它< - cbind(阈值= as.numeric (row.names(它),as.data.frame(它))row.names(它)< -空列表(logFC = res,意义=它)}
函数包含在pipeComp
包中。它输出列表有两个插槽:1)logFC
槽包含一个向量的相关性(皮尔森、斯皮尔曼和疯狂)预计logFCs,和2)意义
槽包含data.frame精度指标在不同的阈值。我们可以用随机数据测试:
#我们建立一个随机DEA dataframe和真理:DEA < - data.frame (row.names = paste0(“基因”,1:10),logFC = rnorm (10)) DEA PValue < - DEA罗斯福<美元- c(2:8/100, 0.2, 0.5, 1)真理< - data.frame (row.names = paste0(“基因”,1:10),expected.beta = rnorm(10),“=代表(c(真的,假的,真的,假的),c (3、1、2、4))) evaluateDEA (DEA,真理)
# # # # logFC logFC美元。皮尔森logFC。斯皮尔曼logFC。疯狂ntested # # -0.3349034 - -0.2727273 1.5644874 - 10.0000000 # # # # # # $意义阈值TP FP TPR PPV罗斯福玻璃钢# # 1 0.01 0 0 0.05 0.0南南1.0 # # 2 3 0 0.10 0.6 1.0000000 0.0000000 0.4 # # 3 5 2 1.0 - 0.7142857 0.2857143 - 0.0
我们需要定义为每个步骤的基本功能,包括可能的参数。我们开始与过滤步骤:
的一步。filtering <- function(x, filt, minCount=10){ # we apply the function `filt` to `x` with the parameter `minCount` get(filt)(x, minCount=minCount) }
这意味着任何过滤函数,我们尝试(即。,选择的值filt
)需要接受作为参数,这两个x
和minCount
。
接下来,我们定义了上海广电步骤以类似的方式,但是我们还需要GLM model.matrix:
的一步。上海广电< -函数(x,股东价值分析。法、k = 1){#我们创建模型。矩阵:mm < -统计数据::模型。矩阵(~条件,数据= as.data.frame (colData (x))) #我们应用函数的股东价值分析。方法的“x”的参数k的(sva.method) (x, k = k,毫米=毫米)}
DEA的一步,我们会做更多的不仅仅是应用功能:编写具体的包装方法简单,在这里我们将创建全球语言监测模型。矩阵,包括任何最终的代理变量(使用方法)。此外,由于评价函数需要真相,我们将复制它并将它附加到DEA结果的元数据:
step.dea < -函数(x, dea.method) {# DEA方法运行,并且将结果转换成DataFrame: x2 <——DataFrame (get (dea.method) (x)毫米))#把真相结果:元数据(x2)真理< -元数据(x)真理美元x2}
然后我们准备组装PipelineDefinition
:
皮普< PipelineDefinition(列表(过滤=一步。过滤、上海广电=一步。上海广电,dea = step.dea))皮普
# # PipelineDefinition对象有以下步骤:# # -过滤(x, filt minCount) # # -上海广电(x,股东价值分析。法、k) # # - dea (x, dea.method)
最后,我们需要添加评价函数:
stepFn (pip一步=“dea type = "评价")< - evaluateDEA皮普
# # PipelineDefinition对象有以下步骤:# # -过滤(x, filt minCount) # # -上海广电(x,股东价值分析。法、k) # # - dea (x, dea.method) *
星表示dea
步骤包括一些评估。
为每个方法,我们想要测试,我们需要编写一个包装器函数,接受参数至少包括在步骤。下面是示例包装为每一个步骤:
def.filter < -函数(x, minCounts = 10){图书馆(磨边机)minCounts < as.numeric (minCounts) x [filterByExpr(化验(x), model.matrix (~ x美元条件),min.count = minCounts),]}股东价值分析。svaseq < -函数(x, k, mm) {k < - as.integer (k)如果(k = = 0)返回(x)库(上海广电)#运行上海广电sv <——svaseq(化验(x), mod = mm, n.sv = k)如果(sv n.sv = = 0美元)返回(x) #重命名的sv和将它们添加到colData“x”: colnames (sv sv美元)< - paste0 (sv, seq_len (ncol (sv sv)美元))colData (x) < - cbind (colData (x) sv美元sv) x dea}。磨边机< -函数(x, mm){图书馆(磨边机)dds < calcNormFactors (DGEList(化验(x))) dds < - estimateDisp (dds,毫米)符合<——glmFit (dds,毫米)as.data.frame (topTags (glmLRT(健康,“条件”),正))}#我们也定义一个函数不做任何事:没有< - x (x,…)函数
我们定义的替代品(使用不同的参数参数(pip)
看到管道的目的)命名列表:
选择< -列表(filt = c(“没有”,“def.filter”), minCount = 10, sva.method = c(“没有”,“sva.svaseq”), k = 1:2, dea.method = " dea。磨边机”)
每个参数(列表)的位置可以任意数量的标量值(如字符、数字、逻辑)。在这种情况下,一些参数(filt
,sva.method
和dea.method
)期望函数的名称必须在环境中加载。runPipeline
将运行所有的组合参数没有重复相同的步骤两次(或者,您也可以运行只有一个子集的组合)。
为此我们创建三个基准数据集:
可用的数据集在这里以及具体的代码用来准备它们。他们可以装载在以下方式:
数据集< -列表。文件(“路径/ /数据集”,模式=“rds美元”,full.names = TRUE)名称(数据)< - paste0(“数据集”,1:2)数据集< -拉普(数据集,readRDS)
注意,因为在这种情况下,数据集相对较小,他们通过他们我们只是负载runPipeline
。然而,更好的实践与大型数据集是通过一个名为向量文件的路径。在这种情况下,我们可以通过设置一个初始化函数读取:
#没有运行stepFn (pip、类型=“起始”)< -函数(x){如果(is.character长度(x) & & (x) = = 1) x < - readRDS x (x)}
最后,我们可以运行基准:
res < - runPipeline(数据集,选择,pipelineDef =皮普,nthreads = 4)拉普兰人(负责人res评价dea美元)
美元logFC数据集filt minCount股东价值分析。k dea方法。logFC方法。皮尔森logFC。斯皮尔曼logFC。疯狂ntested 1 dataset1没有10 1 dea。磨边机0.6271934 0.6801934 0.2549843 90 2 dataset1 dea 10没有2。磨边机0.6271934 0.6801934 0.2549843 90 3 dataset1没有10上海广电。dea svaseq 1。磨边机0.6287638 0.6725422 0.2814868 90 4 dataset1没有10上海广电。dea svaseq 2。磨边机0.6399500 0.6901400 0.2542854 90 5 dataset1 def.filter 10 1 dea。磨边机0.9294525 0.8948433 0.1946729 51 6 dataset1 def.filter 10没有2 dea。磨边机0.9294525 0.8948433 0.1946729 51美元意义数据集filt minCount股东价值分析。k dea方法。阈值方法TP FP TPR PPV罗斯福玻璃钢1 dataset1没有10 1 dea。磨边机0.01 26 1 0.3823529 0.9629630 0.03703704 1.909091 - 2 dataset1 dea 10没有2。磨边机0.05 31 2 0.4558824 0.9393939 0.06060606 1.681818 3 dataset1没有10股东价值分析。dea svaseq 1。edgeR 0.10 35 5 0.5147059 0.8750000 0.12500000 1.500000 4 dataset1 none 10 sva.svaseq 2 dea.edgeR 0.01 26 1 0.3823529 0.9629630 0.03703704 1.909091 5 dataset1 def.filter 10 none 1 dea.edgeR 0.05 31 2 0.4558824 0.9393939 0.06060606 1.681818 6 dataset1 def.filter 10 none 2 dea.edgeR 0.10 35 5 0.5147059 0.8750000 0.12500000 1.500000
结果可以很容易地绘制直接使用ggplot2,我们已经包括在pipeComp一些方便的绘图功能(下图所示)。概述的一般结构聚合管道的结果,看到了主要pipeComp装饰图案。
我们跑这管道在一个更有趣的替代方法,并包含结果的包:
数据(“exampleDEAresults”,包=“pipeComp”) res < - exampleDEAresults
我们可以使用默认pipeComp
绘制方法与结果:
plotElapsed (res agg.by = " sva.method”)
evalHeatmap (res, = c (“TPR”、“罗斯福”、“logFC.pearson”), agg.by = c(“股东价值分析。法”、“dea.method”), row_split = "股东价值分析。方法”)
的agg.by
理由让你控制的参数显示的值应该为每个替代(值平均在其他参数的选择)。默认情况下,TRP,罗斯福在这里平均阈值用于评价意义,但我们可以使用一个特定的阈值过滤:
evalHeatmap (res, = c (“TPR”、“罗斯福”),agg.by = c(“股东价值分析。法”、“dea.method”), row_split = "股东价值分析。阈值法”,filterExpr = = = 0.05)
我们看到从之前的情节,使用SVA-based方法改善预期的相关性foldchange以及DEA的力量,同时确保错误控制(RUVr除外)。
我们也可以使用TPR-FDR曲线代表的准确性:
图书馆(ggplot2) dea_evalPlot_curve (res agg.by = c (“sva.method”、“dea.method”), colourBy = "股东价值分析。法”,shapeBy = " dea.method”)
dea_evalPlot_curve (res agg.by = c (“sva.method”)) + ggtitle(“股东价值分析方法、平均在DEA方法”)
曲线表明名义罗斯福的三分阈值为0.01,0.05和0.1分别(在第二个情节,填充点显示,观察到罗斯福低于或等于名义罗斯福)。
我们还可以看到,错误控制维护即使增加代理变量的数量:
evalHeatmap (res, = c (“TPR”、“罗斯福”),agg.by = c (“sva.method”、“k”), show_column_names = TRUE, anno_legend = FALSE, row_split = "股东价值分析。阈值法”,filterExpr = = = 0.05)