Sparse PLS discriminant analysis(Sparse PLS-DA分析实现)

参考信息:

Sparse PLS-DA的简单实现:http://www.bioconductor.org/packages/release/bioc/vignettes/mixOmics/inst/doc/vignette.html#principle-of-sparse-pls-da

Sparse PLS-DA分析的参数选择:http://www.bioconductor.org/packages/release/bioc/vignettes/mixOmics/inst/doc/vignette.html#tuning:sPLSDA

Sparse PLS-DA以上信息的中文翻译信息:https://www.jianshu.com/p/52eae84670c1/

本文的重点参考信息:

http://mixomics.org/case-studies/splsda-srbct/

正文:

数据:小圆形蓝细胞肿瘤 (SRBCT) 数据集包括在 63 个样本上测量的 2,308 个基因的表达水平。样品分为以下四类:8 伯基特淋巴瘤 (BL)、23 尤文肉瘤 (EWS)、12 神经母细胞瘤 (NB) 和 20 横纹肌肉瘤 (RMS)。

srbct 数据集包含以下内容:

$gene:一个有 63 行 2308 列的数据框。63 名受试者 2,308 个基因的表达水平。

$class:包含每个个体的肿瘤类的类向量(共 4 个类)。

$gene.name:一个包含 2,308 行和 2 列的数据框,其中包含有关基因的更多信息。

library(knitr)

library(mixOmics)

knitr::opts_chunk$set(dpi = 100, echo= TRUE, warning=FALSE, message=FALSE, fig.align = 'center',  fig.show=TRUE, fig.keep = 'all', out.width = '50%')

data(srbct)

X = srbct$gene  #the gene expression datadim(X)

Y = srbct$class

一、主成分分析

可以先进行非监督的主成分分析,查看在非监督的情况下,不同肿瘤样本之间的是否可以基于当前的基因表达信息区分开。

pca.srbct = pca(X, ncomp = 10, center = TRUE, scale = TRUE)

plotIndiv(pca.srbct, group = srbct$class, ind.names = FALSE,  legend = TRUE, title = 'PCA on SRBCT')

pca

二、PLS-DA分析

进行PLS-DA分析,初步判定利用多少个主成分comp(ncomp:the number of components to include in the model)可以较好的进行分类。PLS-DA配备了10个comp,用于评估获得能够得到最佳判定效果的comp个数。

对于判别分析,需要设置表示每个样本的分组因子 Y。在 PLS-DA 过程中,Y 因子将被转换为虚拟矩阵。

srbct.plsda <- plsda(X, Y, ncomp = 10)  # set ncomp to 10 for performance assessment

plotIndiv(srbct.plsda , comp = 1:2,group = srbct$class, ind.names = FALSE, ellipse = TRUE, legend = TRUE, title = 'PLSDA on SRBCT')

plsda

与无监督的 PCA 样本图相比,观察到四种肿瘤类别的清晰分离。绘制每个类别的置信椭圆以突出区分的强度(置信水平默认设置为 95%)。

对PLS-DA 模型的分类性能进行评估

PLS-DA 模型的分类性能通过perf函数使用重复 10 次的 5 倍交叉验证进行评估。重复次数对于确保分类错误率的良好估计是必要的(因为 CV -folds是以随机方式确定的)。根据性能结果,我们可以决定最终 PLS 模型的ncomp值。

set.seed(2543)  # for reproducibility, only when the `cpus' argument is not used

perf.plsda.srbct <- perf(srbct.plsda, validation = "Mfold", folds = 5, progressBar = FALSE, auc = TRUE, nrepeat = 10)

plot(perf.plsda.srbct, col = color.mixo(5:7), sd = TRUE, legend.position = "horizontal")

从性能图中,我们观察到 overall error rate和the Balanced Error Rate (BER)  相似,从 1 个comp到 3 个comp过程中急剧下降。在 6 个comp后稳定。

perf.plsda.srbct$choice.ncomp  #查看得到最佳结果的comp数

显示的分类性能表明 ncomp =  6 时 BER 和最大距离足以实现良好的判别性能(0.06 错误率,也就意味着并不是必须选择“最佳结果的comp数”,在分类性能良好的基础上,可以选择使用最少的comp)。

auc.plsda = auroc(srbct.plsda, roc.comp = 6)

也可以使用函数auroc获得 AUC 图,其中 AUC 是根据训练集的交叉验证结果计算并取平均值。

三、sPLS-DA 分析

PLS-DA 模型建立在 X 中的所有基因上,其中许多基因在进行分类上可能并未发挥作用。因此可以选择使用sPLS-DA 分析,识别最能区分分类类别的一小部分基因。

