内容

1概述

1.1动机

从高维组学数据中识别可重复的生物模式是理解复杂疾病或性状的生物学的关键因素。将现有的生物学知识整合到机器学习中是推进此类研究的重要一步。

1.2可交付成果

我们已经实现了一个生物信息的多阶段机器学习框架,称为BioMM[1]专门用于表型预测,使用组学尺度的数据,基于先前的生物学信息,包括基因本体论(GO)和KEGG通路。

简要介绍BioMM的特点

  1. 适用于各种组学数据模式(如甲基组学、转录组学、基因组学)。
  2. 各种生物分层策略。
  3. 优先考虑与结果相关的功能模式。
  4. 基于生物分层模式的个体水平的端到端预测。
  5. 扩展到感兴趣的机器学习模型的可能性。
  6. 并行计算。

2开始

2.1安装和依赖

  • 从Bioconductor安装BioMM (R 4.0):
如果您已经安装了BioMM,则不执行。如果(!requireNamespace("BiocManager", quiet = TRUE)) install.packages("BiocManager") #初始化使用Bioc devel BiocManager::install(version='devel') BiocManager::install("BioMM")

来自Github的BioMM安装

install_github("transbioZI/BioMM", build_vignettes=TRUE)
  • 加载所需的库
图书馆(BioMM)图书馆(BiocParallel)图书馆(ranger)图书馆(rms)图书馆(glmnet)图书馆(e1071)图书馆(precrec)图书馆(vioplot)图书馆(CMplot)图书馆(imager)图书馆(topGO)图书馆(xlsx)

3.组学数据

广泛的组学数据为BioMM提供了支持,包括全基因组DNA甲基化、全转录组基因表达和全基因组SNP数据。其他类型的组学数据可以映射到路径也令人鼓舞。
为了更好地理解BioMM框架,我们使用了两个小型示例数据集:一个由20个受试者和26486个cpg组成的全基因组DNA甲基化数据,一个由20个受试者和15924个基因组成的全基因组基因表达数据用于演示。

## DNA甲基化数据methylData <- readRDS(system。文件(“extdata”、“/ methylData。rds", package="BioMM")) #第一列是标签,其余是特征(例如,CpGs)头(methylData[,1:4])
##标签cg00000292 cg00002426 cg00003994 ## GSM951168 0 0.538 0.054 0.029 ## GSM951173 0 0.508 0.052 0.038 ## GSM951174 0 0.547 0.044 0.047 ## GSM951177 0 0.409 0.048 0.034 ## GSM951178 0 0.374 0.044 0.051 ## GSM951179 0 0.598 0.088 0.064
# 0: control和1:patient表(methylData[,1])
## ## 0 1 ## 10
暗(methylData)
## [1] 20 26487
##基因表达数据expData <- readRDS(system。文件(“extdata”、“/ expData。rds", package="BioMM")) #第一列是标签,其余是特征(例如,基因)头(expData[,1:4])
##标签1 10 100 ## GSM943251 0 5.242 8.807 4.514 ## GSM943252 0 5.286 8.394 5.238 ## GSM943253 0 5.009 8.251 5.162 ## GSM943254 0 5.209 8.131 4.559 ## GSM943255 0 5.125 8.448 4.936 ## GSM943256 0 4.913 8.902 4.603
# 0: control and 1: patient表(expData[,1])
## ## 0 1 ## 10
暗(expData)
## [1] 20 15925

4功能分层

CpGs、基因或snp等特征可以基于基因组定位和通路注释映射到通路中,如在函数中实现的那样omics2pathlist ().路径数据库的例子是基因本体(GO)、KEGG和Reactome,它们是广泛使用的公共存储库。本教程使用基因本体论和KEGG途径。

