专栏首页生信修炼手册ConsensusClusterPlus, 一步到位的一致性聚类!

ConsensusClusterPlus, 一步到位的一致性聚类!

在之前的文章中分享了一致性聚类的原理,本文介绍下如何用R语言进行分析。ConsensusClusterPlus这个R包,就是专门用于一致性聚类分析的,为了简化调用,甚至将所有的步骤都封装到了一个函数里面,所以其使用方法非常的简单,一共三步

1. 加载R包

2. 把表达量数据读进去

3. 运行一致性聚类的函数

是不是和把大象装进冰箱一样简单,但是我们必须注意,这样简单的背后,实际是一个黑盒子,如果不了解原理,你只能得到结果,但是结果说明了什么信息,你一无所知。

下面是具体步骤

1. 准备输入数据

行为基因,列为样本的表达量数据,为了获得最佳的聚类效果,可以对基因进行筛选, 对矩阵进行归一化操作,代码如下

> library(ALL)
> data(ALL)
> d=exprs(ALL)
# 表达量数据
> d[1:5,1:5]
             01005    01010    03002    04006    04007
1000_at   7.597323 7.479445 7.567593 7.384684 7.905312
1001_at   5.046194 4.932537 4.799294 4.922627 4.844565
1002_f_at 3.900466 4.208155 3.886169 4.206798 3.416923
1003_s_at 5.903856 6.169024 5.860459 6.116890 5.687997
1004_at   5.925260 5.912780 5.893209 6.170245 5.615210
> mad(d[1, ])
[1] 0.2701619
> mads=apply(d,1,mad)
> d=d[rev(order(mads))[1:5000],]
> dim(d)
[1] 5000  128
# 归一化操作
> d = sweep(d,1, apply(d,1,median,na.rm=T))
> dim(d)
[1] 5000  128
> d[1:5,1:5]
              01005     01010       03002     04006       04007
36638_at  1.5561207 0.9521271 -0.05018082  4.780378  3.93006775
39318_at  1.1913532 2.5013225 -2.38793537 -1.199521  1.93626914
38514_at  1.0207162 3.2785671  1.55949145 -3.345919 -0.01548269
266_s_at  1.8292604 0.3624327  1.54913247 -1.286294  1.75669694
38585_at -0.9240204 0.1895020  3.44968363 -2.216822  5.18702726

2. 运行ConsensusClusterPlus

ConsensusClusterPlus就是核心函数了,包括了以下几个参数

1. pItem, 选择80%的样本进行重复抽样

2. pfeature, 选择80%的基因进行重复抽样

3. maxK, 最大的K值,形成一系列梯度

4. reps, 重复抽样的数目

5. clusterAlg, 层次聚类的算法

6. distanc, 距离矩阵的算法

7. title, 输出结果的文件夹名字,包含了输出的图片

8. seed, 随机种子,用于重复结果

注意,在实际运行中,推荐reps设置的更大,比如1000, maxK设置的更大,比如20,具体代码如下

> library(ConsensusClusterPlus)
> title=tempdir()
> results = ConsensusClusterPlus(d,maxK=6,reps=50,pItem=0.8,pFeature=1, title=title,clusterAlg="hc",distance="pearson",seed=1262118388.71279,plot="png", writeTable = TRUE)
end fraction
clustered
clustered
clustered
clustered
clustered

函数的返回值是一个列表,每个列表子项对应给具体的K, K最小值为2

> str(results[[2]])
List of 5
$ consensusMatrix: num [1:128, 1:128] 1 1 0.895 1 1 ...
$ consensusTree  :List of 7
  ..$ merge      : int [1:127, 1:2] -1 -4 -5 -6 -7 -9 -11 -12 -14 -15 ...
  ..$ height     : num [1:127] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ order      : int [1:128] 101 128 127 126 125 124 123 122 121 120 ...
  ..$ labels     : NULL
  ..$ method     : chr "average"
  ..$ call       : language hclust(d = as.dist(1 - fm), method = finalLinkage)
  ..$ dist.method: NULL
  ..- attr(*, "class")= chr "hclust"
$ consensusClass : Named int [1:128] 1 1 1 1 1 1 1 1 1 1 ...
  ..- attr(*, "names")= chr [1:128] "01005" "01010" "03002" "04006" ...
$ ml             : num [1:128, 1:128] 1 1 0.895 1 1 ...
$ clrs           :List of 3
  ..$ : chr [1:128] "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" ...
  ..$ : num 2
  ..$ : chr [1:2] "#A6CEE3" "#1F78B4"

# 一致性矩阵,样本的邻接矩阵
> dim(d)
[1] 5000  128

> dim(results[[2]][["consensusMatrix"]])
[1] 128 128

> results[[2]][["consensusMatrix"]][1:5,1:5]
          [,1]      [,2]      [,3]      [,4]     [,5]
