sigFeature:使用SVM-RFE和t-统计量进行显著特征选择

Pijush Das, Susanta Roychudhury博士,Sucheta Tripathy博士

2018年4月26日

1介绍

sigFeature是一个R包,它能够使用支持向量机递归特征消除方法(SVM-RFE) (Guyon, I., et al. 2002)和t-统计量找出显著特征。特征选择是机器学习技术的重要组成部分。SVM-RFE被认为是最有效的滤波方法之一,它基于一种贪婪算法,只找到最佳的可能组合进行分类,而不考虑类之间的差异显著性特征。为了克服SVM-RFE的这一局限性,本文提出的方法进行了调整,以发现差异显著的特征,同时具有显著的分类精度。该包能够枚举任何二维(用于二进制分类)数据的特征选择,如微阵列等。这个小插图解释了在一个公开可用的微阵列数据集中使用该包。

2数据

本软件包中的示例数据集来自口腔鳞状细胞癌(OSCC)患者(ACCNO: GSE2280 O’donnell RK et al.(2005))。Affymetrix Human Genome U133A Array用于本数据集的全基因组转录分析。O’donnell RK等人(2005)从原发性口腔鳞癌(OSCC)中获得了基因表达谱。有淋巴结转移的样本(N+)与未转移的样本(N-)进行比较。共对18个oscc进行了基因表达特征分析。在他们的分析中,使用支持向量机构建了一个预测规则,并在原始数据集上使用交叉验证来评估规则的准确性。这是针对四个独立的患者样本进行的测试。生成了一个能够正确预测四个独立患者的特征基因集。该方法可通过基因表达谱预测淋巴结转移。有关研究的详情可浏览:https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE2280

对于“sigFeature”包评估,微阵列数据集(GSE2280)根据数据集中提供的TNM分期分为淋巴结转移(N+)和无淋巴结转移(N-)两类。首先从Gene Expression Omnibus (GEO)数据库下载数据集后,利用Bioconductor软件包“limma”采用“分位数”归一化方法进行归一化。共有27个样本(19个N+和8个N-)。为了减少运行时间,计算每个特征(基因)的N+和N-样本之间的t统计量。小于0.07的p值被用作测试的子集。现在子数据集的表达式值在这里被认为是“x”。无淋巴结转移的患者表示为-1,有淋巴结转移的患者表示为1。这些-1和1值与“y”合并作为示例标签。

3例

在本节中,我们将展示在示例数据集上使用“sigFeature”包进行重要特征选择所需的R脚本。首先,我们将“sigFeature”包和示例数据集(如数据部分所述)加载到机器的内存中。在此之后,将进行一步一步的执行。反向特征消除过程是一个耗时的过程。如果我们处理的是完整的数据集,我们可能需要等待很长时间来处理数据集。或者,我们可以利用R包“parallel”来利用并行处理来减少处理时间。为了减少此包的构建时间,我们使用此小插图处理数据。

