聚类广泛用于数据分析。去年研究了一下R语言聚类树的绘图原理。以芯片分析为例,我们来给一些样品做聚类分析。聚类的方法有很多种,我们选择Pearson距离、ward方法。

选择的样品有:

  1. "GSM658287.CEL",
  2. "GSM658288.CEL",
  3. "GSM658289.CEL",
  4. "GSM658290.CEL",
  5. "GSM658291.CEL",
  6. "GSM658292.CEL",
  7. "GSM658293.CEL",
  8. "GSM658294.CEL",
  9. "GSM658295.CEL",
  10. "GSM658296.CEL"

R语言代码实现Pearson聚类:

  1. library(affy)
  2. library(bioDist)
  3.  
  4. rawData<-ReadAffy("GSM658287.CEL","GSM658288.CEL",
  5. "GSM658289.CEL","GSM658290.CEL",
  6. "GSM658291.CEL","GSM658292.CEL",
  7. "GSM658293.CEL","GSM658294.CEL",
  8. "GSM658295.CEL","GSM658296.CEL")
  9.  
  10. correl <- cor.dist(t(exprs(rawData)),abs=FALSE)
  11. switch(tolower("pearson"),
  12. "pearson" = {correl <- cor.dist(t(exprs(rawData)),abs=FALSE)},
  13. "spearman" = {correl <- spearman.dist(t(exprs(rawData)),abs=FALSE)},
  14. "euclidean" = {correl <- euc(t(exprs(rawData)))})
  15. clust <- hclust(correl, method = tolower("ward"))
  16. plot(clust)

R语言作图结果:

根据这几行代码,我们只知道使用cor.dist、hclust、plot这几个函数得到的结果,却看不出这些函数具体做了什么,也不太有人去深究这些问题。

事实上,R语言聚类部分的计算是用Fortran实现的,源码在https://svn.r-project.org/R/trunk/src/library/stats/src/,把hclust.f复制到本地,用一些工具生成hclust.dll,把hclust.dll和以上10个样品放在同一个目录,然后再运行以下的代码:

  1. library(affy)
  2. library(bioDist)
  3. dyn.load('hclust.dll')
  4.  
  5. rawData<-ReadAffy("GSM658287.CEL","GSM658288.CEL",
  6. "GSM658289.CEL","GSM658290.CEL",
  7. "GSM658291.CEL","GSM658292.CEL",
  8. "GSM658293.CEL","GSM658294.CEL",
  9. "GSM658295.CEL","GSM658296.CEL")
  10.  
  11. correl <- cor.dist(t(exprs(rawData)),abs=FALSE) ## correl是一个下三角矩阵,本文不介绍这里的重要算法
  12.  
  13. > correl
  14. GSM658287.CEL GSM658288.CEL GSM658289.CEL GSM658290.CEL
  15. GSM658288.CEL 0.037635566
  16. GSM658289.CEL 0.024346960 0.042032944
  17. GSM658290.CEL 0.024480935 0.040669995 0.025292084
  18. GSM658291.CEL 0.035538210 0.039284603 0.067154783 0.048204704
  19. GSM658292.CEL 0.072405758 0.050517381 0.059166892 0.059722043
  20. GSM658293.CEL 0.060155354 0.060391062 0.041925320 0.043643727
  21. GSM658294.CEL 0.036793132 0.029287344 0.069763710 0.059879668
  22. GSM658295.CEL 0.037397535 0.030773204 0.072159149 0.060667121
  23. GSM658296.CEL 0.068689147 0.031698616 0.068728603 0.065111592
  24. GSM658291.CEL GSM658292.CEL GSM658293.CEL GSM658294.CEL
  25. GSM658288.CEL
  26. GSM658289.CEL
  27. GSM658290.CEL
  28. GSM658291.CEL
  29. GSM658292.CEL 0.074867692
  30. GSM658293.CEL 0.085559588 0.019655239
  31. GSM658294.CEL 0.023287164 0.059198270 0.071436194
  32. GSM658295.CEL 0.028215326 0.065728329 0.075385956 0.007874206
  33. GSM658296.CEL 0.059225037 0.046602561 0.059663628 0.044584172
  34. GSM658295.CEL
  35. GSM658288.CEL
  36. GSM658289.CEL
  37. GSM658290.CEL
  38. GSM658291.CEL
  39. GSM658292.CEL
  40. GSM658293.CEL
  41. GSM658294.CEL
  42. GSM658295.CEL
  43. GSM658296.CEL 0.048650173
  44.  
  45. method <-
  46. n <- as.integer(attr(correl, "Size"))
  47. len <- as.integer(n * (n - )/)
  48. members <- rep(, n)
  49. storage.mode(correl) <- "double"
  50.  
  51. hcl <- .Fortran("hclust",
  52. n = n,
  53. len = len,
  54. method = as.integer(method),
  55. ia = integer(n),
  56. ib = integer(n),
  57. crit = double(n),
  58. members = as.double(members),
  59. nn = integer(n),
  60. disnn = double(n),
  61. flag = logical(n),
  62. diss = correl)
  63.  
  64. hcass <- .Fortran("hcass2",
  65. n = n,
  66. ia = hcl$ia, ib = hcl$ib,
  67. order = integer(n),
  68. iia = integer(n),
  69. iib = integer(n))
  70.  
  71. tree <- list(merge = cbind(hcass$iia[1L:(n - )],
  72. hcass$iib[1L:(n - )]),
  73. height = hcl$crit[1L:(n - )],
  74. order = hcass$order,
  75. labels = attr(d, "Labels"),
  76. method = "ward",
  77. dist.method = "cor")
  78.  
  79. 输出结果:
  80.  
  81. > hcl$crit[1L:(n - )] ## 高度
  82. [] 0.007874206 0.019655239 0.024346960 0.025066360 0.031698616 0.031710258
  83. [] 0.065868858 0.103249166 0.137220473
  84.  
  85. > hcass$iia[1L:(n - )]
  86. [] - - - - - -
  87.  
  88. > hcass$iib[1L:(n - )]
  89. [] - - - -
  90.  
  91. > hcass$order
  92. []

