10X单细胞(10X空间转录组)数据分析之NMF(非负矩阵分解)

今天我们来学习一个简单的数学内容,NMF

NMF算法简介

NMF是什么?

图片
非负矩阵分解(Non-negative Matrix Factorization, NMF)本质上说是一种矩阵分解的方法,对于任意给定的一个非负矩阵V,NMF算法能够寻找到一个非负矩阵W和一个非负矩阵H,使得 V≈W*H 成立 ,从而将一个非负的矩阵分解为左右两个非负矩阵的乘积。

NMF的特点?

NMF最重要的特点是非负性约束。

矩阵分解的方法有很多种,如奇异值分解 (singular value decomposition, SVD) 、独立成分分析 (independent component analysis, ICA) 、主成分分析 (principal component analysis, PCA) 等。这些方法的共同特点是,即使初始矩阵 V 元素是非负的,分解出来的因子 W 和 H 中的元素往往含有负值元素。从计算科学的角度来看,分解出来的因子 W 和 H 中的元素含有负值元素并没有问题, 但负值元素通常是无法解释的。NMF约束了原始矩阵V和分解矩阵W、H的非负性,这就意味着只能通过特征的相加来实现原始矩阵V的还原,最终导致的结果是:
  • 非负性会引发稀疏
  • 非负性会使计算过程进入部分分解

给大家对比一下PCA与NMF分解图像的效果:

图片.png
PCA分解之后,每个主成分(PC)都会保留与其他PC不正交的全局特征,并且PC保留的特征是递减的。
图片.png
NMF分解之后,每个因子保留的都是局部特征,它们的权重是基本平等的。通过这张图可以看出,很多因子能与面部特征一一对应起来,例如鼻子、眼睛、嘴巴都能找到相应的因子。

NMF在单细胞研究中的优势

单细胞研究避免不了要回答两个问题:组织中有哪些细胞类型,每个细胞类型又有哪些表达模式?NMF解决这类问题具有天然的优势,因为它分解的因子很容易与细胞类型或表达模式对应起来。Github上有很多基于NMF和其变种算法的单细胞分析工具,我比较喜欢的有单细胞整合分析工具liger和空间转录组去卷积工具SPOTlight。应用NMF分析方法发表的高分文章也有很多,我给大家介绍一篇,更多的文章请自己搜索。

Chen, YP., Yin, JH., Li, WF. et al. Single-cell transcriptomics reveals regulators underlying immune cell diversity and immune subtypes associated with prognosis in nasopharyngeal carcinoma. Cell Res 30, 1024–1042 (2020). https://doi.org/10.1038/s41422-020-0374-x

基础NMF包的安装与用法简介

安装NMF基础包

BiocManager::install('Biobase')

nmf函数简介

NMF包通过nmf()函数实现矩阵分解,它的用法及重要参数如下:

nmf(x, rank, method, seed, nrun, ...)
rank值一般是要通过测试评估后确定的,但是分析单细胞数据这是一个很难完成的工作,5000个细胞的测试时间可能超过10个小时。替代办法是使用经验或先验知识指定,可以尝试略多于细胞类型或细胞状态(细胞亚群再聚类时)的一个数值,例如我在本帖的PBMC数据分解中就指定为rank=10。因为NMF一般是从随机数开始,通过迭代算法收敛误差的方法求出最优W和H矩阵,所以seed不同最后的结果也不同。为了减少seed的影响求得最优解,常规的办法是通过nrun参数设置运行100-200次矩阵分解选取最优值,也可以使用特殊的算法选择一个最佳的seed(设置seed='nndsvd'或seed='ica'),这样运行一次也能得到最优解。下面我们测试一下不同方法的运行时间:
library(Biobase)

10X PBMC数据实测

测试数据

测试数据来源于10x genomics官网的示例数据集。
图片
数据下载链接:https://cf.10xgenomics.com/samples/cell-exp/3.0.2/5k_pbmc_v3_nextgem/5k_pbmc_v3_nextgem_filtered_feature_bc_matrix.h5

保存文件名:pbmc.h5

基于PCA分解的降维聚类

library(Seurat)
图片
图片

基于NMF分解的降维聚类