图书馆(sigFeature)图书馆(SummarizedExperiment)
##加载所需包:MatrixGenerics
##加载所需的包:matrixStats
## ##附加包:'MatrixGenerics'
下面的对象从package:matrixStats中屏蔽:## ## colAlls, colAnyNAs, colanyans, colAvgsPerRowSet, colCollapse, ## colCounts, colCummaxs, colCummins, colCumprods, colMadDiffs, colIQRs, colLogSumExps, colMadDiffs, ## colMads, colMaxs, colMeans2, colMedians, colMins, colOrderStats, ## colProds, colQuantiles, colRanges, colRanks, colSdDiffs, colSds, ## colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads, ## colWeightedMeans, colWeightedMedians, colweighteddsds, ## colweighttedvars, rowAlls, rowAnyNAs, rowAnys, colIQRs, colLogSumExps, colMadDiffs,rowAvgsPerColSet, ## rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods, ## rowcumsum, rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps, ## rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians, rowMins, ## rowOrderStats, rowProds, rowQuantiles, rowwranges, rowwranks, ## rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars, ## rowWeightedMads, rowWeightedMeans, rowWeightedMedians, ## rowweighteddsds, rowWeightedVars
##加载所需软件包:GenomicRanges
##加载所需的包:stats4
##加载所需的包:BiocGenerics
## ##附加包:“BiocGenerics”
以下对象从'package:stats'中屏蔽:## ## IQR, mad, sd, var, xtabs
##以下对象从'package:base'中屏蔽:## ## Filter, Find, Map, Position, Reduce, anyduplication, aperm, append, ## as.data.frame, basename, cbind, colnames, dirname, do。调用,## duplicate eval evalq get grep grepl, intersect, is。Unsorted, ## lapply, mapply, match, mget, order, paste, pmax, pmax.int, pmin, ## pmin.int, rank, rbind, rownames, sapply, setdiff, sort, table, ## tapply, union, unique, unsplit,其中。马克斯,which.min
##加载所需的包:S4Vectors
## ##附加包:“S4Vectors”
以下对象从'package:base'中屏蔽:## ## I,展开。网格,unname
##加载所需的包:IRanges
##加载所需包:GenomeInfoDb
##加载所需的包:Biobase
##欢迎访问Bioconductor ## ##小插图包含介绍性材料;查看## 'browseVignettes()'。要引用Bioconductor,请参见##“citation(“Biobase”)”,以及软件包的“citation(“pkgname”)”。
## ##附件:“Biobase”
下面的对象从“package:MatrixGenerics”中屏蔽:## ## rowMedians
以下对象从'package:matrixStats'中屏蔽:## ## anyMissing, rowMedians
数据(ExampleRawData包=“sigFeature”ExampleRawData
##类:summarizeexperiment ## dim: 2204 27 ##元数据(0):## assays(1):计数## rownames(2204): 1494_f_at 179_at…AFFX-M27830_M_at ## AFFX-r2-Hs28SrRNA-5_at ## rowData names(0): ## colnames(27): GSM42246 GSM42248…GSM42270 GSM42271 ## colData names(1): sampleLabels

在本例中,变量“x”包含微阵列表达式数据,“y”包含示例标签。变量“x”是一个二维矩阵,其中行包含样本名称,列包含基因/特征名称。变量“y”包含样例标签为-1和1。

x < -t化验(ExampleRawData)计数)y < -colData(ExampleRawData)sampleLabels

在进入小插图的细节之前,让我们绘制每个特征的未调整p值,这些特征是通过使用两个类的表达式值来估计的。这里使用名为“sigFeaturePvalue()”的函数使用t-statistic来计算p值。在这种情况下,我们假设不平等的方差,并使用韦尔奇近似来估计适当的自由度。

pvals < -sigFeaturePvalue(x, y)unlist(pvals),打破了=seq00.080.0015),坳=“天蓝色”xlab =“p值”ylab =“频率”主要=""

“sigFeature()”(显著特征选择)的思想:使用支持向量机的递归特征消除可以对更好的分类器排序,但这些分类器在类之间的显著性可能不同,也可能不同。具有显著分类准确性和类间差异显著性的特征在生物学方面具有主要作用。这里介绍的算法在分类器排序方面非常有效,在确定它们之间不同的重要类方面也非常有效。

在数据挖掘和优化中,特征选择是一个非常活跃的研究领域,SVM-RFE被认为是最有效的方法之一。SVM-RFE是一种贪心方法,只希望找到最优的可能组合进行分类。在这个提出的算法中,我们在SVM-RFE中加入了t-统计量。该算法的主要目标是枚举所有特征的排序权重,并根据权重向量对特征进行排序,作为分类的基础。每个单独特征的两个比较组之间的系数和表达均值差用于计算该特定基因或特征的权重值。迭代过程之后是向后删除特征。迭代过程将继续进行,直到数据集中只剩下一个特征。最小的排序权重将被算法删除并存储在堆栈中,而特征变量对产生权重有重要影响。最后,将存储在堆栈中的特征变量按照描述程度的不同降序排列。

#系统。time(sigfeatureRankedList <- sigFeature(x, y))

