如果你在发表的研究中使用ANF,请引用:

马天乐,张爱东,基于亲和网络融合的多组学数据聚类,https://arxiv.org/abs/1708.07136

ANF包的基本用法(合成数据演示)

在下面,让我们首先生成一个合成数据集,并使用它来演示ANF的基本用法。

对于具有多视图数据的复杂对象(例如患者),我们可以使用一个特征矩阵来表示每个视图。例如,基因表达矩阵和miRNA表达矩阵可以代表患者的两种观点。

下图中,特征矩阵的行表示对象,列表示特征。注意每个特征矩阵都包含一个特征空间(对应一个视图)中的许多特征。我们可以将所有功能连接在一起,稍后我们将进行实验。然而,由于来自不同特征空间的特征通常是异构的,所以先在自己的特征空间中分析它们,然后再组合结果可能是一个好主意。这就是ANF的基本工作原理。

生成200个样本的第一个视图(特征矩阵)

为了简单起见,让我们生成第一个视图(matrixfeature1)的200个样本:100个样本用于第一类(矩阵的前100行feature1),类2的100个样本(矩阵的最后100行feature1),采用多变量高斯分布。

library(MASS) true.class = rep(c(1,2),each=100)特征。Mat1 = mvrnorm(100, rep(0,20), diag(runif(20,0.2,2))))特征。Mat2 = mvrnorm(100, rep(0.5, 20), diag(runif(20,0.2,2))) feature1 = rbind(特征。mat1 feature.mat2)

仅基于第一个视图的KMeans和谱聚类

让我们执行KMeans聚类。归一化互信息(NMI)只有0.26。

Library (igraph) set.seed(1) km = kmeans(feature1, 2) compare(km$cluster, true.class, method='nmi')
## [1] 0.06263221

让我们使用ANF包中的函数来执行谱聚类。NMI为0.29,略高于KMeans。

library(ANF) d= dist(feature1) d= as.matrix(d) A1 = affinity_matrix(d, 10) labels = spectral_clustering(A1, 2) compare(labels, true.class, method='nmi')
## [1] 0.1742617

为上述200个样本生成第二个视图(特征矩阵)

与第一个视图类似,我们可以生成第二个视图(matrixfeature2).一排排的feature1而且feature2保持一对一的通信。

特性。Mat1 = mvrnorm(100, rep(10, 30), diag(runif(30,0.2,3)))特征。Mat2 = mvrnorm(100, rep(9.5, 30), diag(runif(30,0.2,3))) feature2 = rbind(特征。mat1 feature.mat2)

仅基于第二种观点的KMeans和谱聚类

同样,KMeans聚类和谱聚类的NMI分别为0.14(可能因为随机初始化而有所不同)和0.19。

Set.seed (123) km = kmeans(feature2, 2) compare(km$cluster, true.class, method='nmi')
## [1] 0.1084515
d= dist(feature2) d= as.matrix(d) A2 = affinity_matrix(d, 10) labels = spectral_clustering(A2, 2) compare(labels, true.class, method='nmi')
## [1] 0.3045581

连接来自两个视图的所有特征并执行KMeans聚类(NMI = 0.58)

特性。Cat = cbind(feature1, feature2) set.seed(1) km = kmeans(feature. 2)Cat, 2) compare(km$cluster, true.class, method='nmi')
## [1] 0.58208

使用ANF进行聚类(NMI = 0.76)

ANF在连接特征上的表现优于KMeans

W = ANF(list(A1, A2), K=30) label = spectral_clustering(W,2) compare(labels, true.class, method='nmi')
## [1] 0.7594266

将ANF应用于TCGA协调数据集

加载数据

HarmonizedTCGAData包(https://github.com/BeautyOfWeb/HarmonizedTCGAData)包含三个R对象:project_ids而且surv.plot

包含复杂列表关联矩阵。事实上,列表(六种特征归一化类型)的列表(五种癌症类型):raw.allraw.sellog.alllog.selvst.sel归一化)的列表(三个特征空间或视图:fpkmmicrorna的,methy450)的矩阵。每个矩阵的行名为病例id(即病人id),每个矩阵的列名为aliquot id(以病例id为前缀)。

project_ids是将case_id(表示患者)映射到project_id(一一对应疾病类型)的命名字符向量。这用于评估聚类结果,如计算归一化互信息(NMI)和调整Rand指数(ARI)。

surv.plot是一个包含用于生存分析的患者生存数据的data.frame,提供了一种“间接”的方法来评估聚类结果。