解析:

一、10个样品原来的顺序:

  1. "GSM658287.CEL", ## 第1个
  2. "GSM658288.CEL", ## 第2个
  3. "GSM658289.CEL", ## 第3个
  4. "GSM658290.CEL", ## 第4个
  5. "GSM658291.CEL", ## 第5个
  6. "GSM658292.CEL", ## 第6个
  7. "GSM658293.CEL", ## 第7个
  8. "GSM658294.CEL", ## 第8个
  9. "GSM658295.CEL", ## 第9个
  10. "GSM658296.CEL" ## 第10个

按照hcass$order的顺序重新排列,就会得到:

  1. "GSM658288.CEL", ## 第2个
  2. "GSM658296.CEL", ## 第10个
  3. "GSM658291.CEL", ## 第5个
  4. "GSM658294.CEL", ## 第8个
  5. "GSM658295.CEL", ## 第9个
  6. "GSM658292.CEL", ## 第6个
  7. "GSM658293.CEL", ## 第7个
  8. "GSM658290.CEL", ## 第4个
  9. "GSM658287.CEL", ## 第1个
  10. "GSM658289.CEL", ## 第3个

这刚好是聚类图像里的样品顺序

二、再看看iia和iib:

  1. iia iib
  2. - -
  3. - -
  4. - -
  5. -
  6. - -
  7. -

1)第一步的iia是-8,iib是-9,如果iia或者iib的值是负数的话,说明它所代表的样品是聚类树最底层的子树的分支,我们把第8个样品和第九个样品连接起来,高度取hcl$crit的第一个值0.007874206,得到:

  1. "GSM658288.CEL" ##
  2. "GSM658296.CEL" ##
  3. "GSM658291.CEL" ##
  4. "GSM658294.CEL" ## --|
  5. "GSM658295.CEL" ## --|
  6. "GSM658292.CEL" ##
  7. "GSM658293.CEL" ##
  8. "GSM658290.CEL" ##
  9. "GSM658287.CEL" ##
  10. "GSM658289.CEL" ##

2)根据第2步的-6、-7和第三行的-1、-3,我们把第6个样品和第7个样品连接起来,取高度0.019655239,把第1个样品和第3个样品连接起来,取高度0.024346960:

  1. "GSM658288.CEL" ##
  2. "GSM658296.CEL" ##
  3. "GSM658291.CEL" ##
  4. "GSM658294.CEL" ## --|
  5. "GSM658295.CEL" ## --|
  6. "GSM658292.CEL" ## ----|
  7. "GSM658293.CEL" ## ----|
  8. "GSM658290.CEL" ##
  9. "GSM658287.CEL" ## -----|
  10. "GSM658289.CEL" ## -----|