变量“sigfeatureRankedList”将在执行后返回基因/特征的地址。为了使输出可视化,可以使用print命令打印排名前10位的基因/特征的地址。

数据(sigfeatureRankedList)打印(sigfeatureRankedList [110])
## [1] 2064 370 2032 2035 1519 1573 1446 2105 997 611

使用前1000个基因/特征生成训练数据集的模型向量,R脚本如下所示。在本例中,使用包“e1071”。在生成模型向量时,为了获得更好的性能,选择了线性核。

图书馆(e1071)sigFeature.model =支持向量机(x [sigfeatureRankedList [11000]], y,类型=“C-classification”内核=“线性”总结(sigFeature.model)
## ##调用:## svm.default(x = x[, sigfeatureRankedList[1:1000]], y = y, type = "C-classification", ## kernel = "linear") ## ## ##参数:## SVM-Type: "C-classification", ## kernel: "linear") ## ## ##参数:## SVM-Type: "C-classification", ## kernel: "linear" ## cost: 1 ## ##支持向量数量:16 ## ##(10 6)## ## ##类数量:2 ## ##级别:## -1 1 .

下面的R脚本显示了之前训练的同一数据集的预测结果。用户还可以将数据集分为训练数据集和测试数据集两部分,并可以实现算法。

pred < -预测(sigFeature。model, x[,sigfeatureRankedList[11000]])表格(pred, y)
## y ## pred -1 1 ## -1 8 0 ## 1 0 19

为了通过对特征进行排序来解决分类问题,Guyon等人在2002年提出了另一种算法SVM-RFE。该算法使用支持向量机线性核模型对数据集进行训练,为每个特征生成一个权重向量。然后,递归地删除秩最小的特征,并将其存储在堆栈数据结构中。迭代过程继续进行,直到最后一个特性保留下来。这个判据就是SVM给出的决策超平面的w值。权重向量通过对变量w求平方来计算。最后从一个列表中按降序选择特征。这个包中包含了“svmrfefefeaterank()”函数,用于与“sigFeature()”进行性能比较。

#系统。time(featureRankedList <- svmrfeFeatureRanking(x, y))数据(featureRankedList)打印"十大特色如下:"
##[1]“十大特色如下:”
打印(featureRankedList [110])
## [1] 1073 1404 1152 5 1253 1557 105 1207 792 57

使用前1000个基因/特征生成训练数据集的模型向量,R脚本如下所示。选择线性核来生成模型向量。

RFE.model =支持向量机(x [featureRankedList [11000]], y,类型=“C-classification”内核=“线性”总结(RFE.model)
## ##调用:## svm.default(x = x[, featureRankedList[1:1000]], y = y, type = "C-classification", ## kernel = "linear") ## ## ##参数:## SVM-Type: "C-classification", ## kernel: "linear") ## ## ##参数:## SVM-Type: "C-classification", ## kernel: "linear" ## cost: 1 ## ##支持向量数量:17 ## ##(10 7)## ## ##类数量:2 ## ##级别:## -1 1

下面的R脚本将显示之前训练的同一数据集的预测结果。用户还可以将数据集分为训练数据集和测试数据集两部分,并可以实现算法。

pred < -预测(RFE。model, x[, featerankedlist [11000]])表格(pred, y)
## y ## pred -1 1 ## -1 8 0 ## 1 0 19

在这个示例部分中,我们将观察所选的前100个特征的p值。名为“sigFeaturePvalue()”的函数将使用t-statistic计算p值。表达式值将取自前100个特征的数据集。

pvalsigFe < -sigFeaturePvalue(x, y,One hundred.sigfeatureRankedList)pvalRFE < -sigFeaturePvalue(x, y,One hundred.featureRankedList)票面价值mfrow =c12))unlist(pvalsigFe),打破了=50坳=“天蓝色”主要=粘贴“sigFeature”),xlab =“p值”unlist(pvalRFE),打破了=50坳=“天蓝色”主要=粘贴“SVM-RFE”),xlab =“p值”

在本节中,使用前100个特征(使用“sigFeature”和“SVM-RFE”算法)产生的p值的比较使用散点箱图显示。