HarmonizedTCGAData包包含有关上述三个数据对象的更多详细信息以及如何使用它们的简单示例。我们建议用户阅读的插图HarmonizedTCGAData首先,因为它涵盖了更简单的使用示例曾帮工而且HarmonizedTCGAData包。

在接下来的文章中,我们主要将重点放在重现该论文的结果上https://arxiv.org/abs/1708.07136下面的代码可能比简单使用更难理解曾帮工包中。

library(ExperimentHub) eh <- ExperimentHub() myfiles <- query(eh, "HarmonizedTCGAData") Wall <- myfiles[[1]] project_ids <- myfiles[[2]] surv. .Plot <- myfiles[[3]]

使用亲和矩阵的谱聚类

我们可以对病人亲和矩阵进行谱聚类。以肾上腺癌为例。我们可以使用来自差异表达基因原始计数的log2转换的亲和矩阵对患者进行聚类。

亲和力。mat <- Wall[[" adrenaline - gland"]]][["log. log.]Sel "]][["fpkm"]]标签<- spectral_clustering(affinity。Mat, k = 2)

因为我们知道真实的疾病类型,对应于项目idproject_ids,我们可以计算NMI和ARI。

True.disease.types <- as.factor(project_ids[rownames(affinity.mat)]) table(标签,True.disease.types)
## true.disease.types ##标签TCGA-ACC TCGA-PCPG ## 1 0 176 ## 2 76
Nmi <- igraph::compare(true.disease。类型,标签,方法= "nmi")调整。Rand =引文::比较(真。疾病。类型,标签,方法= "adjusted.rand") #我们也可以计算p值使用' surv。图数据调查。plot <- survey .plot[rownames(affinity.mat),] f <- survival::Surv(Surv . sum)。Plot $time, ! survey . Plot $) fit <- survival::survdiff(f ~ labels) pval <- stats::pchisq(fit$chisq, df = length(fit$n) - 1, lower。tail = FALSE)消息(粘贴("NMI =", NMI, ", ARI =", adjusted.)Rand, ", p-val =", pval))

在这个包中,我们提供了一个函数eval_clu简化了上述从谱聚类到计算NMI、ARI和p值的过程。这里有一个如何使用的例子eval_clu

Res <- eval_clu(project_ids, w = affinity。Mat, surv = survey .plot)
##标签## true_class 1 2 ## TCGA-ACC 0 76 ## TCGA-PCPG 176

对于肾上腺癌,我们使用这种亲和矩阵仅在253例患者中错分了1例。这是一个很好的结果(事实上,这是我们能达到的最好结果。用户可以尝试使用其他矩阵并比较结果)。然而,在许多情况下,使用单一的亲和矩阵在将患者划分为正确的疾病类型方面做得很“糟糕”。以子宫癌为例(NMI接近0)。

res <- eval_clu(project_ids, w = Wall$子宫$raw.all$fpkm)
##标签## true_class 1 2 ## TCGA-UCEC 153 268 ## TCGA-UCS 3 51

使用ANF融合多个亲和矩阵进行患者聚类

我们可以使用ANF“融合”多个亲和矩阵,而不是使用一个亲和矩阵,然后对融合的亲和矩阵进行谱聚类。

让我们以子宫癌为例。

#融合三个矩阵:“fpkm”(基因表达),“mirnas”(miRNA表达)和“甲基450”(DNA甲基化)融合。mat <- ANF(Wall = Wall$uterus$raw.all) #融合患者亲和矩阵标签上的谱聚类<- spectral_clustering(A = fused. all)Mat, k = 2)# Or we can directly evaluate clustering results using function `eval_clu`, which calls `spectral_clustering` and calculate NMI and ARI (and p-value if patient survival data is available. `surv.plot` does not contain information for uterus cancer patients) res <- eval_clu(true_class = project_ids[rownames(fused.mat)], w = fused.mat)
##标签## true_class 1 2 ## TCGA-UCEC 410 11 ## TCGA-UCS 14 40

现在NMI是0.485。聚类结果明显优于使用单个专利亲和矩阵。这证明了ANF的力量。

在本文中,我们主要使用ANF来得到结果:https://arxiv.org/abs/1708.07136再现结果,请参阅https://github.com/BeautyOfWeb/Clustering-TCGAFiveCancerTypes/blob/master/vignettes/ANF%20for%20Cancer%20Patient%20Clustering.Rmd(最后一节)。