这个包的目的是提供存储、表示和交换门控流数据的基础设施。我们的意思是,在门控树中访问样本、组、转换、补偿矩阵、门和总体统计数据,表示为GatingSet
对象R
.
的GatingSet
可以从头开始构建内部吗R
或从flowJo
XML工作空间(即:. xml
或.wsp
文件)或GatingML
文件。注意,我们不能导入.jo
直接文件。您必须将它们保存为XML工作空间格式。
下面一节将介绍如何打开和导入flowJo工作区。
我们使用flowJoWorkspace
对象。我们只需要知道flowJo工作区的路径和文件名。
library(flowWorkspace) path <- system.file("extdata",package="flowWorkspaceData");Wsfile <- list。files(path, pattern="A2004Analysis.xml", full = TRUE)
为了打开这个工作空间,我们调用:
ws <- openWorkspace(wsfile) ws . ws
## FlowJo工作区2.0版本##文件位置:/home/biocbuild/论坛-3.8-bioc/R/library/flowWorkspaceData/extdata ##文件名称:A2004Analysis.xml ##工作区打开## ##工作空间中的组##名称Num.Samples ## 1所有样本
我们看到这是一个2.0版本的工作区文件。它的位置和文件名被打印出来。此外,您会收到工作区文件已打开的通知。这指的是XML文档在内部使用“C”数据结构来表示XML
包中。导入文件后,必须使用显式地关闭工作空间closeWorkspace ()
为了释放内存。
打开工作区文件后,可以通过一些辅助方法访问一些基本示例信息。例如,工作区中的示例列表可以通过以下方式访问:
getSamples (ws)
## sampleID的名称计数。计数## 1 1 a2004_O1T2pb05i_A1_A01。fcs 61832 1 19 ## 2 2 a2004_O1T2pb05i_A2_A02。FCS 45363 1 19
的列表
列告诉您对一组文件应用哪个补偿矩阵,类似地,根据补偿矩阵的名称,告诉您应用哪些转换。
可以通过以下方式访问这些组:
getSampleGroups (ws)
1所有样本0 1 ## 2所有样本0
存储在xml工作区中的关键字也可以通过以下方式检索:
sn <- "a2004_O1T2pb05i_A1_A01. "fcs" getKeywords(ws, sn)[1:5]
# # $ $ BEGINANALYSIS # #[1]”0 " ## ## $`$ BEGINDATA“# #”[1]3803 " ## ## $`$ BEGINSTEXT # #[1]”0 " ## ## $`$ BTIM“# # 09:20:24[1]” " ## ## $`$ BYTEORD # #[1]”4、3、2、1”
这些都是通过直接查询xml文件检索的。为了获得关于门控树的更多信息,我们需要实际地将XML工作空间解析为R数据结构,以表示其中的一些信息。具体来说,通过调用parseWorkspace ()
用户将看到一个列表组
在工作空间文件中,需要选择一个组来导入。为什么只有一个?因为flowJo处理数据转换和补偿的方式。每组样本都与一个补偿矩阵和特定的数据转换相关联。这些适用于组中的所有样本。当导入一组特定的样本时,包会生成一个GatingHierarchy
对于每个示例,描述应用于数据的一组门(注意:支持多边形、矩形、象限、椭圆和布尔门)。样本组的GatingHierarchies集存储在GatingSet
对象。调用parseWorkspace ()
相当详细,在创建每个门时通知用户。通过在函数调用中指定要直接导入的组(索引或组名),也可以非交互式地进行解析。一个额外的可选参数执行= T / F
指定在解析XML树后是否要立即加载、补偿、转换数据和计算统计信息。论点路径
可用于指定FCS文件的存储位置。
gs <- parseWorkspace(ws,name = 1);#导入第一组
## mac版本的flowJo工作空间识别。##无效zeroChan: -2147483648 ##由于无效的双exp参数!将biexp下拉到校准表!##无效zeroChan: -2147483648 ##由于无效的双exp参数!将biexp下拉到校准表!##无效zeroChan: -2147483648 ##由于无效的双exp参数!将biexp下拉到校准表!##无效zeroChan: -2147483648 ##由于无效的双exp参数!将biexp下拉到校准表!##无效zeroChan: -2147483648 ##由于无效的双exp参数!将biexp下拉到校准表!##无效zeroChan: -2147483648 ##由于无效的双exp参数!将biexp下拉到校准表!##无效zeroChan: -2147483648 ##由于无效的双exp参数!将biexp下拉到校准表!##无效zeroChan: -2147483648 ##由于无效的双exp参数!将biexp下拉到校准表!##无效zeroChan: -2147483648 ##由于无效的双exp参数!将biexp下拉到校准表!
#大量的输出在这里抑制小插图。gs
一个2个样本的GatingSet
我们生成了一个GatingSet
2个样本,每个样本有19个相关联的门。
列出储存在GatingSet
:
sampleNames (gs)
a2004_O1T2pb05i_A1_A01。fcs_61832 a2004_O1T2pb05i_A2_A02.fcs_45363”
注意,它与前面的调用不同getSamples
在工作空间
后者列出的所有样品存储在哪里xml
文件,这里是实际被解析的。因为有时由于各种原因,并不是所有的xml样本都会被导入。我们还看到了一个额外的字符串_xxx
附加到每个示例名称的末尾。这是由于争论additional.keys
默认值是否为“合计美元”
.查看有关这些解析选项的详细信息如何解析一个flowJo工作区.
我们目前支持从gatingML2.0导出文件Cytobank
系统。这可以用一个方便的函数来完成parse.gatingML
从CytoML
的文件路径gatingML
而且FCS
.
fcsFiles <- list. library(巨细胞)xmlfile <- system.file("extdata/cytotrol_tcell_cytobank.xml", package = "巨细胞")files(pattern = "CytoTrol", system. txt)file("extdata", package = "flowWorkspaceData"), full = T) gs1 <- parse. file("extdata", package = "flowWorkspaceData"), full = T)gatingML (xmlfile fcsFiles)
如果您想深入了解解析过程的细节和子步骤,请参阅CytoML.
的子集GatingSet
可以使用标准R子集语法访问[
.
gs [1]
一个带有1个样本的GatingSet
至此,我们已经解析了工作空间文件,并生成了与从该文件导入的每个示例相关联的门控层次结构。数据已经在工作空间中加载、补偿和转换,并且已经执行了门控。由此产生的GatingSet
包含原始flowJo工作区的复制分析。
我们可以绘制门控树:
情节(gs)
我们可以列出门控层次结构中的节点(种群):
getNodes(gs, path = 1)
# #[1]“根”“生活”“APC”“B细胞”“争取民主变革运动”# #[6]“IFNa +”“il - 6 +”“il - 12 +”“TNFa +”“pDC”# #[11]“IFNa +”“il - 6 +”“il - 12 +”“TNFa +”“CD14-MHC2——“# #[16]“单核细胞”“IFNa +”“il - 6 +”“il - 12 +”“TNFa +”
请注意,路径
参数指定每个填充的门控路径的深度。如图所示,深度
的1
(即叶或终端节点名)可能不足以唯一地标识每个种群。这个问题可以通过增加路径
或者简单地返回节点的完整路径:
getNodes(gs, path = "full")
# #[1]“根”“/现场”# #[3]“/生活/ APC”“/生活/ APC / B细胞”# #[5]“/生活/ APC /争取民主变革运动”“/生活/ APC / mDC / IFNa +”# #[7]“/生活/ APC / mDC / il - 6 +”“/生活/ APC / mDC / il - 12 +”# #[9]“/生活/ APC / mDC / TNFa +”“/生活/ APC / pDC”# #[11]“/生活/ APC / pDC / IFNa +”“/生活/ APC / pDC / il - 6 +”# #[13]“/生活/ APC / pDC / il - 12 +”“/生活/ APC / pDC / TNFa +”# #[15]“/生活/ CD14-MHC2——”“/生活/单核细胞”# #[17]“/生活/单核细胞/ IFNa +”“/生活/单核细胞/ il - 6 +”# #[19]“/生活/单核细胞/ il - 12 +”“/生活/单核细胞/ TNFa +”
但完整的
路径可能不是必需的,并且可能太长而无法可视化。所以我们提供了Path = 'auto'
选项,以确定门控树中仍然唯一的最短路径。
节点列表<- getNodes(gs, path = "auto"
# #[1]“根”“生活”“APC”# #[4]“B细胞”“争取民主变革运动”“争取民主变革运动/ IFNa + # #[7]“争取民主变革运动/ il - 6 +”“争取民主变革运动/ il - 12 +”“争取民主变革运动/ TNFa + # #[10]“pDC”“pDC / IFNa +”“pDC / il - 6 + # #[13]“pDC / il - 12 +”“pDC / TNFa +”“CD14-MHC2——“# #[16]“单核细胞”“单核细胞/ IFNa +”“单核细胞/ il - 6 + # #[19]“单核细胞/ il - 12 +”“单核细胞/ TNFa +”
我们可以得到与特定人群相关的门:
node <- nodelist[3] g <- getGate(gs, node) g
# # a2004_O1T2pb05i_A1_A01美元。fcs_61832 ##多边形门'APC'与14个顶点的尺寸和 ## ## $a2004_O1T2pb05i_A2_A02。多边形门'APC',尺寸和
我们可以检索人口统计数据:
getPopStats (gs) [1:10]
Population ParentCount ParentCount ## 1: a2004_O1T2pb05i_A1_A01。fcs_61832 Live root 49484 61832 ## 2: a2004_O1T2pb05i_A1_A01。fcs_61832 APC Live 4154 49484 ## 3: a2004_O1T2pb05i_A1_A01。fcs_61832 B Cell APC 2311 4154 ## 4: a2004_O1T2pb05i_A1_A01。fcs_61832 mDC APC 512 4154 ## 5: a2004_O1T2pb05i_A1_A01。fcs_61832 mDC/IFNa+ mDC 2 512 ## 6: a2004_O1T2pb05i_A1_A01。fcs_61832 mDC/IL-6+ mDC 22 512 ## 7: a2004_O1T2pb05i_A1_A01。fcs_61832 mDC/IL-12+ mDC 2 512 ## 8: a2004_O1T2pb05i_A1_A01。fcs_61832 mDC/TNFa+ mDC 72 512 ## 9: a2004_O1T2pb05i_A1_A01。fcs_61832 pDC APC 433 4154 ## 10: a2004_O1T2pb05i_A1_A01。fcs_61832 pDC/IFNa+ pDC 0 433
我们可以画出单独的门:注意转换后的轴的比例。第二个参数是任何深度的节点路径,只要它是唯一可识别的。
plotGate (gs, pDC)
关于门可视化的更多细节可以找到在这里.
如果我们有与实验相关的元数据,它可以附加到GatingSet
.
d <- data.frame(sample=factor(c("sample 1", "sample 2")),treatment=factor(c("sample","control"))) pd <- pData(gs) pd <- cbind(pd,d) pData(gs) <- pd pData(gs)
##名称示例## a2004_O1T2pb05i_A1_A01。fcs_61832 a2004_O1T2pb05i_A1_A01。fcs样本1 ## a2004_O1T2pb05i_A2_A02。fcs_45363 a2004_O1T2pb05i_A2_A02。fcs样品2处理## a2004_O1T2pb05i_A1_A01。fcs_61832样本## a2004_O1T2pb05i_A2_A02。fcs_45363控制
我们可以子集GatingSet
由其pData
直接:
子集(gs, treatment == "control")
一个带有1个样本的GatingSet
的下属流动数据
(flowSet
或ncdfFlowSet
)可通过以下方法检索:
- getData(gs)类(fs)
# #[1]“ncdfFlowSet”# # attr(“包”)# #[1]“ncdfFlow”
nrow (fs [[1]])
## [1] 61832
注意,在解析过程中,数据已经进行了补偿和转换。
我们可以检索与总体节点相关的数据子集:
fs <- getData(gs, node) nrow(fs[[1]])
## [1] 4154
我们可以检索一个门控层次树(对应于一个样本)[[
操作符
Gh <- gs[[1]] Gh
示例:a2004_O1T2pb05i_A1_A01。fcs_61832有20个门的等级结构
注意,索引可以是数字,也可以是字符guid
返回的sampleNames
方法)
我们可以对它做类似的运算GatingHierarchy
对象和相同方法的行为不同GatingSet
头(getPopStats (gh))
## openCyto.freq xml.freq计算xml。计数节点## 1:1.00000000 1.000000000 61832 61832根## 2:0.80029758 0.801235606 49484 49542 Live ## 3: 0.08394633 0.083585645 4154 4141 APC ## 4: 0.55633125 0.548418256 2311 2271 B Cell ## 5: 0.12325469 0.121226757 512 502 mDC ## 6: 0.00390625 0.003984064 22 mDC/IFNa+
在这里getPopStats
返回直接存储的两个统计数据flowJo
XML工作空间和由GatingSet
穿过门。由于数值误差,两者之间可能会有微小的差异。然而,差异不应该太大。因此,这可以作为解析精度的有效性检查。
plotPopCV (gh)
plotGate
方法将在同一绘图中布局所有门,而不指定任何节点
plotGate (gh)
我们可以检索索引,指定一个事件是包含在gate内部还是外部使用:
表(getIndices (gh、节点))
## ##假真## 57678 4154
返回的索引相对于父群体(父群体的成员和当前门的成员),因此它们反映了真正的分层门控结构。
我们可以检索所有的补偿矩阵GatingHierarchy
如果我们希望对新数据使用补偿或转换,
C <- getCompensationMatrices(gh);C
补偿对象defaultCompensation:## Am青色- a太平洋蓝- APC-A APC-CY7-A Alexa 700 ## # Am青色- a 1.00000 0.04800 0.000000 0.0000 0.00000 ##太平洋蓝- a 0.38600 1.00000 0.000529 0.000000 0.19800 ## APC-A 0.00642 0.00235 1.000000 0.064000 1.0000 0.019800 ## APC-CY7-A 0.03270 0.02460 0.084000 1.0000 0.02870 ## # Alexa 700-A 0.07030 0.05800 0.016200 0.3990 1.00000 ## FITC-A 0.74500 0.02090 0.001870 0.0000 0.00000 0.00000 ## PerCP-CY5-5-A 0.00368 0.00178 0.015300 0.0269 0.07690 ## PE-CY7-A 0.01330 0.00948 0.000951 0.1380 0.00182 ## #PerCP-CY5-5-A PE-CY7-A ## Am青色- a 0.028500 0.00104 0.00000 ##太平洋蓝- a 0.000546 0.00000 0.00000 0.00000 ## APC-A -0.000611 0.00776 0.00076 ## APC-CY7-A 0.002690 0.00304 0.01010 ## Alexa 700-A 0.001530 0.10800 0.00679 ## FITC-A 1.000000 0.04180 0.00281 ## PerCP-CY5-5-A 0.000000 1.00000 0.03360 1.00000 ##
或者我们可以检索转换:
T <- gettransforms (gh) names(T)
# #[1]“< Alexa 700 - - - > " <我Cyan-A >”“< APC-A >“# #[4]”< APC-CY7-A >”“< FITC-A >”“<太平洋蓝色a >“# #[7]”< PE-CY7-A >”“< PerCP-CY5-5-A >”“Alexa 700 - h”# #[10]“我Cyan-H”“APC-CY7-H”“APC-H”# #[13]“FITC-H”“太平洋Blue-H”“PE-CY7-H”# #[16]“PerCP-CY5-5-H”
T [[1]]
# #函数(x,引出= 0 ) ## { ## 引出< - as.integer(导数)# #如果(引出< 0 | |引出> 3)# #停止(“导数必须介于0和3”)# #如果(引出> 0){# # z0 < -双(z $ n) # # z [c(“y”、“b”、“c”)]< -开关(引出、列表(y = z $ b, b z = 2 * # # $ c, c = 3 * z $ d),列表(y = 2 * z $ c, b = 6 * z $ d, # # c = z0),列表(y = 6 * d (z美元),b = z0, c = z0)) # # z [[d]] < - z0 # #} # # res < -统计数据:::。splinefun (x, z) # #如果(引出> 0 z方法= = 2美元& & & &(印第安纳州< - x z < = $ x [1 l])) # # res(印第安纳州)< - ifelse(引出= = 1,z $ y l [1], 0) # # res ## } ## < 字节码:0 x1339b170 > # # <环境:0 xfaa3b88 > # # attr(“类型”)# #[1]“biexp”# # attr(,“参数”)# # attr(“参数”)$ channelRange # # 4096 # # # # attr[1](“参数”)maxValue # #美元[1]262144 # # # # attr(“参数”)neg美元0 # # # # # # [1]attr(“参数”)$ pos # # # # # # 4.5 [1] attr(“参数”)widthBasis # #美元[1]-10
getTransformations
返回要应用于数据的不同维度的函数列表。上面,转换应用于这个示例,使用来自列表的特定于通道的函数转换适当的维度。
GatingSet
提供了从原始FCS文件构建门控树的方法,并在其中添加或删除flowCore门(或种群)。
首先,我们从一个包含三个无门控流样本的flowSet开始:
data(GvHD) #选择原始流量数据fs <- GvHD[1:2]
然后从\code{flowSet}构造一个\code{GatingSet}:
gs <- GatingSet(fs)
然后进行补偿:
Cfile <- system。file("extdata","compdata","compmatrix", package="flowCore") comp.mat <- read. file("extdata","compdata","compmatrix", package="flowCore")table(cfile, header=TRUE, skip=2, check.names = FALSE) ##创建补偿对象comp <-补偿(comp.mat) #补偿GatingSet gs <-补偿(gs, comp)
新:您现在可以传递一个列表补偿
对象,其元素命名为sampleNames (gs)
实现样本特定补偿。如。
Gs <-补偿(Gs, comp.list)
然后我们可以用user through定义的任何转换来转换它trans_new
的函数尺度
包中。
要求(尺度)反式。Func <- sinh inv.func <- sinh trans。obj <- trans_new("myAsinh", trans。func inv.func)
的逆
转换是必需的,以便盖茨
并且数据可以在改变了
规模与轴
标签仍然保持原始的规模。(可选)休息时间
而且格式
函数可以进一步定制轴标签的外观。
除了手工完成所有这些,我们还提供了一些内置转换:asinhtGml2_trans
,flowJo_biexp_trans
,flowJo_fasinh_trans
而且logicle_trans
.这些都是流数据分析中非常常用的转换。用户可以通过简单的一行代码来构造转换对象。如。
反式。obj <- asinhtGml2_trans() trans.obj .obj
##转换器:asinhtGml2
一次变压器
对象创建时,必须将其转换为transformerList
为GatingSet
使用。
chnls <- colnames(fs)[3:6] transList <- transformerList(chnls, trans.obj)
或者,重载estimateLogicle
方法可以直接用在GatingHierarchy
生成transformerList
自动对象。
estimateLogicle (gs [[1]], chnls)
## $ ' FL1-H ' ##变压器:logicle ## ## $ ' FL2-H ' ##变压器:logicle ## ## $ ' FL3-H ' ##变压器:logicle ## ## $ ' FL2-A ' ##变压器:logicle ## ## attr(,“类”)## [1]"transformerList" "list"
现在我们可以变换GatingSet
与transformerList
对象。它还将转换存储在GatingSet
可以用来对数据进行逆变换。
gs <- transform(gs, transList) getNodes(gs)
##[1]“根”
它现在只包含根节点。我们可以添加第一个矩形legate:
rg <- rectangleGate("FSC-H"=c(200,400), "SSC-H"=c(250,400), filterId="rectangle") nodeID <- add(gs, rg) nodeID
## [1] 2
getNodes (gs)
##[1]“root”“/矩形”
注意,如果没有指定parent,默认情况下gate会被添加到根节点。然后,我们将一个quadGate添加到由矩形门生成的新填充中,矩形门以该门的filterId命名,因为该名称没有指定添加
方法。
qg <- quadGate("FL1-H"= 0.2, "FL2-H"= 0.4) nodeIDs <- add(gs,qg,parent="rectangle") nodeIDs . qg <- quadGate("FL1-H"= 0.2, "FL2-H"= 0.4
## [1] 3 4 5 6
getNodes (gs)
##[1]“root”/矩形“##[3]”/矩形/CD15 FITC-CD45 PE+“”/矩形/CD15 FITC+CD45 PE+“##[5]”/矩形/CD15 FITC+CD45 PE-“/矩形/CD15 FITC-CD45 PE-”
这里quadGate生成了四个种群节点/种群,如果没有指定,它们的名称将以gate的维度命名。
Boolean Gate也可以定义并添加到GatingSet:
bg <- booleanFilter(' CD15 FITC-CD45 PE+|CD15 FITC+CD45 PE- '
booleanFilter筛选'CD15 FITC-CD45 PE+|CD15 FITC+CD45 PE-',评估表达:## CD15 FITC-CD45 PE+|CD15 FITC+CD45 PE-
nodeID2 <- add(gs,bg,parent="rectangle"
## [1]
getNodes (gs)
[1]“根”##[2]”/矩形“##[3]”/矩形/CD15 FITC-CD45 PE+“##[4]”/矩形/CD15 FITC-CD45 PE+“##[6]”/矩形/CD15 FITC-CD45 PE-“##[7]”/矩形/CD15 FITC- CD15 FITC-CD45 PE+|CD15 FITC+CD45 PE-”
门控层级由:
情节(gs, bool = TRUE)
注意,boolean gate在默认情况下是跳过的,因此需要显式启用。
现在所有的门都被添加到门控树中,但实际数据还没有被门控。这是通过调用来完成的再计算
方法explictily:
验算(gs)
门控完成后,门控结果可以通过plotGate
方法:
plotGate(gs,"rectangle") #plot one Gate
可以在同一面板上绘制多个门:
plotGate (gs getChildren (gs[[1]],“矩形”))
我们也可以在不指定门索引的情况下绘制所有的门:
plotGate (gs [[1]], bool = TRUE)
如果我们想删除一个节点,只需:
Rm('矩形',gs) getNodes(gs)
##[1]“根”
正如我们所看到的,删除一个节点会导致它的所有后代也被删除。
通常情况下,我们需要保存一个GatingSet,包括门控流数据,门和人口到磁盘上,并在以后重新加载它。可以通过以下方法完成:
TMP <- tempdir() save_gs(gs,path = file.path(TMP,"my_gs")) gs <- load_gs(file.path(TMP,"my_gs"))
我们也提供克隆
方法对现有对象进行完整复制GatingSet
:
gs_clone <- clone(gs)
注意GatingSet
包含环境槽和指向内部C数据结构的外部指针。所以请确保使用这些方法来保存或复制现有对象。正则R赋值(<-)或保存
例程不能按预期工作GatingSet
对象。
如果此包在解析您的工作区时抛出错误,请通过电子邮件与包作者联系,以便发布问题https://github.com/RGLab/flowWorkspace/issues.如果您可以通过电子邮件发送您的工作空间,我们就可以测试、调试和修复包,使其为您工作。我们的目标是提供一种有效的、人们觉得有用的工具。