3)第4步是-4和3,意思是把第4个样品和刚刚第三步聚类的结果(也就是第1个样品和第3个样品聚类的结果)连接起来,取高度0.025066360:

  1. "GSM658288.CEL" ##
  2. "GSM658296.CEL" ##
  3. "GSM658291.CEL" ##
  4. "GSM658294.CEL" ## --|
  5. "GSM658295.CEL" ## --|
  6. "GSM658292.CEL" ## ----|
  7. "GSM658293.CEL" ## ----|
  8. "GSM658290.CEL" ## -------|
  9. "GSM658287.CEL" ## -----|_|
  10. "GSM658289.CEL" ## -----|

4)第五步是-2和-10,把第2个样品和第10个样品连接起来,取高度0.031698616:

  1. "GSM658288.CEL" ## --------|
  2. "GSM658296.CEL" ## --------|
  3. "GSM658291.CEL" ##
  4. "GSM658294.CEL" ## --|
  5. "GSM658295.CEL" ## --|
  6. "GSM658292.CEL" ## ----|
  7. "GSM658293.CEL" ## ----|
  8. "GSM658290.CEL" ## -------|
  9. "GSM658287.CEL" ## -----|_|
  10. "GSM658289.CEL" ## -----|

5)第六步是-5和1,把样品5和第一步聚类的结果连接起来,取高度0.031710258:

  1. "GSM658288.CEL" ## --------|
  2. "GSM658296.CEL" ## --------|
  3. "GSM658291.CEL" ## ----------|
  4. "GSM658294.CEL" ## --|_______|
  5. "GSM658295.CEL" ## --|
  6. "GSM658292.CEL" ## ----|
  7. "GSM658293.CEL" ## ----|
  8. "GSM658290.CEL" ## -------|
  9. "GSM658287.CEL" ## -----|_|
  10. "GSM658289.CEL" ## -----|

6)第七步是5和6,把第五步和第一步聚类的结果连接起来,取高度0.065868858:

  1. "GSM658288.CEL" ## --------|_____
  2. "GSM658296.CEL" ## --------| |
  3. "GSM658291.CEL" ## ----------|___|
  4. "GSM658294.CEL" ## --|_______|
  5. "GSM658295.CEL" ## --|
  6. "GSM658292.CEL" ## ----|
  7. "GSM658293.CEL" ## ----|
  8. "GSM658290.CEL" ## -------|
  9. "GSM658287.CEL" ## -----|_|
  10. "GSM658289.CEL" ## -----|

7)第八步连接第2步和第4步的结果,取高度0.103249166:

  1. "GSM658288.CEL" ## --------|_____
  2. "GSM658296.CEL" ## --------| |
  3. "GSM658291.CEL" ## ----------|___|
  4. "GSM658294.CEL" ## --|_______|
  5. "GSM658295.CEL" ## --|
  6. "GSM658292.CEL" ## ----|__________
  7. "GSM658293.CEL" ## ----| |
  8. "GSM658290.CEL" ## -------|_______|
  9. "GSM658287.CEL" ## -----|_|
  10. "GSM658289.CEL" ## -----|

8)第九步连接第7步和第8步的结果,取高度0.137220473:

  1. "GSM658288.CEL" ## --------|_____
  2. "GSM658296.CEL" ## --------| |____
  3. "GSM658291.CEL" ## ----------|___| |
  4. "GSM658294.CEL" ## --|_______| |
  5. "GSM658295.CEL" ## --| |
  6. "GSM658292.CEL" ## ----|___________ |
  7. "GSM658293.CEL" ## ----| |___|
  8. "GSM658290.CEL" ## -------|_______|
  9. "GSM658287.CEL" ## -----|_|
  10. "GSM658289.CEL" ## -----|

完成

