struct 1.8.0
这篇短文的目的是使用结构体
实现一小组样本对象(即基于类的模板),可用于对多元数据集(如代谢组学或其他组学)进行探索性和统计分析。的更广泛和高级的使用结构体
的模板中提供structToolbox
软件包,其中包括质量过滤器,标准化,缩放,单变量和多变量统计和机器学习方法。
最新版本的结构体
与您当前R版本兼容的可以使用BiocManager
.
#安装BiocManager如果不存在if (!requireNamespace("BiocManager", quiet = TRUE)) install.packages("BiocManager") # install structToolbox和依赖BiocManager::install("struct") # install ggplot if (!require('ggplot2')) {install.packages('ggplot2')}
的ggplot2
包也需要为这个小插图。
suppressPackageStartupMessages({#加载包库(struct) #加载ggplot库(ggplot2)})
结构体
辅助函数' struct '提供了许多帮助函数,可用于创建一个新的结构体
对象从命令行或脚本中获取:
set_struct_obj ()
set_obj_method ()
set_obj_show ()
使用这些函数创建新结构体
部分包含了基于提供的模板的对象5.1.
要创建新的结构对象,请使用set_struct_obj ()
函数。下面将介绍几种输入。
class_name
struct_obj
参数个数
输出
参数个数
,但输出槽。私人
参数个数
而且输出
但是对于对象内部使用而不打算供用户使用的槽。这些插槽只能使用@访问。原型
预测
槽,以设置对象的默认输出。在哪里
.GlobalEnv
中列出的槽请注意参数个数
而且输出
将可使用美元语法访问,并打算由用户获取/设置,而插槽命名在私人
只对开发人员内部可用。
所有结构体
对象有一些默认的方法,这些方法将被“重载”,即替换为提供特定于正在实现的新对象的功能。辅助函数set_obj_method ()
通过以下输入提供此功能:
class_name
method_name
定义
签名
显示
输出所有结构体
对象有一个默认值显示
输出,输出的名字
而且描述
为一个对象。
如果希望在打印对象时提供附加信息,则可以重载显示
方法使用set_obj_show ()
函数,它有以下输入:
class_name
extra_string
:class_name
对象作为字符串的输入和输出的字符串输出extra_string
函数将被附加到默认值显示
输出。
结构体
对象结构体
为许多不同类型的对象提供了S4类,可以将其视为可扩展的模板。这些对象是数据分析工作流的基本组成部分,包括:
DatasetExperiment
对象SummarizedExperiment
用于保存数据和元数据的对象模型
对象model_seq
对象迭代器
对象度规
对象图表
对象实体
对象枚举
对象实体
对象,但具有固定的允许值集每个模板都具有类似的结构,并定义了许多特定于模板的方法。它们在设计时考虑到了数据分析工作流程的开发,可以很容易地将新方法合并到现有框架中。
所有结构体
对象有许多在基类中定义的公共字段或“槽”struct_class
对象:
的名字
描述
类型
库
引用
引用
bibentry
格式本体
所有结构体
对象有一个显示
方法定义,该方法总结对象。
S = struct_class(
# #“struct_class”对象 ## ----------------------- ## 名称:# #描述:
可以通过在创建对象时将槽包含为命名输入来设置它们。
struct_class(name = 'Example', description = 'Example struct object'
# #“struct_class”对象 ## ----------------------- ## 名称:# #例子描述:结构体对象的一个例子
还定义了方法,以便可以使用美元语法设置和检索槽的值。
#设置名称S$name = '基本示例
##[1]基本示例
除了这些公开可访问的插槽之外,还定义了两个额外的隐藏或内部插槽。这些槽不用于一般访问,因此不能使用美元语法访问。
.params
模型
,迭代器
或图表
..outputs
模型
或迭代器
.这些槽的使用将在本节中讨论5因为它们只适用于扩展底座时struct_class
模板。
DatasetExperiment
对象的DatasetExperiment
Object是的引申SummarizedExperiment
.它用于保存测量数据和相关的元数据,如组标签或特性/变量注释。所有结构体
对象期望数据位于DatasetExperiment
格式,示例在行中,变量/特征在列中。除了默认的插槽,DatasetExperiment
对象还具有以下附加插槽:
数据
sample_meta
variable_meta
对于所有结构体
对象可以在对象创建期间分配这些槽以及基类中的槽。
DE = DatasetExperiment(data =iris[, 1:4], sample_meta=iris[,5,drop=FALSE], variable_meta=data.frame('idx'=1:4,row.names=colnames(data)), name = "Fisher's iris dataset", description = 'The famous one'
##一个“DatasetExperiment”对象## ---------------------------- #名称:Fisher的虹膜数据集#描述:著名的#数据:150行x 4列# sample_meta: 150行x 1列# variable_meta: 4行x 1列
的虹膜数据集的正式版本包含在结构体
包中。
DE = iris_DatasetExperiment() DE
这个著名的(Fisher’s或Anderson’s)虹膜数据集给出了3种虹膜中各50朵花的萼片长度和宽度以及花瓣长度和宽度的度量,单位分别为厘米。它们的种类是鸢尾,versicolor和virginica。## sample_meta: 150行x 1列## variable_meta: 4行x 1列
因为DatasetExperiment
扩展SummarizedExperiment
它继承了子设置、nrow、ncol等功能。
#列数(DE)
# # 4 [1]
# nrow(DE)
# # 150年[1]
#子集第2和第3列Ds = DE[,c(2,3)] d
这个著名的(Fisher’s或Anderson’s)虹膜数据集给出了3种虹膜中各50朵花的萼片长度和宽度以及花瓣长度和宽度的度量,单位分别为厘米。它们的种类是鸢尾,versicolor和virginica。## sample_meta: 150行x 1列## variable_meta: 2行x 1列
这些槽也可以使用美元语法访问。
获取数据帧头(DE$data)
# #萼片。花萼长度。宽度花瓣。花瓣长度。宽度## 1 5.1 3.5 1.4 0.2 ## 2 4.9 3.0 1.4 0.2 ## 3 4.7 3.2 1.3 0.2 ## 4 4.6 3.1 1.5 0.2 # 5 5.0 3.6 1.4 0.2 ## 6 5.4 3.9 1.7 0.4
# sample元头(DE$sample_meta)
##物种# 1 ## 2 ## 3 ## 4 ## 5 ## 6 #
注意,虽然技术上是可以设置的数据
,sample_meta
而且variable_meta
使用美元语法,通常最好是创建一个新的DatasetExperiment
并在对象创建过程中分配它们,这是由于a的严格定义SummarizedExperiment
.
模型
对象模型对象是最常用的模板,因为它们是数据分析工作流的主要构建块。它们可以用于实现数据处理方法,用于质量过滤、规范化和缩放,以及用于统计和机器学习的方法(如分类、回归和聚类)。
模型
对象定义了三个惟一的槽,但它们都与模型序列相关,因此将在本节中详细讨论6.
模型
对象还有四种方法,用于实际执行预期的数据分析方法。
model_train
DatasetExperiment
对象。model_predict
DatasetExperiment
对象,例如测试集。model_apply
model_train
而且model_predict
按顺序在相同的输入数据上(有时称为自动预测)。model_reverse
model_apply
可以减去均值,而model_reverse
再把均值加回来。为基础模型
模板这些方法只起到占位符的作用;它们应该被定义为扩展模板的一部分,如下一节所述。
模型对象还使用.params
而且.outputs
基类的槽,以允许扩展模板时的灵活性,如下一节所示。
模型
模板的模型
对象用作创建新对象的模板。在编程术语中,它的目的是由它派生的新对象继承。已经定义了方法,以便可以使用新功能重载它们。
在structToolbox
使用定义了许多模型对象setClass
而且setMethod
,这是在包中扩展模板的首选方法。
结构体
也使得定义new成为可能模型
物体,我们会在这里演示。我们将定义两个新对象,一个用于均值居中,另一个用于主成分分析。这些对象的更完整版本可以作为structToolbox
包中。
方法定义新的模型对象是第一步set_struct_object ()
函数(参见3.).
# mean centre对象mean_centre = set_struct_obj(class_name = 'mean_centre', struct_obj = 'model', params = character(mean = 'numeric'), outputs = c(class_name = 'PCA', struct_obj = 'model', params = c(number_components = 'numeric'), outputs = c(scores = 'DatasetExperiment', loading = 'data.frame'), private = character(0),prototype = list(number_components = 2, ontology = 'OBI:0200051', predicted = 'scores'))
我们创建的对象(mean_centre
而且主成分分析
)都延伸模型
对象模板。mean_centre
一个相当基本的模型只有一个输出槽吗集中
而PCA对象有输入、输出并设置一些默认值。
新对象可以像其他对象一样初始化结构体
,带有命名的输入参数值。
M = mean_centre(
# #“mean_centre”对象 ## ---------------------- ## 名称:# #描述:# #输出:集中,意味着# #预测:在# # seq_in:数据
P = PCA(number_components=4
一个“PCA”对象## -------------- ## name: ## description: ## input params: number_components ## outputs: scores, loading ## predictive: scores ## seq_in: data
新对象目前具有默认方法,需要使用either替换这些方法setMethod
或者说辅助函数set_obj_method ()
以提供所需的功能。
我们需要定义model_train
而且model_predict
对于两个新物体。我们将从mean_centre
对象。
#意味着中心培训set_obj_method (class_name = mean_centre, method_name = model_train,定义= function (M, D){#计算所有训练数据列的意思是M = colMeans (D $ data) #分配输出槽M $意味着= M #总是返回修改后的模型对象返回(M)}) # mean_centre预测set_obj_method (class_name = mean_centre, method_name = model_predict,定义= function (M, D){#减去平均每一列的测试数据D $ data = D $ data -代表(M $的意思是,rep.int(nrow(D$data), ncol(D$data))) #分配给输出M$中心= D #总是返回修改后的模型对象返回(M)})
的mean_centre
对象现在可以与DatasetExperiment
对象。
#创建对象实例M = mean_centre() #训练虹膜数据M = model_train(M,iris_DatasetExperiment()) #打印平均值显示函数M$平均值
# #萼片。花萼长度。宽度花瓣。花瓣长度。宽度## 5.843333 3.057333 3.758000 1.199333
# apply to iris_data M = model_predict(M,iris_DatasetExperiment()) #检索居中数据并显示列均值为零colMeans(M$ centric $data)
# #萼片。花萼长度。宽度花瓣。花瓣长度。宽度## -3.671137e-16 9.177844e-17 -3.256654e-17 -3.404684e-17
现在我们为PCA对象定义方法。
# PCA训练set_obj_method(class_name = 'PCA', method_name = 'model_train',定义= function (M, D){#得到的组件数量= M number_components #美元转换为矩阵X = as.matrix (D $ data) #计算模型=圣言(X, A, A) #载荷P = as.data.frame美元(模型v) # data.frame准备输出varnames =代表(' A ', 1)(我在1:A) {varnames[我]= paste0(“个人电脑”,i)} rownames (P) = colnames (X) colnames (P) = varnames output_value (M,“载荷”)= P #设置输出M $载荷= P #总是返回修改后的模型对象返回(M)}) # PCA预测set_obj_method (class_name =“主成分分析”,method_name = ' model_predict ',定义=函数(M, D){# #计算分数使用载荷#获得的组件数量= M number_components #美元转换为矩阵X = as.matrix (D $ data) #得到载荷P = M $载荷#计算分数= X % * % as.matrix (P) #将分数转换成DatasetExperiment = as.data.frame, rownames (,) = rownames (X) varnames =代表(' A ', 1)(我在1:A) {varnames[我]= paste0(“个人电脑”,i)} colnames (,) = varnames S = DatasetExperiment (data = sample_meta = D sample_meta美元,变量_meta=varnames) # set output M$scores=S #总是返回修改后的模型对象返回(M)})
就像mean_centre
对象的主成分分析
对象现在具有已定义的方法,可以与之一起使用DatasetExperiment
对象。
# get average centric data DC = M$ centric # train PCA model P = model_apply(P,DC) # get scores P$scores
一个“DatasetExperiment”对象## ---------------------------- ## name: ## description: ## data: 150行x 4列## sample_meta: 150行x 1列## variable_meta: 4行x 1列
注意,因为我们定义了model_train
而且model_predict
为主成分分析
对象,我们不需要显式定义amodel_apply
方法的默认应用model_train
而且model_precict
按顺序。对于一些定义a的方法model_apply
定义更合适(例如t检验)和model_train
而且model_predict
未定义的。
model_seq
对象类定义的一种特殊类型的列表结构体
包中。它们可以通过象征性地将模型“添加”在一起来形成一个序列来创建。我们在这里用mean_centre ()
而且主成分分析()
我们创建的对象。
#创建模型序列MS = mean_centre() + PCA(number_components = 2) #打印摘要MS
一个model_seq对象,包含:## ##[1]##一个“mean_centre”对象## ---------------------- # name: # description: ## outputs:集中,平均## expected:集中## seq_in: data ## ##[2] ##一个“PCA”对象## -------------- # name: # description: # input params: number_components ## outputs: scores, loading ## expected: scores ## seq_in: data
的model_train
而且model_predict
模型序列的方法将沿着模型列表自动传递数据。model_apply
工作方式与模型相同,并将使用model_train
而且model_predict
顺序为模型序列。
除非指定,否则在对象的“预测”槽中命名的默认输出将被用作序列中下一个对象的数据输入。
对于PCA示例,数据被输入到mean_centre
对象,应用均值居中,然后集中
的输入主成分分析
对象计算分数和加载。
#应用模型序列到iris_data MS = model_apply(MS,iris_DatasetExperiment())
一个“DatasetExperiment”对象## ---------------------------- ## name: ## description: ## data: 150行x 2列## sample_meta: 150行x 1列## variable_meta: 2行x 1列
为了改变通过模型序列的数据流,可以为每个模型设置三个槽:
预测
seq_in
DatasetExperiment
对象,并将其用作的输入model_train
而且model_predict
.seq_fcn
seq_fcn
槽。有例子,这种先进的模型序列流控制在小插图structToolbox
包中。
迭代器
对象迭代器对象类似于模型
对象模板,因为可以对它们进行扩展,使其具有指定的输入参数和输出。它们有一些独特的插槽:
模型
模型
或model_seq
(模型序列)对象。迭代器将调用model_train
而且model_predict
多次使用这个模型。结果
预测
槽的模型
对象,并指定对象的默认输出。这比预测
这个时候迭代器
不能组合成一个序列(但这可能在将来实现)。迭代器
对象用于重新采样方法,其中输入模型通过将数据划分到训练集和测试集而多次运行。交叉验证和排列测试只是可能使用迭代器对象的两个例子。
方法获取/设置迭代器要运行的模型模型
方法。
#创建迭代器I = iterator() #添加PCA模型序列模型(I) = MS #检索模型序列模型(I)
一个model_seq对象,包含:## ##[1]##一个“mean_centre”对象## ---------------------- # name: # description: ## outputs:集中,平均## expected:集中## seq_in: data ## ##[2] ##一个“PCA”对象## -------------- # name: # description: # input params: number_components ## outputs: scores, loading ## expected: scores ## seq_in: data
模型也可以通过象征性地乘以a来“嵌套”在迭代器中模型
或model_seq
.言下之意是迭代器
将使用模型
很多次了。这可以与模型的符号添加相结合,以创建序列。
I = iterator() * (mean_centre() + PCA())模型(I)
一个model_seq对象,包含:## ##[1]##一个“mean_centre”对象## ---------------------- # name: # description: ## outputs:集中,平均## expected:集中## seq_in: data ## ##[2] ##一个“PCA”对象## -------------- # name: # description: # input params: number_components ## outputs: scores, loading ## expected: scores ## seq_in: data
也可以在迭代器中嵌套迭代器,例如使用类似的方法创建一个' perented cross_validation '。
I = iterator() * iterator() * (mean_centre() + PCA())
一个运行
方法,该方法可以以类似于method_train
等来实现所需的功能。由开发人员来确保迭代器
可以处理模型
,model_seq
而且迭代器
对象作为输入等迭代器
运行方法可能相当复杂。为了简单起见,我们在这里不演示,但在structToolbox
包装和相应的小插图。
度规
对象度量对象通过将真实的已知值与模型(通常是分类器或回归模型)的预测输出进行比较来计算标量值。它们是运行迭代器的必需输入,根据迭代器
.指标有一个惟一的槽。
的计算
方法提供的度规
对象模板,可以使用与for相同的方法对其进行扩展model_train
等。它需要三个输入:
米
Y
Yhat
的计算
方法可以手动调用,但通常由迭代器
例如,在交叉验证过程中。
图表
对象图表对象模板用于从输入生成ggplot对象DatasetExperiment
,模型
或迭代器
.模板没有唯一的槽位,但包含一个chart_plot
方法从输入对象生成ggplot对象。
作为一个简单的例子,我们创建了一个图表,用于从前面创建的PCA对象绘制分数。更全面的pca_scores_plot
对象中包含的structToolbox
还有其他一些用来绘制不同方法的输出。
我们使用助手函数set_struct_object ()
来定义新的图表对象。
#新建图表对象set_struct_obj(class_name = 'pca_scores_plot', struct_obj = 'chart', params = c(factor_name = 'character'), prototype = list(name = 'PCA得分图',description = '前两个主成分散点图',libraries = 'ggplot2'))
的chart_plot
方法替换新对象的set_obj_method ()
helper函数。
#新建chart_plot方法set_obj_method(class_name = 'pca_scores_plot', method_name = 'chart_plot', signature = c('pca_scores_plot','PCA'), definition = function(obj,dobj) {if (!is(dobj,'PCA')) {stop('此图表仅用于PCA对象')}#获取PCA分数数据S = dobj$scores$data #添加组标签S$factor_name = dobj$scores$sample_meta[[obj$factor_name]] # ggplot g = ggplot(data = S,aes_string(x='PC1',y='PC2', color ='factor_name')) + geom_point() + labs(color = obj$factor_name) #图表对象返回ggplot对象返回(g)})
注意,我们设置signature = c('pca_scores_plot', 'PCA')
表示只有主成分分析
应该接受对象作为此图表的第二个输入。
现在可以使用新的图表对象了主成分分析
对象。
#创建图表对象C = pca_scores_plot(factor_name = 'Species') #使用经过训练的PCA对象从模型序列绘制图表chart_plot(C,MS[2]) + theme_bw() #添加主题
实体
而且枚举
对象这些结构体
类用于使输入参数和输出信息更丰富和更灵活。不打算以相同的方式成为可扩展的模板模型
对象。
通过将槽位的类型或类指定为实体
或枚举
对象可以提供有关槽位的附加信息,例如更有信息的的名字
和一个描述
.实体
而且枚举
槽位有一些独特的槽位:
价值
max_length
允许
枚举
只有对象。输入参数/输出允许的值的列表。两个对象都使用类型
插槽,以确保为插槽分配的值只能是特定的类,例如设置Type = c('numeric', 'integer')
不允许将参数值设置为字符。
的的名字
而且描述
插槽可以很有用,例如在报告写作中提供参数的标准定义。
enitity
而且枚举
对象具有获取/设置所有槽的方法。它们被设计成与美元语法无缝地工作,就像您访问任何非实体槽的值一样。
作为一个例子number_components
参数的主成分分析
对象可以定义为实体
对象。
# define entity npc = entity(name = '主组件数量',description = '要计算的主组件数量',type = c('numeric','integer'), value = 2, max_length = 1
##一个“实体”对象## ----------------- ##名称:主成分数量##描述:计算的主成分数量##值:2 #类型:数字,整数#最大长度:1
然后,它可以与set_struct_obj ()
函数在创建PCA对象时使用“entity”作为的输入类型参数个数
中包含实体对象原型
的对象。它将完全像以前一样工作,但有额外的信息(的名字
,描述
,等等)。
# PCA对象PCA = set_struct_obj(class_name = 'PCA', struct_obj = 'model', params = c(number_components = 'entity'), outputs = c(scores = 'DatasetExperiment', loading = 'data.frame'), private = character(0), prototype = list(number_components = npc, ontology = 'OBI:0200051', predicted = 'scores')
# # 3 [1]
#获取描述param_obj(P,'number_components'
##[1]“要计算的主成分数量”
所有结构体
对象有一个本体
插槽,可以分配本体术语标识符。结构体
利用的方式
bioconductor包访问本体查找服务API,并根据提供的标识符获得名称和定义。
P = PCA() #返回PCA的本体列表,包括输入参数和输出本体(P)
## Slot“terms”:## [[1]]## term id: OBI:0200051 ## ontology: obi# label:主成分分析降维## description:主成分分析降维是通过应用主成分分析,保留低阶主成分,排除高阶主成分实现的降维##。# # iri: http://purl.obolibrary.org/obo/OBI_0200051
#返回仅用于PCA的本体(不是输入/输出)P$本体
# #[1]“OBI: 0200051”
#获取特定输入的本体IN = param_obj(P,'number_components'
# #字符(0)
注意:在v1.5.1之前的版本中国家档案馆
类使用。现在这已被反对,赞成本体
并将在未来的版本中删除。
sessionInfo ()
## R版本4.2.0 RC (22-04-19 r82224) ##平台:x86_64-pc-linux-gnu(64位)##运行在:Ubuntu 20.04.4 LTS ## ##矩阵产品:default ## BLAS: /home/biocbuild/bbs-3.15-bio /R/lib/libRblas. ##因此## LAPACK: /home/biocbuild/bbs-3.15-bio /R/lib/libRlapack。因此## ## locale: ## [1] LC_CTYPE=en_US。UTF-8 LC_NUMERIC= c# [3] LC_TIME=en_GB LC_COLLATE= c# [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]stats graphics grDevices utils datasets methods base ## ##其他附加的包:## [1]ggplot2_3.3.5 struct_1.8.0 biocstyle_id .24.0 ## ##通过命名空间加载(并没有附加):# [1] Rcpp_1.0.8.3 lattice_0.20-45 ## [3] prettyunits_1.1.1 assertthat_0.2.1 ## [5] digest_0.6.29 utf8_1.2.2 ## [5] R6_2.5.1 GenomeInfoDb_1.32.0 ## [9] stats4_4.2.0 evaluate_0.15 ## [11] httr_1.4.2 highr_0.9 ## [13] pillar_1.7.0 progresr_1.2.2 ## [15] zlibbioc_1.42.0 rlang_1.0.2 ## [15] zlibbioc_1.42.0 rlang_1.0.2 ## [17] curl_1 .3.2 jquerylib_0.1.4 ## [15] Matrix_1.4-1 rmarkdown_2.14 ## [23] labeling_0.4.2 stringgr_1 .4.0 ## [25] RCurl_1.98-1.6 munsell_0.5.0 ## [27] DelayedArray_0.22.0compiler_4.2.0 # # [29] xfun_0.30 pkgconfig_2.0.3 # # [31] BiocGenerics_0.42.0 htmltools_0.5.2 # # [33] tidyselect_1.1.2 SummarizedExperiment_1.26.0 # # [35] tibble_3.1.6 GenomeInfoDbData_1.2.8 # # [37] bookdown_0.26 IRanges_2.30.0 # # [39] matrixStats_0.62.0 fansi_1.0.3 # # [41] crayon_1.5.1 dplyr_1.0.8 # # [43] withr_2.5.0 bitops_1.0-7 # # [45] grid_4.2.0 ontologyIndex_2.7 # # [47] jsonlite_1.8.0 gtable_0.3.0 # # [49] lifecycle_1.0.1 DBI_1.1.2 # # [51] magrittr_2.0.3 scales_1.2.0 # # [53] cli_3.3.0stringi_1.7.6 ## [55] farver_2.1.0 xvector_1 .48.0 ## # [57] bslib_0.3.1 ellipsis_0.3.2 ## [61] rols_2.24.0 tools_4.2.0 ## [63] Biobase_2.56.0 glue_1.6.2 ## [65] purrr_0.3.4 hms_1.1.1 ## [67] MatrixGenerics_1.8.0 fastmap_1.1.0 ## [69] yaml_2.3.5 colorspace_2.0-3 ## [71] BiocManager_1.30.17基因组ranges_1 .48.0 ## [73] knitr_1.38 sass_0.4.1