在艺术许可下,您可以自由使用和重新发布此软件。
我们应用聚类合并方法对流式细胞术数据中的细胞群进行自动门控。混合模型的最大BIC模型拟合准则通常高估了流式细胞术数据中细胞群(即簇)的数量,因为精确模拟分布所需的混合组分的数量通常大于不同细胞群的数量。基于熵的模型拟合准则,如ICL,可以更好地估计聚类数量,但往往不能很好地拟合底层分布。我们结合这两种方法,合并混合成分从最大BIC拟合基于熵准则。这种方法允许多个混合成分表示相同的细胞亚群。合并的集群本身是混合物,并由其组成模型参数的加权组合进行总结。结果是一个混合模型,它保留了最大BIC解的良好模型拟合特性,但组分的数量更接近地反映了不同细胞亚群的真实数量。
flowMerge
需要几个包预安装完整的功能。具体地说,flowClust
,flowCore
,flowViz
而且雪
(用于并行计算)应该被安装和功能。
为了证明其功能,我们使用来自药物筛选项目的流式细胞术数据集来识别能够增强治疗性单克隆抗体Rituximab抗淋巴瘤活性的药物。数据集是类的对象flowFrame
;它由八个变量组成,其中只有两个散射变量(FSC.H
,SSC.H
)和两个通道进行氟铬测量(FL1.H
,FL3.H
)都对这个实验感兴趣。flowMerge包可以在对flowClust的调用输出时调用,也可以在flowFrame
直接通过并行化方法pFlowMerge
,它自己会调用flowClust
但是扔掉中间结果。下面的代码将以并行方式使用flowClust对一个到10个集群建模雪
,选择最佳BIC解,合并最佳BIC解中的聚类,根据熵准则选择最佳合并解,然后绘制结果图。该功能封装在pFlowMerge
函数,并使用额外的并行化雪
.此外,如果传递给pFlowMerge的snow集群对象为空,则调用非并行版本的flowMerge。
图书馆(flowMerge)#>加载所需的包:图形#>加载所需的包:BiocGenerics# >#>附加包:“BiocGenerics”下面的对象将从'package:stats'中屏蔽:# >#> IQR, mad, sd, var, xtabs下面的对象从'package:base'中屏蔽:# >#>过滤器,查找,映射,位置,减少,anyduplication, aperm,追加,#> as.data.frame, basename, cbind, colnames, dirname, do.call,#> duplicate, eval, evalq, get, grep, grepl, intersect, is。unsorted,#> lapply, mapply, match, mget, order,粘贴,pmax, pmax.int, pmin,#> pmin.int, rank, rbind, rownames, sapply, setdiff, sort, table#> tapply,联合,唯一,unsplit。马克斯,which.min#>加载所需的包:feature#>加载所需的包:flowClust# >#>附加包:'flowClust'以下对象从'package:BiocGenerics'中屏蔽:# ># >地图下面的对象从'package:graphics'中屏蔽:# ># >盒子下面的对象从'package:base'中屏蔽:# ># >地图#>加载所需的包:Rgraphviz#>加载所需的包:网格#>加载所需的包:foreach#>装载所需的包裹:雪# >#>附加包:'flowMerge'下面的对象从'package:snow'中屏蔽:# ># > checkForRemoteErrors下面的对象从'package:stats'中屏蔽:# ># > BIC
数据(利妥昔单抗)总结(利妥昔单抗)#> fsc.h ssc.h fl1 . h fl2.h fl3.h fl1。FL1。W#>最低59.0000 11.0000 0.0000 0.0000 1.000 0.0000 0.00000#>第一区。178.0000 130.0000 197.0000 55.0000 150.000 0.0000 0.00000#>中位数249.0000 199.0000 244.0000 116.0000 203.000 0.0000 0.00000#>平均287.0822 251.8265 349.1638 126.3994 258.345 73.4589 17.59871#>三区。331.0000 307.0000 445.0000 185.0000 315.000 8.0000 0.00000#>最大值1023.0000 1023.0000 974.0000 705.0000 1023.000 1023.0000 444.00000# >时间#>最低2.0000#> 1区。140.0000#>中位数285.0000#>平均294.0388#>三区。451.0000#>最大598.0000flowClust。res < -flowClust(利妥昔单抗,varNames =c(colnames(利妥昔单抗)[1:2]),K =1:6,反式=1,所花=1,randomStart =20.);
flowClust。保留区flowClust
对象,其中包含5集群解决方案。我们提取每个溶液的内部BICflowMerge
函数BIC
:
在这里,我们提取了K=4时的最大BIC解。在最大BIC解决方案上运行聚类合并算法之前,我们必须创建一个flowObj
对象的flowClust
结果和flowFrame
数据。然后运行合并
函数在flowObj
然后从合并的结果中提取聚类熵ENT
函数。合并的群集解决方案列表输入到fitPiecewiseLinreg
函数。该函数拟合熵与聚类数量的分段线性回归,并在适当的情况下定位变化点的位置。模型选择是通过BIC准则完成的。可以选择绘制拟合结果。
flowClust.flowobj < -flowObj(flowClust.maxBIC,利妥昔单抗);flowClust.merge < -合并(flowClust.flowobj度量=“熵”);#>合并为3个集群#>合并为2个集群#>合并为1个集群更新模型统计信息#>异常值识别规则:90%分位数更新模型1#>异常值识别规则:90%分位数更新模型2#>异常值识别规则:90%分位数更新模型3#>异常值识别规则:90%分位数更新模型4我< -fitPiecewiseLinreg(flowClust.merge);
接下来,我们提取合并的解,其中簇的数量等于通过找到的变更点的位置fitPiecewiseLinreg
.这是基于熵准则的最优合并解。解可以用情节
方法。
票面价值(mfrow =c(2,2));flowClust.mergeopt < -flowClust.merge[[我]];情节(flowClust.res [[4]],data =以美罗华主要=“最大BIC方案”);#>异常值识别规则:90%分位数情节(flowClust.res [[which.max(flowMerge:::ICL(flowClust.res))]],data =以美罗华主要=“最大ICL解决方案”);#>异常值识别规则:90%分位数情节(flowClust.mergeopt水平=0.75,pch =20.,主要=“合并方案”);#>异常值识别规则:75%分位数
我们看到,与最大BIC溶液或最大ICL溶液相比,合并溶液更适合淋巴细胞群。此外,与ICL溶液相比,碎片和粒细胞也能清晰识别。我们可以提取淋巴细胞群,只在淋巴细胞的荧光通道上重新运行flowClust和flowMerge。
流行< -哪一个(应用(应用(getEstimates(flowClust.mergeopt)$地点,2,函数(x)订单(x,减少=真正的)= =2),1));淋巴细胞< -分裂(flowClust.mergeopt人口=列表(“淋巴细胞”=流行))$淋巴细胞;<淋巴细胞(淋巴细胞、c(3.,5));l.flowC < -flowClust(淋巴细胞,varNames =c(“FL1.H”,“FL3.H”),K =1:8,B =1000,B.init =One hundred.,托尔=1 e-5,tol.init =1)依照,randomStart =50,ν=4,所花=1,反式=1);
淋巴细胞的数量介于碎片和粒细胞之间。我们可以很容易地通过检查三个总体的平均数来选择它。我们只对荧光通道感兴趣,所以我们用[]
继承自flowClust
.最后,另一个呼叫flowClust
对淋巴细胞亚群进行一轮聚类。
票面价值(mfrow =c(2,2));l.flowO < -flowObj(l.flowC [[which.max(flowMerge:::BIC(l.flowC))]],淋巴细胞);情节(l.flowO主要=“最大BIC解”,new.window =F,pch =20.,水平=0.9);#>异常值识别规则:90%分位数情节(flowObj(l.flowC [[which.max(flowMerge:::ICL(l.flowC))]],淋巴细胞),主要=“最大ICL解决方案”,new.window =F,pch =20.,水平=0.9);#>异常值识别规则:90%分位数l.flowM < -合并(l.flowO);#>合并为5个集群#>合并为4个集群#>合并为3个集群#>合并为2个集群#>合并为1个集群更新模型统计信息#>异常值识别规则:90%分位数更新模型1#>异常值识别规则:90%分位数更新模型2#>异常值识别规则:90%分位数更新模型3#>异常值识别规则:90%分位数更新模型4#>异常值识别规则:90%分位数更新模型5#>异常值识别规则:90%分位数更新型号6我< -fitPiecewiseLinreg(l.flowM情节=T);情节(l.flowM[[我]],new.window =F,主要=“最佳合并方案”,pch =20.,水平=0.9);
#>异常值识别规则:90%分位数
我们通过选择最佳拟合合并解决方案并将其与最大BIC和最大ICL解决方案进行比较来完成分析。使用snow包的并行计算第一节中描述的方法被包装在一个单独的函数调用中,具有利用并行处理功能的额外好处雪
包装,以加快模型的拟合使用flowClust
.这个函数pFlowMerge
可以传递多个流帧的形式为一个流集,或一个流帧列表,以及雪
集群对象,以及所需的常用参数集flowClust
来指定模型。该调用使每个模型的多个模型的计算并行flowFrame
.例如,如果有人想拟合所有模型,从一个集群模型到十个流帧的十个集群模型,这些模型将分布在定义的处理器数量中雪
集群对象。每个处理器将被分配单个流帧和模型组合的计算,直到所有处理器都被占用。这大大加快了高通量分析设置中的计算速度。
得到的模型对每个模型的最大BIC解进行评估flowFrame
时,在每个最大BIC解上运行归并算法,找到示例中描述的最优归并解并返回给用户。非并行版本可以通过pFlowMerge调用,参数' ' cl "等于NULL。
flowMerge算法已更新以提高速度,并且现在支持并行化foreach
软件包安装完成。FlowMerge现在也支持马氏距离度量和熵的合并。这些参数可以通过可选参数指定给合并算法度规
论点(公制= c(“熵”、“mahalanobis”)
到合并()
函数。默认是使用“熵”。
我们增加了一些新的特征,用于绘制合并种群的树,并根据标记表达突出显示节点/种群。以上荧光标记:
需要(Rgraphviz)f < -ptree(“l.flowM”,fitPiecewiseLinreg(l.flowM));票面价值(mfrow =c(1,2))f(1);一个有向边的graphNEL图#>节点数= 5#>边数= 4f(2);
#>有向边的graphNEL图#>节点数= 5 #>边数= 4
带有虚线边界的圆形节点表示合并的集群。椭圆节点表示最佳拟合模型中所选择的总体。方形节点显示完整合并到单个集群的其余部分。红色表示该标记的高表达,蓝色/绿色表示低表达。请注意,它在数据范围的0到1之间进行了规范化。
FlowMerge正在进行持续的可用性改进,特别是在并行计算框架方面。将输出优点和其他统计数据,以便用户监视合并算法在处理大型数据集时的成功或失败。在多个样本中对淋巴细胞群进行半监督选择的框架也在研究中。pFlowMerge不做任何复杂的内存管理,因此,如果你有一个大的数据集,我们建议将它一块一块地馈送到pFlowMerge,这取决于你的机器/集群可用的RAM数量。
问:如何使用pFlowMerge?
答:pFlowMerge的实现是为了并行化流集或流帧列表的计算,而不是一个流帧中的多个集群。例如,如果数据
是flowSet
十flowFrames
而且cl
是一个雪
10个节点的集群,然后运行pFlowMerge (cl flowSet varNames = c(“A”、“B”、“c”),K = 1:10)
会分配10个flowFrames
横跨十个节点,每个节点将评估模型K = 1:10
集群。如果你想并行化K = 1:10
如果需要跨多个节点进行集群计算,则需要使用雪
功能直接,如:clusterMap (cl,函数(…)(flowClust(…)),列表(flowFrame) varNames =列表(c(“A”、“B”、“c”),K = 1:10)
.这将分布的计算flowFrame
对于每一个值K = 1
通过K = 10
组件横跨十个节点的cl
.的添加试着()
包装器确保即使单个模型未能收敛给定的值,函数也将返回K
.或者,如果你想做上面的一个flowSet
的每个元素都需要复制flowSet
K $ _{马克斯
\(}次,其中' K\)_{马克斯$}是要计算的模型组件的总数
flowFrame.再举一个例子:
clusterMap (cl,函数(…)(flowClust(…)),代表(如(flowSet,“列表”),每个=长度(Kvector)), varNames =列表(c(“A”、“B”、“c”)),K = Kvector).请记得确保
flowClust加载到节点上的每个R工作环境中,通过调用
clusterEvalQ (cl,库(flowClust))”。