##加载特征注释数据featureAnno <- readRDS(system. txt)文件(“extdata”、“cpgAnno。rds", package="BioMM")) # CpGs与基因(即entrezID或基因符号)的映射head(featureAnno)
## ID chr entrezID符号## 1 cg00000292 16 487 ATP2A1 ## 2 cg00002426 3 7871 SLMAP ## 3 cg00003994 7 4223 MEOX2 ## 4 cg00005847 2 3232 HOXD3 ## 5 cg00006414 7 57541 ZNF398 ## 6 cg00007981 11 24145 PANX1
#正在调查的cpg总数str(unique(featureAnno[,1]))
## CHR [1:26486] "cg00000292" "cg00002426" "cg00003994" "cg00005847" "cg00006414" "cg00007981" "cg00008493" "cg00008713"…
##再加工的基因本体论路径注释,每个路径有10个和200个基因。文件(“extdata”、“goDB。rds", package="BioMM")) ##被调查生物过程数量长度(golist)
## [1] 2944
str (golist [1:3])
## 3 ## $ GO:0000002:命名为chr[1:12] "291" "1890" "4205" "4358"…# # . .- attr(*,“名字”)=[1:12]从而向“助教”“小淘气”“国际空间站”“小淘气”…## $ GO:0000012:命名为chr[1:11] "3981" "7141" "7515" "23411"…# # . .- attr(*,“名字”)=(1:11)从而向“艾达”“艾达”“国际能源机构”“小淘气”…## $ GO:0000027:命名为chr[1:29] "4839" "6122" "6123" "6125"…# # . .- attr(*,“名字”)=(一)从而向“小淘气”“IBA”“IBA”“IBA”…
##重新处理KEGG通路注释,每个通路有10个和200个基因。文件(“extdata”、“keggDB。rds", package="BioMM")) ##研究KEGG路径长度(kegglist)
293
str (kegglist [1:3])
## 3 ## $ hsa00010: chr[1:67] "10327" "124" "125" "126"…# # $ hsa00020:科(1:30)“1431”“1737”“1738”“1743”……# # $ hsa00030:科(1:30)“132158”“2203”“221823”“226”……

的用法来注释路径omics2pathlist ()函数基于两种不同的路径数据库和两种数据模式,如下所示。

使用100个路径来减少下游分析的运行时间。但是如果可能的话,请确保全部用完。numPath <- 100 # GO路径映射使用DNA甲基化数据golistSub <- golist[seq_len(numPath)] methylGOlist <- omics2pathlist(data=methylData, pathlistDB=golistSub, featureAnno=featureAnno, restrictUp=200, restrictDown=10, minPathSize=10)
最小第一曲,中位数,平均第三曲,最大值。## 11.00 21.00 39.00 67.25 78.00 337.00
#使用DNA甲基化数据kegglistSub <- kegglist[seq_len(numPath)] methylKEGGlist <- omics2pathlist(data=methylData, pathlistDB=kegglistSub, featureAnno=featureAnno, restrictUp=200, restrictDown=10, minPathSize=10)
最小第一曲,中位数,平均第三曲,最大值。## 16.00 37.75 58.00 74.57 89.25 286.00
# GO路径映射使用基因表达数据golistSub <- golist[seq_len(numPath)] expGOlist <- omics2pathlist(data=expData, pathlistDB=golistSub, featureAnno=NULL, restrictUp=200, restrictDown=10, minPathSize=10)
最小第一曲,中位数,平均第三曲,最大值。## 10.00 15.25 24.50 37.91 43.75 174.00
# KEGG路径映射使用基因表达数据kegglistSub <- kegglist[seq_len(numPath)] expKEGGlist <- omics2pathlist(data=expData, pathlistDB=kegglistSub, featureAnno=NULL, restrictUp=200, restrictDown=10, minPathSize=10)
最小第一曲,中位数,平均第三曲,最大值。## 11.00 22.00 32.50 40.55 50.25 135.00

5BioMM框架

5.1重演

简单地说,BioMM框架包含两个学习阶段[1]。在第一阶段,使用监督或无监督学习模型(第一阶段模型),生物元信息将原始数据集的变量“压缩”为路径级别的“潜在变量”(今后称为阶段2数据)。在第二阶段,使用具有非负结果相关特征的第二阶段数据建立监督模型(阶段-2模型)进行最终预测。

5.1.1机器学习模型的接口

端到端预测使用BioMM ()函数。如上所述,有监督学习和无监督学习都在BioMM框架中实现supervisedStage1 = TRUEsupervisedStage1 = FALSE.常用的监督分类器:包括套索,脊或弹性网络正则化(GLM)[4]广义回归模型,支持向量机(SVM)[3]和随机森林[2]。对于无监督方法,采用正则或稀疏约束主成分分析(PCA)[5]。predMode预测类型。在分类设置的情况下,可以使用“概率”或“分类”模式。通用的重采样方法包括交叉验证(CV)和自举(BS)程序作为参数resample1 =“简历”resample1 = "废话".阶段2数据在机器学习预测期间使用重采样方法重建,如果参数为独立测试集预测testData提供。详情请查阅BioMM ()在手册中。