## 高变基因表达矩阵的分解
# pbmc大体可分成T,B,NK,CD14+Mono,CD16+Mono,DC,Platelet等类型,考虑冗余后设置rank=10
vm <- pbmc@assays$RNA@scale.data
res <- nmf(vm, 10, method = "snmf/r", seed = 'nndsvd') 
runtime(res)
#    用户     系统     流逝 
#1063.147   78.019 1139.831 

## 分解结果返回suerat对象
pbmc@reductions$nmf <- pbmc@reductions$pca
pbmc@reductions$nmf@cell.embeddings <- t(coef(res))    
pbmc@reductions$nmf@feature.loadings <- basis(res)  

## 使用nmf的分解结果降维聚类
set.seed(219)
pbmc.nmf <- RunUMAP(pbmc, reduction = 'nmf', dims = 1:10) %>% 
  FindNeighbors(reduction = 'nmf', dims = 1:10) %>% FindClusters()

## 结果可视化  
p <- DimPlot(pbmc.nmf, label = T) + ggsci::scale_color_igv()
ggsave("pbmc_nmf.png", p, width = 9, height = 6)
p <- FeaturePlot(pbmc.nmf, features = c('CD3D', 'CD3E', 'MS4A1', 'CD79A', 'GNLY', 'NKG7', 'CD14', 
                                        'FCGR3A', 'PPBP', 'FCER1A', 'CD4', 'CD8A'), ncol = 4)
ggsave("pbmc_nmf_markers.png", p, width = 12, height = 8)

图片.png
图片

NMF因子可解释性探索

对比PCA分析的结果,NMF虽然毫不逊色,但是它的运行时间更长,我们为什么要用NMF呢?一个很重要的原因是NMF的因子可解释性更强,每个因子贡献度最大的基因基本代表了某种或某个状态细胞的表达模式,相比差异分析得到marker基因更有代表性。

NMF因子与细胞类型的关系

## 人工定义细胞类型
pbmc.nmf$celltype <- pbmc.nmf$seurat_clusters
pbmc.nmf$celltype <- recode(pbmc.nmf$celltype,
                            '1' = "B cells", 
                            '5' = "NKs", 
                            '10' = "CD8+ T", 
                            '6' = "CD8+ T", 
                            '4' = "CD4+ T",
                            '9' = "CD4+ T", 
                            '0' = "CD4+ T", 
                            '3' = "CD4+ T", 
                            '7' = "CD4+ T", 
                            '2' = "CD14+ Mono",
                            '8' = "CD14+ Mono", 
                            '11' = "CD16+ Mono", 
                            '12' = "DCs", 
                            '13' = "Platelet", 
                            '14' = "Unknown")
p <- DimPlot(pbmc.nmf, group.by = 'celltype', label = T, label.size = 3) + ggsci::scale_color_npg(alpha = 0.6)
ggsave("pbmc_nmf_celltype.png", p, width = 9, height = 6)

## 查看细胞因子上的荷载
tmp <- data.frame(t(coef(res)), check.names = F)
colnames(tmp) <- paste0("factor", 1:10)
pbmc.nmf <- AddMetaData(pbmc.nmf, metadata = tmp)
p <- FeaturePlot(pbmc.nmf, features = paste0("factor", 1:10), ncol = 4)
ggsave("pbmc_nmf_factors.png", p, width = 12, height = 8)

## 查看细胞主成分上的荷载
p <- FeaturePlot(pbmc.nmf, features = paste0("PC_", 1:12), ncol = 4)
ggsave("pbmc_nmf_PCs.png", p, width = 12, height = 8)
人工鉴定的细胞类型
图片
细胞在因子上的值
图片
细胞在PC轴上的值
图片.png
对比上下两张图,很容易发现NMF的因子比PCA的PC轴解释性更强。

提取celltype的signatures

## 提取每个因子贡献度最大的20个基因
f <- extractFeatures(res, 20L)
f <- lapply(f, function(x) rownames(res)[x])
f <- do.call("rbind", f)
DT::datatable(t(f))
图片

NMF的10个因子中,很容易发现我们对细胞进行分类的marker基因,是不是很神奇?

生活很好,等你超越

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容