[1,] 1.0000000 1.0000000 0.8947368 1.0000000 1.000000
[2,] 1.0000000 1.0000000 0.9142857 1.0000000 1.000000
[3,] 0.8947368 0.9142857 1.0000000 0.8857143 0.969697
[4,] 1.0000000 1.0000000 0.8857143 1.0000000 1.000000
[5,] 1.0000000 1.0000000 0.9696970 1.0000000 1.000000

> results[[2]][["consensusTree"]]


Call:
hclust(d = as.dist(1 - fm), method = finalLinkage)


Cluster method   : average
Number of objects: 128

# 样本的聚类树
> results[[2]][["consensusTree"]]


Call:
hclust(d = as.dist(1 - fm), method = finalLinkage)


Cluster method   : average
Number of objects: 128

# consensusClass, 样本的聚类结果
> length(results[[2]][["consensusClass"]])
[1] 128
> results[[2]][["consensusClass"]][1:5]
01005 01010 03002 04006 04007
    1     1     1     1     1


# ml, 就是consensusMatrix
> results[[2]][["ml"]][1:5,1:5]
          [,1]      [,2]      [,3]      [,4]     [,5]
[1,] 1.0000000 1.0000000 0.8947368 1.0000000 1.000000
[2,] 1.0000000 1.0000000 0.9142857 1.0000000 1.000000
[3,] 0.8947368 0.9142857 1.0000000 0.8857143 0.969697
[4,] 1.0000000 1.0000000 0.8857143 1.0000000 1.000000
[5,] 1.0000000 1.0000000 0.9696970 1.0000000 1.000000
> results[[2]][["consensusMatrix"]][1:5,1:5]
          [,1]      [,2]      [,3]      [,4]     [,5]
[1,] 1.0000000 1.0000000 0.8947368 1.0000000 1.000000
[2,] 1.0000000 1.0000000 0.9142857 1.0000000 1.000000
[3,] 0.8947368 0.9142857 1.0000000 0.8857143 0.969697
[4,] 1.0000000 1.0000000 0.8857143 1.0000000 1.000000
[5,] 1.0000000 1.0000000 0.9696970 1.0000000 1.000000

# clrs, 颜色
> results[[2]][["clrs"]]
[[1]]
  [1] "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3"
[13] "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3"
[25] "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3"
[37] "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3"
[49] "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3"
[61] "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3"
[73] "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3"
[85] "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#A6CEE3" "#1F78B4"
[97] "#1F78B4" "#1F78B4" "#1F78B4" "#1F78B4" "#1F78B4" "#1F78B4" "#1F78B4" "#A6CEE3" "#1F78B4" "#1F78B4" "#1F78B4" "#1F78B4"
[109] "#1F78B4" "#1F78B4" "#1F78B4" "#1F78B4" "#1F78B4" "#1F78B4" "#A6CEE3" "#1F78B4" "#1F78B4" "#1F78B4" "#1F78B4" "#1F78B4"
[121] "#1F78B4" "#1F78B4" "#1F78B4" "#1F78B4" "#1F78B4" "#1F78B4" "#1F78B4" "#1F78B4"


[[2]]
[1] 2


[[3]]
[1] "#A6CEE3" "#1F78B4"

3. 收集cluster-consensus和item-consensus 矩阵

代码如下

> icl = calcICL(results,title=title,plot="png")
> icl[["clusterConsensus"]]
      k cluster clusterConsensus
[1,] 2       1        0.7681668
[2,] 2       2        0.9788274
[3,] 3       1        0.6176820
[4,] 3       2        0.9190744
[5,] 3       3        1.0000000
[6,] 4       1        0.8446083
[7,] 4       2        0.9067267
[8,] 4       3        0.6612850
[9,] 4       4        1.0000000
[10,] 5       1        0.8175802
[11,] 5       2        0.9066489
[12,] 5       3        0.6062040
[13,] 5       4        0.8154580
[14,] 5       5        1.0000000
[15,] 6       1        0.7511726
[16,] 6       2        0.8802040
[17,] 6       3        0.7410730
[18,] 6       4        0.8154580
[19,] 6       5        0.7390864
[20,] 6       6        1.0000000

> dim(icl[["itemConsensus"]])
[1] 2560    4
> 128 * (2 + 3 + 4 + 5 + 6)
[1] 2560

> icl[["itemConsensus"]][1:5,]
  k cluster  item itemConsensus
1 2       1 28031     0.6173782
2 2       1 28023     0.5797202
3 2       1 43012     0.5961974
4 2       1 28042     0.5644619
5 2       1 28047     0.6259350

4. 结果解读

在输出文件夹中,包含了多种输出可视化结果,每种结果的含义如下

1)consensus matrix 热图

consensus matrix 为样本方阵,数值代表两个同属一个cluster的可能性,取值范围从0到1, 颜色从白色到深蓝色

2)consensus 累计分布图 CDF

对于每个K对应的consensus matrix, 采用100个bin的柱状图来计算累计分布,

CDF图可以用来帮助决定最佳的K值

