NMF层次聚类

微信:基于R语言利用NMF(非负矩阵分解)替代层次聚类进行肿瘤分型
层次聚类最后是将样本根据表达量进行了分类,可以用于样本的分型,但是不能用于基因分cluster。

#加载文件
rt=read.table("normal.txt",sep="\t",header=T,check.names=F)
#基因去重
library(limma)
rt=as.matrix(rt)
rownames(rt)=rt[,1]
exp=rt[,2:ncol(rt)]
dimnames=list(rownames(exp),colnames(exp))
data=matrix(as.numeric(as.matrix(exp)),nrow=nrow(exp),dimnames=dimnames)
data=avereps(data)
data<-as.data.frame(data)
nrow(data)
data=data[rowMeans(data)>0.5,]
#行是基因,列是样本
dim(data) #11890个基因,6个样本

##数据读取完成,选择方差大于1/4的基因
m.vars=apply(data,1,var)
data.upper=data[which(m.vars>quantile(m.vars, probs = seq(0, 1,0.25))[4]),]
dim(data.upper)
write.table(data.upper,file="data_variancetop0.25.txt",sep='\t',quote=F,row.names=T)


#NMF方法用的是brunet,迭代次数=50,ranks为2到10。
library(NMF)
coad.log2fpkm.enengy <- data.upper
ranks <- 2:10
#rank就是分几群,nrun是迭代次数,method默认就是brunet
estim.coad <- nmf(coad.log2fpkm.enengy,ranks, nrun=50,.options=list(keep.all=TRUE))
duplicated(colnames(coad.log2fpkm.enengy))
#选择合适的rank,文章用了三个指标:cophenetic, dispersion 和silhouette
#判断最佳rank值的准则就是,cophenetic值随K变化的最大变动的前点,
#上面结果中cophenetic值在rank为3时是第一个变化最大的拐点,
plot(estim.coad)


#再次NMF,rank=3
seed = 2020820
nmf.rank4 <- nmf(coad.log2fpkm.enengy, 
                 rank = 3, 
                 nrun=50,
                 seed = seed, 
                 method = "brunet")

#绘制分群热图
#设置颜色
jco <- c("#2874C5","#EABF00","#C6524A","#868686")
index <- extractFeatures(nmf.rank4,"max") 
sig.order <- unlist(index)
NMF.Exp.rank4 <- coad.log2fpkm.enengy[sig.order,]
NMF.Exp.rank4 <- na.omit(NMF.Exp.rank4) #sig.order有时候会有缺失值
group <- predict(nmf.rank4) # 提出亚型

group#这是把样本进行分群
table(group)
consensusmap(nmf.rank4,
             labRow = NA,
             labCol = NA,
             annCol = data.frame("cluster"=group[colnames(NMF.Exp.rank4)]),
             annColors = list(cluster=c("1"=jco[1],"2"=jco[2],"3"=jco[3],"4"=jco[4])))

data
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容