sPLS-DA分析最佳参数测定

首先使用函数tune.splsda 估计与模型中所选变量数量相关的分类性能(错误率)。根据 PLS-DA 性能评估的建议设置最大值ncomp = 6。选择重复 10 次的5 折交叉验证(folds = 5),并指定预测距离为最大距离 。

list.keepX <- c(1:10,  seq(20, 300, 10))  #每个组件进行评估时使用的基因个数

tune.splsda.srbct <- tune.splsda(X, Y, ncomp = 6, validation = 'Mfold', folds = 5,progressBar = TRUE, dist = 'max.dist', measure = "BER",test.keepX = list.keepX, nrepeat = 10, cpus = 2)

error <- tune.splsda.srbct$error.rate  # 指定的keepX下每个comp的错误率

ncomp <- tune.splsda.srbct$choice.ncomp$ncomp  # 基于t检验找到最佳的分析comp个数

要在每个comp上选择的特征值数量在$choice.keepX 中输出:

select.keepX <- tune.splsda.srbct$choice.keepX[1:ncomp]  # optimal number of variables to select

select.keepX

对于函数tune.splsda中指定的所有comp,以最后一个comp为条件的每个comp的分类错误率如下所示。

plot(tune.splsda.srbct, col = color.jet(6))

当 sPLS-DA 中包含更多comp时,分类错误率会降低(预测精度越低越好)。3 个comp足以让最终的 sPLS-DA 模型达到最佳性能。

最终模型包括 3 个comp和前 3 个comp上的 9、280、30 个选定特征值。

进行 sPLS-DA分析并绘图

splsda.srbct <- splsda(X, Y, ncomp = ncomp, keepX = select.keepX)

plotIndiv(splsda.srbct, comp = c(1,2),group = srbct$class, ind.names = FALSE,ellipse = TRUE, legend = TRUE,title = 'sPLS-DA on SRBCT, comp 1 & 2')

添加第三个comp进一步区分了 NB 和 RMS:

plotIndiv(splsda.srbct, comp = c(1,3),group = srbct$class, ind.names = FALSE,ellipse = TRUE, legend = TRUE,title = 'sPLS-DA on SRBCT, comp 1 & 3')

对于 PLS-DA 分析,也可以使用函数auroc获得 AUC 图。

仅包含 2 个comp的AUROC :

auc.splsda = auroc(splsda.srbct, roc.comp = 2)

包含最佳个数的comp的AUROC

auc.splsda = auroc(splsda.srbct, roc.comp = ncomp)

PLS-DA分类性能评估

通过指定预测距离算法,使用perf函数评估最终sPLS-DA 模型的分类性能。

set.seed(40) # for reproducibility, only when the `cpus' argument is not used# takes about 1 min to run

perf.srbct <- perf(splsda.srbct, validation = "Mfold", folds = 5,dist = 'max.dist', nrepeat = 10,progressBar = FALSE)

可以观察到,随着模型中添加更多comp,每类的整体和平衡错误率 (BER) 会降低。

perf.srbct$error.rate  #可查看添加comp后的错误率变化情况,可对该结果进行呈图

plot(perf.srbct, col = color.mixo(5))

还可以查看每个comp下的变量及其在CV-folds验证过程中的稳定性。

par(mfrow=c(1,3))

plot(perf.srbct$features$stable[[1]], type = 'h', ylab = 'Stability',xlab = 'Features', main = 'Comp 1', las =2)

plot(perf.srbct$features$stable[[2]], type = 'h', ylab = 'Stability',xlab = 'Features', main = 'Comp 2', las =2)

plot(perf.srbct$features$stable[[3]], type = 'h', ylab = 'Stability',xlab = 'Features', main = 'Comp 3', las =2)

par(mfrow=c(1,1))

利用selectVar函数可以输出所选择的变量及其 loading weight value,从最重要到最不重要的顺序。

下面的代码还提取了所选变量的稳定性信息,以辅助读者更好的对变量的性能进行判定

ind.match = match(selectVar(splsda.srbct, comp =1)$name, names(perf.srbct$features$stable[[1]]))  #extract the frequency of selection of those selected variables

Freq = as.numeric(perf.srbct$features$stable[[1][ind.match])

data.frame(selectVar(splsda.srbct, comp = 1)$value, Freq)

还有一些其他可输出的图形,具体可详见代码信息:

链接:https://pan.baidu.com/s/1Hs48f_eQ8reYV0d8L4fWuQ

提取码:e7sc

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容