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) 将惩罚因子分配 ...
随机推荐
- Rust格式化输出
打印操作由 https://doc.rust-lang.org/std/fmt/ 里面所定义的一系列宏来处理,包括: format!:将格式化文本写到字符串(String).(译注:字符串是返 回值不 ...
- svn 同步备份的所有问题,亲测可用
svnsync 异地同步收获 (2010-07-06 10:06:19) 转载▼ 标签: 杂谈 分类: svn svnsync 异地同步收获: 来自:我用Subversion - http://www ...
- Joda-DateTime Date 与 String 相互转换
[参考文章]:Joda-Time 的 DateTimeFormat 问题 public class DateFormatUtils { /** HH 必须大写 */ public static fin ...
- ajax 415
ajax 发送post请求是出现415错误,是ajax的格式有问题,如下. $.ajax({ type: 'POST', url: '/login', data: { "username&q ...
- cin.clear()与cin.sync()的使用
cin.clear()与cin.sync()使用是有先后顺序的. 他们的作用: cin.clear(); //将流中的所有状态都重设为有效值 cin.sync();//清空流 在输入错误的情况下,如果 ...
- LeetCode 179. 最大数(Largest Number)
题目描述 给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数. 示例 1: 输入: [10,2] 输出: 210 示例 2: 输入: [3,30,34,5,9] 输出: 9534330 说明: ...
- JScript 对字符串、数组处理的常用方法
1.anchor 方法 在对象中的指定文本两端放置一个有 NAME 属性的 HTML 锚点. strVariable.anchor(anchorString) var strVariable ...
- java用Annotation注入到成员Bean对象
java用Annotation注入到成员Bean对象 在使用一些java框架的时候,经常看到一些注解,而且使用注解之后就可以免去一些xml的繁琐配置,本文记录如何通过注解获得成员Bean对象. 一.首 ...
- Vue-2:官方教程学习
1,先把下面这些内容都按照官方教程敲一遍,打好基础,类似于“前戏”,其作用我想爸爸就不必多说了吧(づ。◕‿‿◕。)づ. https://cn.vuejs.org/v2/guide/ 同时可以配合配套视 ...
- JS中在当前日期上追加一天或者获取上一个月和下一个月
/** * 获取上一个月 * * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 */ function getPreMonth(date) { var arr = date. ...