生信算法生信笔记

层次聚类分析案例(三)

2019-11-15  本文已影响0人  11的雾

之前的笔记:
聚类介绍:点这里
层次聚类分析案例(一)
层次聚类分析案例(二)

案例三:基因聚类

获取全基因组表达数据的能力是一项计算复杂度非常高的任务。由于人脑的局限性,是无法解决这个问题。但是,通过将基因分类进数量较少的类别后再进行分析,就能将基因数据加工到更易理解的水平。

聚类的目标是将一组基因进行划分,使相似的基因落入同一个簇,同时不相似的基因落入不同的簇。这里需要考虑的关键问题是如何定义相似性,以及处理已分类基因。这里我们使用两种基因类型的感光性来探索基因聚类问题。

准备工作

为了进行层次聚类,我们使用从实验鼠身上采集的数据集。

第1步:收集和描述数据

该任务使用名为GSE4051_data和GSE4051_design的数据集。该数据集以标准格式存储在名为GSE4051_data.csv和GSE4051_design.csv的CSV格式的文件中。数据获取路径: 在这里

GSE4051_data数据集包含29949行数据和39个变量。数值型变量如下:

GSE4051_design数据集包含39行数据和4个变量。数值型变量是:sidNum
非数值型变量是:sidChar;devStage;gType;

具体实施步骤以下为实现细节。

第2步:探索数据

RColorBrewer包是一个R包,可从http://colorbrewer2.org获取,它提供地图和其他图形的彩色模板。

pvclust包用来实现非确定性的层次聚类分析。在层次聚类中,每个簇通过多尺度有放回抽样计算p值。一个簇的p值在0~1之间。p值有两种类型:近似无偏(approximately unbiased,AU)和有放回概率(bootstrap probability,BP)值。AU p值通过多尺度有放回采样方法计算,经典的有放回采样方法用来计算BP p值。AU p值相比BP p值存在优效性偏见。

xtable包可以生成LaTeX格式的表格。使用xtable可以将特定的R对象转换成xtables。这些xtables能够以LaTeX或HTML的格式输出。

plyr包被用来进行分置合并(split-apply-combine,SAC)过程。它将一个大的问题切分成易处理的小块,在每个小块上进行操作,然后将所有小块合并起来。

载入以下包:

library(RColorBrewer)
library(cluster)
library(pvclust)
library(xtable)
library(plyr)

让我们探索并理解变量间的关系。从导入名为GSE4051_data.csv的CSV文件开始。我们将该文件数据存储到GSE4051_data数据框中:

GSE4051_data = read.csv("ClusteringAnalysis/Practical-Machine-Learning-Cookbook/Chapter03/Data/GSE4051_data.csv",header = T)

接下来,输出GSE4051_data数据框的信息。str()函数返回GSE4051_data的结构信息。它简略显示了GSE4051_data数据框的内部结构。max.level指明了为了显示网状结构的最大等级。

str(GSE4051_data, max.level = 0)

结果如下:


下面,我们导入名为GSE4051_design.csv的CSV文件,将其数据保存到GSE4051_design数据框中:

GSE4051_design = read.csv("ClusteringAnalysis/Practical-Machine-Learning-Cookbook/Chapter03/Data/GSE4051_design.csv",header = T)

输出GSE4051_design数据框的内部结构。

str(GSE4051_design)

结果如下:


第3步:转换数据

为了便于后续的可视化阶段,需要对每一行数据进行拉伸操作。这是由于在目前的要求下,不同基因表达之间存在绝对值的差距,因此需要对每一行数据进行拉伸。

中心化变量和创建z值是两个常见的数据分析方法。scale函数中心化并拉伸数值型矩阵的列。

变换矩阵。传入GSE4051_data数据框用t()函数进行数据框变换。

trans_GSE4051_data <- t(scale(t(GSE4051_data)))

接下来,我们输出GSE4051_data数据框的信息。通过设置give.attr=FALSE,次级结构的属性不会被显示。

str(trans_GSE4051_data,max.level=0, give.attr = FALSE)

结果如下:

num [1:29949, 1:39] 0.0838 0.1758 0.7797 -0.3196 0.8358 ...

round()函数用于舍入到最接近的整数。语法形式只有1种:Y = round(X),这里的X可以是数,向量,矩阵,输出对应。