3)delta area plot

对于每个K, 计算K和K-1相比,CDF 曲线下面积的相对变化,对于K=2, 因为没有K=1, 所以是totla CDF curve area,选取增加不明显的点作为最佳的K值

4)tracling plot

行为样本,列为每个K, 用热图展示样本在每个K下的cluster, 用于定性评估不稳定的聚类和不稳定的样本

·end·

文章分享自微信公众号:
生信修炼手册

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:lzyg
原始发表时间:2022-04-27
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 识别无监督类的工具包ConsensusClusterPlus

    一致性聚类(Consensus Clustering)是一个能够确定数据集(微阵列基因表达)中可能聚类的数量和成员的方法。这种方法在癌症基因组学研究中广泛普及,...

    作图丫
  • K-means聚类:原理简单的聚类算法

    对于监督学习而言,回归和分类是两类基本应用场景;对于非监督学习而言,则是聚类和降维。K-means属于聚类算法的一种,通过迭代将样本分为K个互不重叠的子集。

    生信修炼手册
  • 甲基化肿瘤分型文章套路视频(甲基化预后分型)

    今天给大家介绍一篇五分的甲基化预后分型文章套路。文章以450k芯片作为train组,以27k芯片作为test组,对肿瘤进行分型,得到不同肿瘤...

    用户6927366
  • 一种另辟蹊径的聚类:EM聚类

    我们常常谈论聚类,是通过距离去定义,比如K-means,距离判别等;今天我们一起谈谈EM聚类,一种基于统计分布的聚类模型,以统计分布作为设计算法的依据。其实,在...

    herain
  • 图像聚类的python实现

    因为之后的项目要用到影像聚类,之前一直是用ENVI实现,现在想学下python。 学习的这一篇:小项目聚类

    py3study
  • 谱聚类的python实现

    使得切割的边的权重和最小,对于无向图而言就是切割的边数最少,如上所示。但是,切割的时候可能会存在局部最优,有以下两种方法:

    西西嘛呦
  • 说说地图中的聚类

    虽然Openlayers4会有自带的聚类效果,但是有些时候是不能满足我们的业务场景的,本文结合一些业务场景,讲讲地图中的聚类展示。

    lzugis
  • Spark中的聚类算法

    官方文档:https://spark.apache.org/docs/2.2.0/ml-clustering.html

    HoLoong
  • 我眼中的变量聚类

    ‍‍‍‍‍ 连续变量压缩的基本思路为:建模之前使用主成分、因子分析或变量聚类的方法进行变量压缩,后续建模时使用向前法、向后法、逐步法或全子集法进一步进行变量...

    许卉
  • 聚类树的合并展示

    层次聚类(hierarchical clustering)就是通过对数据集按照某种方法进行层次分解,直到满足某种条件为止,常用的方法有UPGMA、ward.D2...

    SYSU星空
  • 常见的几种聚类算法

    1、K-Means(K均值)聚类 算法步骤: (1)选择一些类,随机初始化它们的中心点。 (2)计算每个数据点到中心点的距离,数据点距离哪个中心点最近就划...

    week
  • 机器学习(8)——其他聚类层次聚类画出原始数据的图小结

    层次聚类 紧接上章,本章主要是介绍和K-Means算法思想不同而的其他聚类思想形成的聚类算法。 k-means算法却是一种方便好用的聚类算法,但是始终有K值选择...

    DC童生
  • 基于密度的社会网络聚类

    基于密度的聚类模式公式的基本思想是将组与数据的概率密度函数模式周围的区域相关联。本文利用样本空间中聚类与稠密区域之间的对应关系,讨论了这种方法在社会网络分析中的...

    柴艺
  • DBSCAN聚类︱scikit-learn中一种基于密度的聚类方式

    一、DBSCAN聚类概述 基于密度的方法的特点是不依赖于距离,而是依赖于密度,从而克服基于距离的算法只能发现“球形”聚簇的缺点。 DBSCAN的核心思想是从...

    悟乙己
  • 基于聚类的图像分割-Python

    当我们在做一个图像分类任务时,首先我们会想从图像中捕获感兴趣的区域,然后再将其输入到模型中。让我们尝试一种称为基于聚类的图像分割技术,它会帮助我们在一定程度上提...

    小白学视觉
  • AI小知识-基于分层的聚类

    用户3578099
  • 小孩都看得懂的聚类

    本文是「小孩都看得懂」系列的第四篇,本系列的特点是没有公式,没有代码,只有图画,只有故事。内容不长,碎片时间完全可以看完,但我背后付出的心血却不少。喜欢就好!

    用户5753894
  • AI小知识-基于模型的聚类

    用户3578099
  • 有关照片聚类算法的思考

    本文作者主要从聚类的规则、聚类效果、聚类的算法八个方面探讨有关照片聚类算法的思考。

    QQ空间开发团队

扫码关注腾讯云开发者

领取腾讯云代金券