mytitle < -的箱线图箱线图unlist(pvalsigFe),unlist(pvalRFE),主要=mytitle,名称=c“sigFeature”“SVM-RFE”),ylab =“p值”ylim =c最小值unlist(pvalsigFe)),马克斯unlist(pvalRFE))))条形图表unlist(pvalsigFe),垂直=真正的方法=“抖动”添加=真正的pch =16坳=c“绿色”))条形图表unlist(pvalRFE),垂直=真正的在=2方法=“抖动”添加=真正的pch =16坳=c“蓝”))网格nx =纽约=坳=“黑色”lty =“点”

在本节中,使用“sigFeature()”函数生成的前20个特征的表达式值如下所示。

图书馆“pheatmap”图书馆“RColorBrewer”pheatmap(x [sigfeatureRankedList [120.]],规模=“行”clustering_distance_rows =“相关”

在本节中,使用“svmrfefefeatureranking()”函数生成的前20个特征的表达式值为热图。

pheatmap(x [featureRankedList [120.]],规模=“行”clustering_distance_rows =“相关”

对于特征选择算法的估计,Ambroise和McLachlan(2002)建议外部交叉验证,其中特征选择和验证在样本集的不同部分执行,以获得无偏的性能估计。分层交叉验证(Breiman et al.,1984)与常规交叉验证略有不同。在k褶分层交叉验证中,将一个数据集随机划分为k个大小相等的褶皱,使每个褶皱中的类分布与整个数据集中的类分布大致相同。相比之下,常规交叉验证将数据集随机划分为k褶,而不考虑类分布。Kohavi(1995)报道,分层交叉验证比常规交叉验证具有更小的偏差和方差。因此,“sigFeature()”函数通过结合外部交叉验证方法进一步增强。在这个外部k-fold交叉验证过程中,k-1个折叠用于选择特征,其中一个折叠保持不变,稍后将用作测试样本集。

帮助文件中给出了输入参数的详细描述。一组。这里使用Seed函数的目的只是为了在从源文件重新生成此小插图时获得准确的结果。函数如下所示。

# set.seed (1234)#results = sigFeature。Enfold (x, y, "kfold", 10)数据“结果”str(结果1])
## 1 ## $的列表:5 ##的列表…美元的特性。id: int[1:220 . 4] 2064 2031 2035 1573 370 2023 1605 2032 997 1069…# # . .$train.data.ids : chr [1:24] "GSM42246" "GSM42248" "GSM42250" "GSM42252" ... ## ..$ test.data.ids : chr [1:3] "GSM42263" "GSM42251" "GSM42260" ## ..$ train.data.level: Named num [1:24] 1 1 1 1 1 -1 -1 -1 -1 -1 ... ## .. ..- attr(*, "names")= chr [1:24] "GSM42246" "GSM42248" "GSM42250" "GSM42252" ... ## ..$ test.data.level : Named num [1:3] -1 1 1 ## .. ..- attr(*, "names")= chr [1:3] "GSM42263" "GSM42251" "GSM42260"

在这个示例部分中,引入了一个名为“sigFeatureFrequency()”的新函数。这个函数的主要目的是根据特征的频率来排列特征。在上一节中,数据集被划分为k-fold。其中随机取k-1个褶,用于选择特征。这个过程重复k次,从k个列表中计算前400个基因的频率值。这里使用“sigFeatureFrequency()”函数根据频率对第k个特征列表进一步排序。这个函数的详细描述在帮助文件中给出。

FeatureBasedonFrequency < -sigFeatureFrequency(x,结果,400400pf =str(FeatureBasedonFrequency [1])
## 1 ## $的列表:5 ##的列表…美元的特性。id: num[1:400] 187 225 246 303 313 370 394 469 479 492…# # . .$train.data.ids : chr [1:24] "GSM42246" "GSM42248" "GSM42250" "GSM42252" ... ## ..$ test.data.ids : chr [1:3] "GSM42263" "GSM42251" "GSM42260" ## ..$ train.data.level: Named num [1:24] 1 1 1 1 1 -1 -1 -1 -1 -1 ... ## .. ..- attr(*, "names")= chr [1:24] "GSM42246" "GSM42248" "GSM42250" "GSM42252" ... ## ..$ test.data.level : Named num [1:3] -1 1 1 ## .. ..- attr(*, "names")= chr [1:3] "GSM42263" "GSM42251" "GSM42260"

在本节中计算外部交叉验证,最后计算交叉验证误差的平均值和误差的标准差。基于频率产生的特征被用于产生平均交叉验证误差。训练样本和测试样本是一样的,它们最初是从主样本中分离出来的。在每次迭代中,k-1个折叠被认为是训练样本,剩下的一个折叠被认为是测试样本。在外部交叉验证过程中,特征数量一个接一个地增加,并使用该特征训练样本进行训练。对每一次折叠变化的漏分类数进行平均,最后表示为错误率。

#inputdata <- data.frame(y=as.factor(y),x=x)#运行下面给出的代码将花费大量的时间。这就是过程#数据如下。#featsweepSigFe = lapply(1:400, sigCVError, FeatureBasedonFrequency, inputdata)数据“featsweepSigFe”str(featsweepSigFe [1])
##列表1 ## $:列表3 ## ..支持向量机。list: 10 ## .. ..$:'data.frame': 1 obs。4个变量:## .. .. ..$gamma : num 0.000244 ## .. .. ..$ cost : num 0.001 ## .. .. ..$ error : num 0.333 ## .. .. ..$ dispersion: num NA ## .. ..$ :'data.frame': 1 obs. of 4 variables: ## .. .. ..$ gamma : num 0.000244 ## .. .. ..$ cost : num 0.001 ## .. .. ..$ error : num 0.333 ## .. .. ..$ dispersion: num NA ## .. ..$ :'data.frame': 1 obs. of 4 variables: ## .. .. ..$ gamma : num 0.000244 ## .. .. ..$ cost : num 0.001 ## .. .. ..$ error : num 0.667 ## .. .. ..$ dispersion: num NA ## .. ..$ :'data.frame': 1 obs. of 4 variables: ## .. .. ..$ gamma : num 0.000244 ## .. .. ..$ cost : num 0.001 ## .. .. ..$ error : num 0.333 ## .. .. ..$ dispersion: num NA ## .. ..$ :'data.frame': 1 obs. of 4 variables: ## .. .. ..$ gamma : num 0.000244 ## .. .. ..$ cost : num 0.001 ## .. .. ..$ error : num 0.333 ## .. .. ..$ dispersion: num NA ## .. ..$ :'data.frame': 1 obs. of 4 variables: ## .. .. ..$ gamma : num 1 ## .. .. ..$ cost : num 1.78 ## .. .. ..$ error : num 0.667 ## .. .. ..$ dispersion: num NA ## .. ..$ :'data.frame': 1 obs. of 4 variables: ## .. .. ..$ gamma : num 0.000244 ## .. .. ..$ cost : num 0.001 ## .. .. ..$ error : num 0 ## .. .. ..$ dispersion: num NA ## .. ..$ :'data.frame': 1 obs. of 4 variables: ## .. .. ..$ gamma : num 0.000244 ## .. .. ..$ cost : num 0.001 ## .. .. ..$ error : num 0 ## .. .. ..$ dispersion: num NA ## .. ..$ :'data.frame': 1 obs. of 4 variables: ## .. .. ..$ gamma : num 0.000244 ## .. .. ..$ cost : num 0.001 ## .. .. ..$ error : num 0.5 ## .. .. ..$ dispersion: num NA ## .. ..$ :'data.frame': 1 obs. of 4 variables: ## .. .. ..$ gamma : num 0.000244 ## .. .. ..$ cost : num 0.001 ## .. .. ..$ error : num 0.5 ## .. .. ..$ dispersion: num NA ## ..$ error : num 0.367 ## ..$ errorSD : num 0.233

在本节中,“PlotErrors()”函数绘制了两个图。第一个图表示外部交叉验证的平均误差,第二个图表示未分类的标准差。

PlotErrors(featsweepSigFe00.4

写入结果可以通过“WritesigFeature()”函数实现。有关如何将结果保存到特定文件的详细信息,请参阅“WritesigFeature()”的帮助文件。

# WritesigFeature(结果,x)

4 SessionInfo

作为本文档的最后一部分,我们将函数称为“sessionInfo()”,它报告R的版本号和在此会话中使用的所有包。始终保持这样的记录是一个很好的习惯,因为它将有助于追踪发生了什么情况下,R脚本停止工作,因为函数已经改变了一个包的新版本。

sessionInfo()
## R版本4.2.1(2022-06-23)##平台:x86_64-pc-linux-gnu(64位)##运行在Ubuntu 20.04.5 LTS ## ##矩阵产品:默认## BLAS: /home/biocbuild/bbs-3.16-bioc/R/lib/libRblas。/home/biocbuild/bbs-3.16-bioc/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_phone = c# # [11] LC_MEASUREMENT=en_US。UTF-8 LC_IDENTIFICATION=C ## ##附加的基本包:## [1]stats4 stats graphics grDevices utils datasets methods ##[8]基础## ##其他附加包:[1] RColorBrewer_1.1-3 pheatmap_1.0.12 ## [5] Biobase_2.58.0 genome icranges_1 .50.0 ## [7] GenomeInfoDb_1.34.0 IRanges_2.32.0 ## [9] S4Vectors_0.36.0 BiocGenerics_0.44.0 ## [11] MatrixGenerics_1.10.0 matrixStats_0.62.0 ## [13] sigFeature_1.16.0 ## ##通过命名空间加载(并且没有附加):## [1] xfun_0.34 bslib_0.4.0 lattice_0.20- 20 ## [4] colorspace_2.0-3 htmltools_0.5.3 yaml_2.3.6 ## [7] RBGL_1.74.0 XML_3.99-0.12 rlang_1.0.6 ## [10] jquerylib_0.1.4 BiocParallel_1.32.0 GenomeInfoDbData_1.2.9 ## [13] lifecycle_1.0.3 zlibbioc_1.44.0 string_1 .4.1 ## [19] codetools_0.2-18 biocViews_1.66.0 evaluate_0.17 ## [22] knitr_1.40 fastmap_1.1.0 SparseM_1.81 ## [25] parallel_2.1 RUnit_0.4.32 class_7.3-20 ## [28] highr_0.9 Rcpp_1.0.9 scales_1.2.1[46] RCurl_1.98-1.9 proxy_0.4-27 Matrix_1.5-1 ## [49] rmarkdown_2.17 R6_2.5.1 nlme_1 . 3.1-160 ## [34] XVector_0.38.0 graph_1.76.0 jsonlite_1.8.3 ## [37] digest_0.6.30 stringi_1.7.8 openxlsx_4.2.5.1 ## [40] grid_4.2.1 cli_3.4.1 tools_4.2.1 ## [43] bitops_1.0-7 magrittr_2.0.3 sass_0.4.2 ## [52] compiler_4.2.1

5引用

  1. 梅耶,D.等,e1071:统计部门的多种职能(e1071),维恩,2012。
  2. 欧唐奈,郭福曼,魏世杰,辛豪尔等。基因表达特征预测口腔鳞癌的淋巴转移。癌基因2005 Feb 10;24(7):1244-51。
  3. Guyon, I.等(2002)使用支持向量机进行癌症分类的基因选择,机器学习,46,389 -422。
  4. 安布洛瓦兹,C. &麦克伦,G. J.(2002)。基于微阵列基因表达数据的基因提取中的选择偏差。美国科学院学报,99(10),6562-6566。
  5. Breiman, L., Friedman, J., Olshen, R.和Stone, C.(1984)分类和回归树。沃兹沃斯和布鲁克斯,蒙特利,加州。
  6. Kohavi, R.(1995, 8月)。精度估计与模型选择之交叉验证与自举研究。《易财》(第14卷第2期,第1137-1145页)。