head()函数返回一个向量、矩阵、表、数据框或函数的头部。GSE4051_data和trans_GSE4051_data数据框被当作对象传入。rowMeans()函数计算每列的平均值。data.frame()函数创建数据框耦合变量集合,并且共享许多指标的性质:

round(data.frame(avgBefore = rowMeans(head(GSE4051_data)),
avgAfter = rowMeans(head(trans_GSE4051_data)),
varBefore = apply(head(GSE4051_data),1,var),
varAfter = apply(head(trans_GSE4051_data),1,var)),2)

结果如下:


第4步:训练模型

接下来是训练模型。第一步是计算距离矩阵。dist()函数用来计算并返回距离矩阵,可以使用特定的距离度量方法来计算数据矩阵中各行间的距离。这里可使用的距离度量方法有欧式距离、最大距离、曼哈顿距离、堪培拉距离、二进制距离,或闵可夫斯基距离。这里使用欧式距离。欧式距离计算两个向量间的距离公式为sqrt(sum((x_i-y_i)^2))。转换后的trans_GSE4051_data数据框被用来计算距离。结果存储在pair_dist_GSE4051_data数据框中。

pair_dist_GSE4051_data <- dist(t(trans_GSE4051_data),method = "euclidean")

接下来,使用interaction()函数计算并返回gType、devStage变量间相互作用的无序因子。无序因子的结果连同GSE4051_design数据框一同被传入with()函数。该函数计算产生一个新的因子代表gType、devStage变量的相互作用:

GSE4051_design$group <- with(GSE4051_design,interaction(gType,devStage))

summary()函数用来生成GSE4051_design$group数据框的结果总结:

summary(GSE4051_design$group)

结果如下:


下面,使用多种不同的联合类型计算层次聚类。

使用hclust()函数对n个不同对象进行聚类分析。第一个阶段,每个对象被指派给自己的簇。算法在每个阶段迭代聚合两个最相似的簇。持续该过程直到只剩一个单独的簇。hclust()函数要求我们以距离矩阵的形式提供数据。pair_dist_GSE4051_data数据框被传入。

在第一个例子中使用single聚类方法:

pr.hc.single <- hclust(pair_dist_GSE4051_data,method = "single")
pr.hc.single的调用结果是现实使用的聚集方法、距离计算方法和对象数量:
pr.hc.single

结果如下:


在第二个例子中使用complete聚集方法。

pr.hc.complete <- hclust(pair_dist_GSE4051_data,method = "complete")

调用pr.hc.complete的结果是显示所使用的聚集方法、距离计算方法和对象数量:

pr.hc.complete

结果如下:


在第三个例子中使用average聚类方法:

pr.hc.average <- hclust(pair_dist_GSE4051_data,method = "average")
pr.hc.average

调用pr.hc.complete的结果是显示所使用的聚集方法、距离计算方法和对象数量:
结果如下:


在第四个例子中使用ward聚类方法:

pr.hc.ward <- hclust(pair_dist_GSE4051_data,method = "ward.D2")
pr.hc.ward

pr.hc.ward的调用结果是显示所使用的聚集方法、距离计算方法和对象数量:
结果如下:


plot()函数是绘制R对象的通用函数。

第一次调用plot()函数,传递pr.hc.single数据框作为输入对象:

plot(pr.hc.single,labels=FALSE, main="Single Linkage Representation", xlab="")

结果如下:


第二次调用plot()函数,传入pr.hc.complete数据框作为输入对象:

plot(pr.hc.complete,labels=FALSE, main="Complete Linkage Representation", xlab="")

结果如下:


第三次调用plot()函数,传入pr.hc.average数据框作为输入对象:

plot(pr.hc.average, labels=FALSE, main="Arverage Linkage Representation", xlab="")

结果如下:


第四次调用plot()函数,传入pr.hc.ward数据框作为输入对象:

plot(pr.hc.ward, labels=FALSE, main="Ward Linkage Representation", xlab="")

结果如下:


第5步:绘制模型

plot()函数是绘制R对象的通用函数。这里,plot()函数用来绘制系统树图。
rect.hclust()函数强调不同的簇,并在系统树图的枝干上绘制长方形。系统树图首先在某个等级上被剪切,之后在选定的枝干上绘制长方形。
RColorBrewer使用从http://colorbrewer2.org获得的包来选择绘制R图像的颜色模板。
颜色分为三组:

最重要的一个RColorBrewer函数是brewer.pal()。通过向该函数传入颜色的数量和配色的名字,可以从display.brewer.all()函数中选择一个配色方案。
在第一个例子中,pr.hc.single作为一个对象传入plot()函数:

plot(pr.hc.single, labels = GSE4051_design$group, cex = 0.6, main = "Single Hierarchical Cluster - 10 clusters")
rect.hclust(pr.hc.single,k=10)

结果如下:


下面创建热度图,使用single聚集方法。heatmap()函数默认使用euclidean聚集方法:

op <- par(mar=c(1,4,4,1))
par(op)
jGraysFun <- colorRampPalette(brewer.pal(n=9, "Blues"))
gTypeCols <- brewer.pal(9,"Spectral")[c(4,7)]

heatmap(as.matrix(trans_GSE4051_data),Rowv = NA, col = jGraysFun(256),
    hclustfun = function(x) hclust(x, method = 'single'),
    scale = "none", labCol = GSE4051_design$group, labRow = NA, margins = c(8,1),
    ColSideColors = gTypeCols[unclass(GSE4051_design$gType)])
legend("topright",legend=levels(GSE4051_design$gType),col = gTypeCols, lty = 1, lwd = 5, cex = 0.5)

结果如下:


image.png

在第二例子中,pr.hc.complete作为对象传入plot()函数:

plot(pr.hc.complete, labels = GSE4051_design$group, cex = 0.6, main = "Complete Hierarchical Cluster - 10 clusters")
rect.hclust(pr.hc.complete,k=10)

结果如下:


下面使用complete聚集方法创建热度图:

par(op)
jGraysFun <- colorRampPalette(brewer.pal(n=9, "Greens"))
gTypeCols <- brewer.pal(11,"PRGn")[c(4,7)]

heatmap(as.matrix(trans_GSE4051_data),Rowv = NA, col = jGraysFun(256),
        hclustfun = function(x) hclust(x, method = 'complete'),
        scale = "none", labCol = GSE4051_design$group, labRow = NA, margins = c(8,1),
        ColSideColors = gTypeCols[unclass(GSE4051_design$gType)])

legend("topright",legend=levels(GSE4051_design$gType),col = gTypeCols,
       lty = 1, lwd = 5, cex = 0.5)

结果如下:


在第三个例子中,pr.hc.average作为对象传入plot()函数:

plot(pr.hc.average, labels = GSE4051_design$group, cex = 0.6, main = "Average Hierarchical Cluster - 10 clusters")
rect.hclust(pr.hc.average, k=10)

结果如下:


下面创建average聚集方法的热度图:

jGraysFun <- colorRampPalette(brewer.pal(n=9, "Oranges"))
gTypeCols <- brewer.pal(9,"Oranges")[c(4,7)]

heatmap(as.matrix(trans_GSE4051_data),Rowv = NA, col = jGraysFun(256),
        hclustfun = function(x) hclust(x, method = 'average'),
        scale = "none", labCol = GSE4051_design$group, labRow = NA, margins = c(8,1),
        ColSideColors = gTypeCols[unclass(GSE4051_design$gType)])

legend("topright",legend=levels(GSE4051_design$gType),col = gTypeCols,
       lty = 1, lwd = 5, cex = 0.5)

结果如下:


在第四个例子中,pr.hc.ward作为对象传入plot()函数:

plot(pr.hc.ward, labels = GSE4051_design$group,
      cex = 0.6, main = "Ward Hierarchical Cluster - 10 clusters")
rect.hclust(pr.hc.ward,k=10)

结果如下:


下面绘制ward聚集方法的热度图:

jGraysFun <- colorRampPalette(brewer.pal(n=9, "Reds"))
gTypeCols <- brewer.pal(9,"Reds")[c(4,7)]

heatmap(as.matrix(trans_GSE4051_data),Rowv = NA, col = jGraysFun(256),
        hclustfun = function(x) hclust(x, method = 'ward.D2'),
        scale = "none", labCol = GSE4051_design$group, labRow = NA, margins = c(8,1),
        ColSideColors = gTypeCols[unclass(GSE4051_design$gType)])

legend("topright",legend=levels(GSE4051_design$gType),col = gTypeCols,
       lty = 1, lwd = 5, cex = 0.5)

结果如下:


上一篇下一篇

猜你喜欢

热点阅读