5.1.1.1BioMM和随机森林

为了将BioMM应用于随机森林模型,我们使用了这个参数supervisedStage1 = TRUE而且分类器= randForestBioMM ().使用DNA甲基化数据映射GO路径。

##为了减少运行时间,只使用DNA甲基化数据的子集##但是,如果可能的话,不建议对数据进行子集化。trainData <- methylData[,1:3000] trainDataY <- trainData[,1] testData <- NULL ##模型参数monitedstage1 =TRUE分类器<- "randForest" predMode <- "probability" paramlist <- list(ntree=100, nthreads=20) core <- multicoream (workers =10) set.seed(123) result <- BioMM(trainData=trainData, testData=NULL, pathlistDB=golistSub, featureAnno, restrictUp=200, restrictDown=10, minPathSize=10, monitedstage1, typePCA="regular", resample1="BS", resample2="CV", dataMode="allTrain",repeatA1=50, repeatA2=1, repeatB1=10, repeatB2=1, nfolds=10, FSmethod1=NULL, FSmethod2=NULL, cutP1=0.05, cutP2=0.05, fdr2=NULL, FScore= multicoream (workers =1), classifier, predMode, paramlist, innerCore=core)
最小第一曲,中位数,平均第三曲,最大值。## 10.00 13.75 16.50 20.46 27.25 45.00
if (is.null(testData)) {metricCV <- getMetrics(dataY = trainDataY, predY = result) message("交叉验证预测性能:")print(metricCV)} else if (!is.null(testData)){testDataY <- testData[,1] metricCV <- getMetrics(dataY = trainDataY, cvYscore = result[[1]]) metricTest <- getMetrics(dataY = testDataY, testYscore = result[[2]]) message("交叉验证性能:")print(metricCV) message("测试集预测性能:")print(metricTest)}
## auc aucpr acc r2 ## r2 0.7 0.621 0.7 0.193

其他机器学习模型可以使用以下各自的参数设置。对于分类器“支持向量机”,参数可以使用内部交叉验证来调优tuneP = TRUE.对于广义回归模型glmnet,弹性网由输入参数指定α= 0.5.另外,α= 1是为了套索和α= 0就是山脊。对于无监督学习supervisedStage1 = FALSE,正则PCAtypePCA = "常规"是否应用并遵循随机森林分类是classifier2 = TRUE

5.1.2生物分层界面

对于使用生物信息的预测因子分层,可以应用各种策略。在本教程中,BioMM ()结合GO和KEGG路径分层,不仅考虑了功能类别内阶段1特征之间的互上位性,还考虑了路径级特征之间的相互作用。因此,这可能提供更多的价值相关的信息,生物学洞察潜在的表型。

5.1.2.1具有KEGG通路的BioMM

为了将BioMM应用于随机森林模型,我们使用了这个参数supervisedStage1 = TRUE而且分类器= randForestBioMM ().证明了基因表达数据映射到KEGG通路。

##为了减少运行时间,只使用基因表达数据的子集##但是,如果可能的话,不建议对数据进行子集化。trainData <- expData[,1:3000] trainDataY <- trainData[,1] testData <- NULL ##仅针对基因表达数据featureAnno=NULL ##模型参数superedstage1 =TRUE分类器<- "randForest" predMode <- "probability" paramlist <- list(ntree=100, nthreads=20) core <- multicoream (workers =10) set.seed(123) result <- BioMM(trainData=trainData, testData=NULL, pathlistDB=kegglistSub, featureAnno, restrictUp=200, restrictDown=10, minPathSize=10, restricedstage1, typePCA="regular",resample1="BS", resample2="CV", dataMode="allTrain", repeatA1=50, repeatA2=1, repeatB1=10, repeatB2=1, nfolds=10, FSmethod1=NULL, FSmethod2=NULL, cutP1=0.05, cutP2=0.05, fdr2=NULL, FScore= multicoream (workers =1), classifier, predMode, paramlist, innerCore=core)
最小第一曲,中位数,平均第三曲,最大值。## 10.00 12.00 15.00 16.44 22.00 25.00
##交叉验证应用于训练数据,因此'result'只返回CV预测分数。getMetrics(dataY = trainDataY, predY = result) message("交叉验证预测性能:")print(metricCV)
## auc aucpr acc r2 ## r2 0.845 0.716 0.8 0.441

