15、R语言聚类树的绘图原理
聚类广泛用于数据分析。去年研究了一下R语言聚类树的绘图原理。以芯片分析为例,我们来给一些样品做聚类分析。聚类的方法有很多种,我们选择Pearson距离、ward方法。
选择的样品有:
- "GSM658287.CEL",
- "GSM658288.CEL",
- "GSM658289.CEL",
- "GSM658290.CEL",
- "GSM658291.CEL",
- "GSM658292.CEL",
- "GSM658293.CEL",
- "GSM658294.CEL",
- "GSM658295.CEL",
- "GSM658296.CEL"
R语言代码实现Pearson聚类:
- library(affy)
- library(bioDist)
- rawData<-ReadAffy("GSM658287.CEL","GSM658288.CEL",
- "GSM658289.CEL","GSM658290.CEL",
- "GSM658291.CEL","GSM658292.CEL",
- "GSM658293.CEL","GSM658294.CEL",
- "GSM658295.CEL","GSM658296.CEL")
- correl <- cor.dist(t(exprs(rawData)),abs=FALSE)
- switch(tolower("pearson"),
- "pearson" = {correl <- cor.dist(t(exprs(rawData)),abs=FALSE)},
- "spearman" = {correl <- spearman.dist(t(exprs(rawData)),abs=FALSE)},
- "euclidean" = {correl <- euc(t(exprs(rawData)))})
- clust <- hclust(correl, method = tolower("ward"))
- 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个样品放在同一个目录,然后再运行以下的代码:
- library(affy)
- library(bioDist)
- dyn.load('hclust.dll')
- rawData<-ReadAffy("GSM658287.CEL","GSM658288.CEL",
- "GSM658289.CEL","GSM658290.CEL",
- "GSM658291.CEL","GSM658292.CEL",
- "GSM658293.CEL","GSM658294.CEL",
- "GSM658295.CEL","GSM658296.CEL")
- correl <- cor.dist(t(exprs(rawData)),abs=FALSE) ## correl是一个下三角矩阵,本文不介绍这里的重要算法
- > correl
- GSM658287.CEL GSM658288.CEL GSM658289.CEL GSM658290.CEL
- GSM658288.CEL 0.037635566
- GSM658289.CEL 0.024346960 0.042032944
- GSM658290.CEL 0.024480935 0.040669995 0.025292084
- GSM658291.CEL 0.035538210 0.039284603 0.067154783 0.048204704
- GSM658292.CEL 0.072405758 0.050517381 0.059166892 0.059722043
- GSM658293.CEL 0.060155354 0.060391062 0.041925320 0.043643727
- GSM658294.CEL 0.036793132 0.029287344 0.069763710 0.059879668
- GSM658295.CEL 0.037397535 0.030773204 0.072159149 0.060667121
- GSM658296.CEL 0.068689147 0.031698616 0.068728603 0.065111592
- GSM658291.CEL GSM658292.CEL GSM658293.CEL GSM658294.CEL
- GSM658288.CEL
- GSM658289.CEL
- GSM658290.CEL
- GSM658291.CEL
- GSM658292.CEL 0.074867692
- GSM658293.CEL 0.085559588 0.019655239
- GSM658294.CEL 0.023287164 0.059198270 0.071436194
- GSM658295.CEL 0.028215326 0.065728329 0.075385956 0.007874206
- GSM658296.CEL 0.059225037 0.046602561 0.059663628 0.044584172
- GSM658295.CEL
- GSM658288.CEL
- GSM658289.CEL
- GSM658290.CEL
- GSM658291.CEL
- GSM658292.CEL
- GSM658293.CEL
- GSM658294.CEL
- GSM658295.CEL
- GSM658296.CEL 0.048650173
- method <-
- n <- as.integer(attr(correl, "Size"))
- len <- as.integer(n * (n - )/)
- members <- rep(, n)
- storage.mode(correl) <- "double"
- hcl <- .Fortran("hclust",
- n = n,
- len = len,
- method = as.integer(method),
- ia = integer(n),
- ib = integer(n),
- crit = double(n),
- members = as.double(members),
- nn = integer(n),
- disnn = double(n),
- flag = logical(n),
- diss = correl)
- hcass <- .Fortran("hcass2",
- n = n,
- ia = hcl$ia, ib = hcl$ib,
- order = integer(n),
- iia = integer(n),
- iib = integer(n))
- tree <- list(merge = cbind(hcass$iia[1L:(n - )],
- hcass$iib[1L:(n - )]),
- height = hcl$crit[1L:(n - )],
- order = hcass$order,
- labels = attr(d, "Labels"),
- method = "ward",
- dist.method = "cor")
- 输出结果:
- > hcl$crit[1L:(n - )] ## 高度
- [] 0.007874206 0.019655239 0.024346960 0.025066360 0.031698616 0.031710258
- [] 0.065868858 0.103249166 0.137220473
- > hcass$iia[1L:(n - )]
- [] - - - - - -
- > hcass$iib[1L:(n - )]
- [] - - - -
- > hcass$order
- []
解析:
一、10个样品原来的顺序:
- "GSM658287.CEL", ## 第1个
- "GSM658288.CEL", ## 第2个
- "GSM658289.CEL", ## 第3个
- "GSM658290.CEL", ## 第4个
- "GSM658291.CEL", ## 第5个
- "GSM658292.CEL", ## 第6个
- "GSM658293.CEL", ## 第7个
- "GSM658294.CEL", ## 第8个
- "GSM658295.CEL", ## 第9个
- "GSM658296.CEL" ## 第10个
按照hcass$order的顺序重新排列,就会得到:
- "GSM658288.CEL", ## 第2个
- "GSM658296.CEL", ## 第10个
- "GSM658291.CEL", ## 第5个
- "GSM658294.CEL", ## 第8个
- "GSM658295.CEL", ## 第9个
- "GSM658292.CEL", ## 第6个
- "GSM658293.CEL", ## 第7个
- "GSM658290.CEL", ## 第4个
- "GSM658287.CEL", ## 第1个
- "GSM658289.CEL", ## 第3个
这刚好是聚类图像里的样品顺序
二、再看看iia和iib:
- iia iib
- - -
- - -
- - -
- -
- - -
- -
1)第一步的iia是-8,iib是-9,如果iia或者iib的值是负数的话,说明它所代表的样品是聚类树最底层的子树的分支,我们把第8个样品和第九个样品连接起来,高度取hcl$crit的第一个值0.007874206,得到:
- "GSM658288.CEL" ##
- "GSM658296.CEL" ##
- "GSM658291.CEL" ##
- "GSM658294.CEL" ## --|
- "GSM658295.CEL" ## --|
- "GSM658292.CEL" ##
- "GSM658293.CEL" ##
- "GSM658290.CEL" ##
- "GSM658287.CEL" ##
- "GSM658289.CEL" ##
2)根据第2步的-6、-7和第三行的-1、-3,我们把第6个样品和第7个样品连接起来,取高度0.019655239,把第1个样品和第3个样品连接起来,取高度0.024346960:
- "GSM658288.CEL" ##
- "GSM658296.CEL" ##
- "GSM658291.CEL" ##
- "GSM658294.CEL" ## --|
- "GSM658295.CEL" ## --|
- "GSM658292.CEL" ## ----|
- "GSM658293.CEL" ## ----|
- "GSM658290.CEL" ##
- "GSM658287.CEL" ## -----|
- "GSM658289.CEL" ## -----|
3)第4步是-4和3,意思是把第4个样品和刚刚第三步聚类的结果(也就是第1个样品和第3个样品聚类的结果)连接起来,取高度0.025066360:
- "GSM658288.CEL" ##
- "GSM658296.CEL" ##
- "GSM658291.CEL" ##
- "GSM658294.CEL" ## --|
- "GSM658295.CEL" ## --|
- "GSM658292.CEL" ## ----|
- "GSM658293.CEL" ## ----|
- "GSM658290.CEL" ## -------|
- "GSM658287.CEL" ## -----|_|
- "GSM658289.CEL" ## -----|
4)第五步是-2和-10,把第2个样品和第10个样品连接起来,取高度0.031698616:
- "GSM658288.CEL" ## --------|
- "GSM658296.CEL" ## --------|
- "GSM658291.CEL" ##
- "GSM658294.CEL" ## --|
- "GSM658295.CEL" ## --|
- "GSM658292.CEL" ## ----|
- "GSM658293.CEL" ## ----|
- "GSM658290.CEL" ## -------|
- "GSM658287.CEL" ## -----|_|
- "GSM658289.CEL" ## -----|
5)第六步是-5和1,把样品5和第一步聚类的结果连接起来,取高度0.031710258:
- "GSM658288.CEL" ## --------|
- "GSM658296.CEL" ## --------|
- "GSM658291.CEL" ## ----------|
- "GSM658294.CEL" ## --|_______|
- "GSM658295.CEL" ## --|
- "GSM658292.CEL" ## ----|
- "GSM658293.CEL" ## ----|
- "GSM658290.CEL" ## -------|
- "GSM658287.CEL" ## -----|_|
- "GSM658289.CEL" ## -----|
6)第七步是5和6,把第五步和第一步聚类的结果连接起来,取高度0.065868858:
- "GSM658288.CEL" ## --------|_____
- "GSM658296.CEL" ## --------| |
- "GSM658291.CEL" ## ----------|___|
- "GSM658294.CEL" ## --|_______|
- "GSM658295.CEL" ## --|
- "GSM658292.CEL" ## ----|
- "GSM658293.CEL" ## ----|
- "GSM658290.CEL" ## -------|
- "GSM658287.CEL" ## -----|_|
- "GSM658289.CEL" ## -----|
7)第八步连接第2步和第4步的结果,取高度0.103249166:
- "GSM658288.CEL" ## --------|_____
- "GSM658296.CEL" ## --------| |
- "GSM658291.CEL" ## ----------|___|
- "GSM658294.CEL" ## --|_______|
- "GSM658295.CEL" ## --|
- "GSM658292.CEL" ## ----|__________
- "GSM658293.CEL" ## ----| |
- "GSM658290.CEL" ## -------|_______|
- "GSM658287.CEL" ## -----|_|
- "GSM658289.CEL" ## -----|
8)第九步连接第7步和第8步的结果,取高度0.137220473:
- "GSM658288.CEL" ## --------|_____
- "GSM658296.CEL" ## --------| |____
- "GSM658291.CEL" ## ----------|___| |
- "GSM658294.CEL" ## --|_______| |
- "GSM658295.CEL" ## --| |
- "GSM658292.CEL" ## ----|___________ |
- "GSM658293.CEL" ## ----| |___|
- "GSM658290.CEL" ## -------|_______|
- "GSM658287.CEL" ## -----|_|
- "GSM658289.CEL" ## -----|
完成
15、R语言聚类树的绘图原理的更多相关文章
- R语言学习笔记2——绘图
R语言提供了非常强大的图形绘制功能.下面来看一个例子: > dose <- c(20, 30, 40, 45, 60)> drugA <- c(16, 20, 27, 40, ...
- R语言学习2:绘图
本系列是一个新的系列,在此系列中,我将和大家共同学习R语言.由于我对R语言的了解也甚少,所以本系列更多以一个学习者的视角来完成. 参考教材:<R语言实战>第二版(Robert I.Kaba ...
- R语言:ggplot2精细化绘图——以实用商业化图表绘图为例
本文版权归http://www.cnblogs.com/weibaar 本文旨在介绍R语言中ggplot2包的一些精细化操作,主要适用于对R画图有一定了解,需要更精细化作图的人,尤其是那些刚从exce ...
- R语言-聚类与分类
一.聚类: 一般步骤: 1.选择合适的变量 2.缩放数据 3.寻找异常点 4.计算距离 5.选择聚类算法 6.采用一种或多种聚类方法 7.确定类的数目 8.获得最终聚类的解决方案 9.结果可视化 10 ...
- R语言聚类方法&主要软件包-K-means
主要4中软件包 stas:主要包含基本统计函数. cluster:用于聚类分析. fpc:含聚类算法函数(固定聚类.线性回归聚类等). mclust:处理高斯分布混合模型,通过EM算法实现聚类.分类及 ...
- R语言曲线拟合函数(绘图)
曲线拟合:(线性回归方法:lm) 1.x排序 2.求线性回归方程并赋予一个新变量 z=lm(y~x+I(x^2)+...) 3.plot(x,y) #做y对x的散点图 4.lines(x ...
- R语言中文社区历史文章整理(类型篇)
R语言中文社区历史文章整理(类型篇) R包: R语言交互式绘制杭州市地图:leafletCN包简介 clickpaste包介绍 igraph包快速上手 jiebaR,从入门到喜欢 Catterpl ...
- 统计计算与R语言的资料汇总(截止2016年12月)
本文在Creative Commons许可证下发布. 在fedora Linux上断断续续使用R语言过了9年后,发现R语言在国内用的人逐渐多了起来.由于工作原因,直到今年暑假一个赴京工作的机会与一位统 ...
- 【机器学习与R语言】4-决策树
目录 1.决策树原理 2.决策树应用示例 2.1)收集数据 2.2)探索和准备数据 2.3)训练模型 2.4)评估模型性能 2.5)提高模型性能 通过自适应增强算法(boosting) 将惩罚因子分配 ...
随机推荐
- 震惊!文科生如何三个月转行成为Java工程师?
点击上方“程序员江湖”,选择“置顶或者星标” 你关注的就是我关心的! 作者:以大橘为重链接:https://www.nowcoder.com/discuss/156087 楼主是19届应届生,去年在牛 ...
- python递归获取目录下指定文件
获取一个目录下所有指定格式的文件是实际生产中常见需求. import os #递归获取一个目录下所有的指定格式的文件 def get_jsonfile(path,file_list): dir_lis ...
- MemoScope.Net
What is MemoScope.Net ? It's a tool to analyze .Net process memory: it can dump an application's mem ...
- HttpClient两种调用方式
一.参数字符串 /** * HttpClient请求接口 * @return 成功:音频字节 失败:null */ public static byte[] requestBaiduAudio(Str ...
- Haskell 安装
1.Ubuntu 安装过程中出现了一些问题: 1)W: An error occurred during the signature verification. The repository is n ...
- 阶段3 3.SpringMVC·_03.SpringMVC常用注解_4 HiddentHttpMethodFilter过滤器
此文只做了解!! 过滤器 ,了解即可 请求设置为post的方式 换成put的方式 浏览器模拟发送PUT请求 ,不大好模拟.顾虑器可以帮助我们发送不同的请求 过滤器会拿到这个请求 详情可以看文档,此处不 ...
- C++数据结构之哈希表
哈希表的定义:哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方.键可以对应多个值(即哈希冲突),值根据相应的hash公式存入对应的键中. 哈希函数的构造要求 ...
- java最常见的5个错误
1. Null 的过度使用 避免过度使用 null 值是一个最佳实践.例如,更好的做法是让方法返回空的 array 或者 collection 而不是 null 值,因为这样可以防止程序抛出 Null ...
- MongoDB 日志中出现“UserNotFound: Could not find user ceilometer@ceilometer”,如何解决?
MongoDB 日志中出现“UserNotFound: Could not find user ceilometer@ceilometer” 问题描述 MongoDB(版本 3.2.9) 服务启动后, ...
- 奶牛渡河(dp)
奶牛渡河 时间限制: 1 Sec 内存限制: 128 MB提交: 36 解决: 27[提交][状态][讨论版][命题人:外部导入][Edit] [TestData] [同步数据] 题目描述 Far ...