15、R语言聚类树的绘图原理的更多相关文章

  1. R语言学习笔记2——绘图

    R语言提供了非常强大的图形绘制功能.下面来看一个例子: > dose <- c(20, 30, 40, 45, 60)> drugA <- c(16, 20, 27, 40, ...

  2. R语言学习2:绘图

    本系列是一个新的系列,在此系列中,我将和大家共同学习R语言.由于我对R语言的了解也甚少,所以本系列更多以一个学习者的视角来完成. 参考教材:<R语言实战>第二版(Robert I.Kaba ...

  3. R语言:ggplot2精细化绘图——以实用商业化图表绘图为例

    本文版权归http://www.cnblogs.com/weibaar 本文旨在介绍R语言中ggplot2包的一些精细化操作,主要适用于对R画图有一定了解,需要更精细化作图的人,尤其是那些刚从exce ...

  4. R语言-聚类与分类

    一.聚类: 一般步骤: 1.选择合适的变量 2.缩放数据 3.寻找异常点 4.计算距离 5.选择聚类算法 6.采用一种或多种聚类方法 7.确定类的数目 8.获得最终聚类的解决方案 9.结果可视化 10 ...

  5. R语言聚类方法&主要软件包-K-means

    主要4中软件包 stas:主要包含基本统计函数. cluster:用于聚类分析. fpc:含聚类算法函数(固定聚类.线性回归聚类等). mclust:处理高斯分布混合模型,通过EM算法实现聚类.分类及 ...

  6. R语言曲线拟合函数(绘图)

    曲线拟合:(线性回归方法:lm) 1.x排序 2.求线性回归方程并赋予一个新变量     z=lm(y~x+I(x^2)+...) 3.plot(x,y)    #做y对x的散点图 4.lines(x ...

  7. R语言中文社区历史文章整理(类型篇)

    R语言中文社区历史文章整理(类型篇)   R包: R语言交互式绘制杭州市地图:leafletCN包简介 clickpaste包介绍 igraph包快速上手 jiebaR,从入门到喜欢 Catterpl ...

  8. 统计计算与R语言的资料汇总(截止2016年12月)

    本文在Creative Commons许可证下发布. 在fedora Linux上断断续续使用R语言过了9年后,发现R语言在国内用的人逐渐多了起来.由于工作原因,直到今年暑假一个赴京工作的机会与一位统 ...

  9. 【机器学习与R语言】4-决策树

    目录 1.决策树原理 2.决策树应用示例 2.1)收集数据 2.2)探索和准备数据 2.3)训练模型 2.4)评估模型性能 2.5)提高模型性能 通过自适应增强算法(boosting) 将惩罚因子分配 ...

随机推荐

  1. 震惊!文科生如何三个月转行成为Java工程师?

    点击上方“程序员江湖”,选择“置顶或者星标” 你关注的就是我关心的! 作者:以大橘为重链接:https://www.nowcoder.com/discuss/156087 楼主是19届应届生,去年在牛 ...

  2. python递归获取目录下指定文件

    获取一个目录下所有指定格式的文件是实际生产中常见需求. import os #递归获取一个目录下所有的指定格式的文件 def get_jsonfile(path,file_list): dir_lis ...

  3. MemoScope.Net

    What is MemoScope.Net ? It's a tool to analyze .Net process memory: it can dump an application's mem ...

  4. HttpClient两种调用方式

    一.参数字符串 /** * HttpClient请求接口 * @return 成功:音频字节 失败:null */ public static byte[] requestBaiduAudio(Str ...

  5. Haskell 安装

    1.Ubuntu 安装过程中出现了一些问题: 1)W: An error occurred during the signature verification. The repository is n ...

  6. 阶段3 3.SpringMVC·_03.SpringMVC常用注解_4 HiddentHttpMethodFilter过滤器

    此文只做了解!! 过滤器 ,了解即可 请求设置为post的方式 换成put的方式 浏览器模拟发送PUT请求 ,不大好模拟.顾虑器可以帮助我们发送不同的请求 过滤器会拿到这个请求 详情可以看文档,此处不 ...

  7. C++数据结构之哈希表

    哈希表的定义:哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方.键可以对应多个值(即哈希冲突),值根据相应的hash公式存入对应的键中. 哈希函数的构造要求 ...

  8. java最常见的5个错误

    1. Null 的过度使用 避免过度使用 null 值是一个最佳实践.例如,更好的做法是让方法返回空的 array 或者 collection 而不是 null 值,因为这样可以防止程序抛出 Null ...

  9. MongoDB 日志中出现“UserNotFound: Could not find user ceilometer@ceilometer”,如何解决?

    MongoDB 日志中出现“UserNotFound: Could not find user ceilometer@ceilometer” 问题描述 MongoDB(版本 3.2.9) 服务启动后, ...

  10. 奶牛渡河(dp)

    奶牛渡河 时间限制: 1 Sec  内存限制: 128 MB提交: 36  解决: 27[提交][状态][讨论版][命题人:外部导入][Edit] [TestData] [同步数据] 题目描述 Far ...