5.2阶段2:数据探索

5.2.1阶段2数据的生成

在这里,我们使用BioMM和随机森林方法对基因表达数据结合KEGG通路创建阶段-2通路级数据。

##定义组学类型# omicsType <- "methylation" omicsType <- "expression" pathType <- "GO" pathType <- "KEGG" if (omicsType == "methylation" & pathType == "KEGG"){studylist <- methylGOlist} else if (omicsType == "expression" & pathType == "KEGG"){studylist <- methylKEGGlist} else if (omicsType == "expression" & pathType == "KEGG"){studylist <- methylkeggist} else if (omicsType == "expression" & pathType == "KEGG"){studylist <- expGOlist} else if (omicsType == "expression" & pathType == "KEGG"){studylist <- expKEGGlist} else {stop("错误指定omicsType and)} length(研究列表)
## [1] 100
##模型参数分类器<- "randForest" predMode <- "probability" paramlist <- list(ntree=100, nthreads=20) core <- MulticoreParam(workers =10) set.seed(123) stage2dataA <- reconBySupervised(trainDataList=studylist, testDataList=NULL, resample="BS", dataMode="allTrain", repeatA=50, repeatB=1, nfolds=10, FSmethod=NULL, cutP=0.05, fdr=NULL, FScore=MulticoreParam(workers =1), classifier, predMode, paramlist, innerCore=core, outFileA=NULL,outFileB=NULL) ##检查stage-2 data dim(stage2dataA)
## [1] 20 101
打印(表(stage2dataA [1]))
## ## 0 1 ## 10
头(stage2dataA [1:4])
##标签hsa00010 hsa00020 hsa00030 ## GSM943251 0 0.502 0.554 0.515 ## GSM943252 0 0.488 0.483 0.433 ## GSM943253 0 0.546 0.604 0.463 ## GSM943254 0 0.413 0.523 0.410 ## GSM943255 0 0.538 0.642 0.418 ## GSM943256 0 0.506 0.551 0.397

5.2.2特征可视化

迴圈解释了阶段2数据的变化

说明了为分类任务的阶段2数据的单个生成特征解释的方差比例的分布plotVarExplained ()在下面。采用Nagelkerke伪r平方测度计算被解释方差。这个论点posF = TRUE表示只绘制积极的结果相关特征,因为消极的关联可能反映了基础数据[6]中的随机效应。

multicorepam (workers = 10) fileName <- paste0(omicsType,"_", pathType, "_featuresVarExplained.png") plotarexained (data=stage2dataA, posF=TRUE, binarize=FALSE, core=core, pathTitle=paste0(pathType, " paths "), fileName)
## PNG ##
情节(load.image(文件名)

5.2.2.2结果相关功能模式的优先级

plotRankedFeature ()用于对阶段2数据中的结果相关特征进行排序和可视化。这个论点topF = 10而且posF = TRUE用来定义前10个与结果积极相关的特征。使用逻辑回归的负对数P值被用来评估论点所表明的排名特征的重要性rankMetric = " negPlogit ".其他指标包括Nagelkerke伪r平方“R2”和Z分数“Zscore”测量也可用(参见plotRankedFeature详见手册)。各自路径的大小被描绘为参数colorMetric = "大小"

core <- multicoream (workers =1) rankMetric <- "negPlogit" filePrefix <- paste0(omicsType, "_", pathType, "_topPath_", rankMetric) topPath <- plotRankedFeature(data=stage2dataA, posF=TRUE, topF=10, binarize=FALSE, blocklist=studylist, rankMetric=rankMetric, colorMetric="size", core, pathTitle=paste0(pathType, " paths "), fileName=paste0(filePrefix, ".png")) plot(加载。图像(paste0 (filePrefix . png)))

以下是上述途径的统计指标和描述:

##报告顶部路径if (pathType == "GO"){goterms = unlist(Term(GOTERM)) topGOID = gsub("\\.", ":", rownames(topPath))) subTerm = goterms[is.element(names(goterms), topGOID)] topIDmatch = subTerm[match(topGOID, names(subTerm))] topPath <- data.frame(topPath, Description=topIDmatch)} else if (pathType == "KEGG"){## KEGG ID和名称之间的匹配列表。数据冻结on Aug 2020 keggID2name <- readRDS(system。文件(“extdata”、“/ keggID2name202008。rds", package="BioMM")) keggSub <- keggID2name[是。element(keggID2name[,"ID"], rownames(topPath)),] topIDmatch <- keggSub[match(rownames(topPath), keggSub[,"ID"]),] topPath <- data.frame(topPath, Description=topIDmatch[,"name"])} print(topPath)
# # AUC R2 Zscore negPlogit negPwilcox ID大小# # hsa00030 hsa00030 23 # # hsa03010 0.865 0.507 2.325 1.698 2.188 0.825 0.487 2.280 1.646 1.809 hsa03010 123 # # hsa00532 hsa00532 17 # # hsa00240 0.810 0.383 2.243 1.604 1.732 0.870 0.489 2.114 1.462 2.410 hsa00240 47 # # hsa00480 hsa00480 51 # # hsa00983 0.815 0.359 2.076 1.421 1.720 0.770 0.338 2.002 1.344 1.346 74 # # hsa00983 hsa00561 hsa00561 53 # # hsa00760 0.940 0.731 1.980 1.322 3.000 0.745 0.314 1.919 1.260 1.158 hsa00760 28 # # hsa03060 0.765描述磷酸五糖途径核糖体糖胺聚糖生物合成-硫酸软骨素/皮肤硫酸酯嘧啶代谢谷胱甘肽代谢药物代谢-其他酶甘油脂代谢烟酸盐和烟酰胺代谢蛋白质输出果糖和甘露糖代谢
write.xlsx(topPath,file=paste0(filePrefix, ".xlsx")) #写入。table(topPath,file=paste0(filePrefix, ".txt"), sep="\t")

5.2.2.3cpg在感兴趣的通路中的意义

cirPlot4pathway ()说明了个体cpg (DNA甲基化数据)或基因(基因表达数据)落入一组通路的意义。这里调查了前10个与结果相关的途径。负对数P值用于定义这些通路中每个CpG或基因的显著性。

core <- multicorepam (workers = 10) pathID <- gsub("\\.", ":", rownames(topPath)) ##顶部路径的数量必须大于总体调查路径pathSet <- studylist[is.element(names(studylist), pathID)] pathMatch <- pathSet[match(pathID, names(pathSet))] fileName <- paste0(omicsType, "_", pathType, "_SigRankBy_", rankMetric) cirplot4path (datalist=pathMatch, topPathID=names(pathMatch), core, fileName)
# # 1 # # [1] 2 [1] # # 3 # # [1] [1] 4 # # # # [1] [1] 5 6 7 # # # # [1] [1] 8 # # [1] 9 # # 10 [1]
##环形曼哈顿密谋pval。图存储在:/tmp/RtmpX1UN5a/Rbuild1313e45bf62a5f/BioMM/vignettes

5.3计算考虑

在两个阶段都采用基于路径的分层方法的有监督模型的生物力学将比无监督方法的运行时间更长。但这种预测更有力量。因此,即使计算要求更高,我们也建议采用前者,因为下一代技术(例如5G)的采用正在推动计算存储和速度的进步。

此外,随着重采样重复次数的增加和一些其他相关模型参数(如随机森林模型中使用的树的数量)的增加,BioMM预测的稳定性通常会得到促进。最后,为这样的场景实现并推荐并行计算。在这个小插图中,由于运行时的原因,我们只展示了计算量较少的较小示例和模型。

6会话信息

sessionInfo ()
## R版本4.2.0 RC (2022-04-19 r82224) ##平台:x86_64-pc-linux-gnu(64位)##运行在Ubuntu 20.04.4 LTS ## ##矩阵产品:默认## BLAS: /home/biocbuild/bbs-3.15-bioc/R/lib/libRblas。/home/biocbuild/bbs-3.15-bioc/R/lib/libRlapack。所以## ## locale: ## [1] LC_CTYPE=en_US。UTF-8 LC_NUMERIC=C LC_TIME=en_GB LC_COLLATE= c# # [5] LC_MONETARY=en_US。utf - 8 LC_MESSAGES = en_US。utf - 8 LC_PAPER = en_US。utf - 8 LC_NAME = en_US。UTF-8 ## [9] LC_ADDRESS=en_US。utf - 8 LC_TELEPHONE = en_US。utf - 8 LC_MEASUREMENT = en_US。utf - 8 LC_IDENTIFICATION = en_US。UTF-8 ## ##附加的基本包:## [1]stats4统计图形grDevices utils数据集方法基础## ##其他附加包:[19] Matrix_1.4-1 rms_6.3-0 SparseM_1.81 Hmisc_4.7-0 ggplot2_3.3.5 Formula_1.2-4 ## [25] survival_3.3-1 lattice_0.20-45 ranger_0.13.1 BiocParallel_1.30.0 BioMM_1.12.0 BiocStyle_2.24.0 ## ##通过命名空间加载(和不附):[1] backports_1.4.1 igraph_1.3.1 splines_4.2.0 GenomeInfoDb_1.32.0 TH.data_1.1-1 ## [6] digest_0.6.29 foreach_1.5.2 htmltools_0.5.2 magick_2.7.3 tiff_0.1-11 ## [11] fansi_1.0.3 checkmate_2.1.0 memoise_2.0.1 nsprcomp_0.5.1-2 cluster_2.1.3 ## [16] Biostrings_2.64.0 matrixstats_0.2.0 sandwich_3 -1 jpeg_0.1-9 colorspace_2.0-3 ## [21] blob_1.2.3 xfun_0.30 dplyr_1.0.8 crayon_1.5.1 RCurl_1.98-1.6 ## [26] jsonlite_1.8.0 iterators_1.0.14 glue_1.6.2 gtable_0.3.0 zlibbioc_1.42.0 ## [31] XVector_0.36.0MatrixModels_0.5-0 shape_1.4.6 scales_1.2.0 mvtnorm_1.1-3 ## [36] DBI_1.1.2 Rcpp_1.0.8.3 htmlTable_2.4.0 foreign_0.8-82 bit_4.0.4 ## [41] proxy_0.4-26 htmlwidgets_1.5.4 httr_1.4.2 RColorBrewer_1.1-3 ellipsis_0.3.2 ## [46] farver_2.1.0 pkgconfig_2.0.3 rJava_1.0-6 nnet_7.3-17 sass_0.4.1 ## [51] utf8_1.2.2 labeling_0.4.2 tidyselect_1.1.2 rlang_1.0.2 munsell_0.5.0 ## [56] tools_4.2.0 cachem_1.0.6 cli_3.3.0 generics_0.1.2 RSQLite_2.2.12 ## [61] evaluate_0.15 stringr_1.4.0 fastmap_1.1.0 yaml_2.3.5 knitr_1.38 ## [66] bit64_4.0.5 purrr_0.3.4 KEGGREST_1.36.0 readbitmap_0.1.5 nlme_3.1-157 ## [71] quantreg_5.88 compiler_4.2.0 rstudioapi_0.13 png_0.1-7 tibble_3.1.6 ## [76] bslib_0.3.1 stringi_1.7.6 highr_0.9 vctrs_0.4.1 pillar_1.7.0 ## [81] lifecycle_1.0.1 BiocManager_1.30.17 jquerylib_0.1.4 data.table_1.14.2 bitops_1.0-7 ## [86] R6_2.5.1 latticeExtra_0.6-29 bookdown_0.26 gridExtra_2.3 bmp_0.3 ## [91] codetools_0.2-18 polspline_1.1.20 MASS_7.3-57 assertthat_0.2.1 xlsxjars_0.6.1 ## [96] withr_2.5.0 multcomp_1.4-19 GenomeInfoDbData_1.2.8 parallel_4.2.0 grid_4.2.0 ## [101] rpart_4.1.16 class_7.3-20 rmarkdown_2.14 base64enc_0.1-3

7参考文献

[1] NIPS ML4H提交:Chen, J.和Schwarz, E, 2017。生物信息多阶段机器学习识别表观遗传指纹。arXiv预印arXiv:1712.00336。

[2]布雷曼,L.(2001)。“随机森林。”机器学习45(1):5-32。

[3] Cortes, C., & Vapnik, V.(1995)。“支持向量网络。”机器学习20(3):273-297。

[4]弗里德曼,J.,哈斯蒂,T.,和蒂布谢拉尼,R.(2010)。通过坐标下降的广义线性模型的正则化路径。统计软件杂志33(1):1。

[5] Wold, S., Esbensen, K., & Geladi, P.(1987)。主成分分析。化学计量学与智能实验室系统2(1-3):37-52。

Claudia Perlich和Grzegorz Swirszcz。交叉验证和叠加:在随机数据上建立看似可预测的模型。ACM SIGKDD探索通讯,12(2):11-15,2011。