考虑空间位置的通讯分析手段---CellphoneDB(V3.0)

新的一周,新的开始,今天我们来分享一个cellphoneDB的升级版,CellphoneDB的V3.0版本,升级的最大改进在于服务于空间转录组的通讯分析,会结合空间位置和生态位进行有效通讯的识别和判断,我们来看一下。

关于CellphoneDB,大家应该都不陌生,目前做通讯分析引用率最高的软件,之前的版本升级到2之前都是服务于单细胞的数据分析的,但是现在作者将软件升级到3,就是将空间转录组纳入分析,非常棒的想法和运用,参考文章在Mapping the temporal and spatial dynamics of the human endometrium in vivo and in vitro,2021年12月份发表于Nature Genetics,IF38.330,文献的内容我们下一篇再分享,这一片我们专注于CellphoneDB(V3.0)。

CellphoneDB(V3.0)的创新点

  • 合并空间信息 CellPhoneDB 现在允许通过微环境文件合并细胞的空间信息。 这是一个两列文件,指示哪种细胞类型在哪个空间微环境中(参见示例见下图)。 CellphoneDB 将使用此信息来定义可能的交互细胞对(即在微环境中共享/共存的集群对)。 可以使用 cell2location(关于cell2location分享了多次,大家可以参考文章 10X单细胞和空间联合分析的方法---cell2location,10X单细胞空间联合分析之再次解读cell2location 定义具有先验知识、成像或 Visium 分析的微环境。
cell_type microenviroment
epi_Ciliated Proliferative
epi_Pre-ciliated Proliferative
epi_SOX9_LGR5 Proliferative
epi_SOX9_prolif Proliferative
epi_SOX9 Proliferative
Fibroblast eS Proliferative
Lymphoid Proliferative
Myeloid Proliferative
Fibroblast C7 Proliferative
epi_Ciliated Secretory
epi_Lumenal 1 Secretory
epi_Lumenal 2 Secretory
epi_Glandular Secretory
epi_Glandular_secretory Secretory
Fibroblast dS Secretory
Lymphoid Secretory
epi_SOX9 Secretory
Fibroblast C7 Secretory
Myeloid Secretory
  • 添加了新的分析方法,使用差异表达基因 (DEG) 而不是 random shuffling(cellphonedb 方法 degs_analysis)。 这种方法将选择所有基因都由高于--阈值的一小部分细胞表达并且至少一个基因是 DEG 的相互作用。 可以使用喜欢的工具识别 DEG,并通过文本文件将信息提供给 CellphoneDB。 第一列应该是细胞类型/cluster,第二列应该是相关的基因 id。 其余列将被忽略(参见示例见下表)。 这里提供了为 Seurat 和 Scanpy 的参考示例。
图片.png
  • Database update WNT pathway has been further curated.
图片.png

先来看看R版本的分析(联合Seurat)

library(Seurat)
library(SeuratObject)
library(Matrix)
so = readRDS('endometrium_example_counts_seurat.rds')
writeMM(so@assays$RNA@counts, file = 'endometrium_example_counts_mtx/matrix.mtx')
# save gene and cell names
write(x = rownames(so@assays$RNA@counts), file = "endometrium_example_counts_mtx/genes.tsv")
write(x = colnames(so@assays$RNA@counts), file = "endometrium_example_counts_mtx/barcodes.tsv")

so@meta.data$Cell = rownames(so@meta.data)
df = so@meta.data[, c('Cell', 'cell_type')]
write.table(df, file ='endometrium_example_meta.tsv', sep = '\t', quote = F, row.names = F)


## OPTION 1 - compute DEGs for all cell types
## Extract DEGs for each cell_type
# DEGs <- FindAllMarkers(so, 
#                        test.use = 'LR', 
#                        verbose = F, 
#                        only.pos = T, 
#                        random.seed = 1, 
#                        logfc.threshold = 0.2, 
#                        min.pct = 0.1, 
#                        return.thresh = 0.05)


# OPTION 2 - optional - Re-compute  hierarchical (per lineage) DEGs for Epithelial and Stromal lineages
DEGs = c()
for( lin in c('Epithelial', 'Stromal') ){
    message('Computing DEGs within linage ', lin)
    so_in_lineage = subset(so, cells = Cells(so)[ so$lineage == lin ] )
    celltye_in_lineage = unique(so$cell_type[ so$lineage == lin ])
    DEGs_lin = FindAllMarkers(so_in_lineage,
                       verbose = F, 
                       only.pos = T, 
                       random.seed = 1, 
                       logfc.threshold = 0, 
                       min.pct = 0.1, 
                       return.thresh = 0.05)
    DEGs = rbind(DEGs_lin, DEGs)
}


fDEGs = subset(DEGs, p_val_adj < 0.05 & avg_logFC > 0.1)

# 1st column = cluster; 2nd column = gene 
fDEGs = fDEGs[, c('cluster', 'gene', 'p_val_adj', 'p_val', 'avg_logFC', 'pct.1', 'pct.2')] 
write.table(fDEGs, file ='endometrium_example_DEGs.tsv', sep = '\t', quote = F, row.names = F)

Run cellphoneDB

cellphonedb method degs_analysis  \
    endometrium_example_meta.tsv  \
    endometrium_example_counts_mtx  \
    endometrium_example_DEGs.tsv  \
    --microenvs endometrium_example_microenviroments.tsv  \ #optional
    --counts-data hgnc_symbol  \
    --database database/database/cellphonedb_user_2021-06-29-11_41.db \
    --threshold 0.1

python版本的分析

import numpy as np
import pandas as pd
import scanpy as sc
import anndata
import os
import sys
from scipy import sparse

sc.settings.verbosity = 1  # verbosity: errors (0), warnings (1), info (2), hints (3)
sys.executable
adata = sc.read('endometrium_example_counts.h5ad')
df_meta = pd.DataFrame(data={'Cell':list(adata.obs.index),
                             'cell_type':[ i for i in adata.obs['cell_type']]
                            })
df_meta.set_index('Cell', inplace=True)
df_meta.to_csv('endometrium_example_meta.tsv', sep = '\t')

# Conver to dense matrix for Seurat
adata.X = adata.X.toarray()

import rpy2.rinterface_lib.callbacks
import logging
# Ignore R warning messages
#Note: this can be commented out to get more verbose R output
rpy2.rinterface_lib.callbacks.logger.setLevel(logging.ERROR)
import anndata2ri
anndata2ri.activate()
%load_ext rpy2.ipython

%%R -o DEGs

library(Seurat)
so = as.Seurat(adata, counts = "X", data = "X")
Idents(so) = so$cell_type

## OPTION 1 - compute DEGs for all cell types
## Extract DEGs for each cell_type
# DEGs <- FindAllMarkers(so, 
#                        test.use = 'LR', 
#                        verbose = F, 
#                        only.pos = T, 
#                        random.seed = 1, 
#                        logfc.threshold = 0.2, 
#                        min.pct = 0.1, 
#                        return.thresh = 0.05)


# OPTION 2 - optional - Re-compute  hierarchical (per lineage) DEGs for Epithelial and Stromal lineages
DEGs = c()
for( lin in c('Epithelial', 'Stromal') ){
    message('Computing DEGs within linage ', lin)
    so_in_lineage = subset(so, cells = Cells(so)[ so$lineage == lin ] )
    celltye_in_lineage = unique(so$cell_type[ so$lineage == lin ])
    DEGs_lin = FindAllMarkers(so_in_lineage, 
                       test.use = 'LR', 
                       verbose = F, 
                       only.pos = T, 
                       random.seed = 1, 
                       logfc.threshold = 0.2, 
                       min.pct = 0.1, 
                       return.thresh = 0.05)
    DEGs = rbind(DEGs_lin, DEGs)
}

cond1 = DEGs['p_val_adj'] < 0.05 
cond2 = DEGs['avg_log2FC'] > 0.1
mask = [all(tup) for tup in zip(cond1, cond2)]
fDEGs = DEGs[mask]


# 1st column = cluster; 2nd column = gene 
fDEGs = fDEGs[['cluster', 'gene', 'p_val_adj', 'p_val', 'avg_log2FC', 'pct.1', 'pct.2']] 
fDEGs.to_csv('endometrium_example_DEGs.tsv', index=False, sep='\t')

Run cellphoneDB

cellphonedb method degs_analysis  \
    endometrium_example_meta.tsv  \
    endometrium_example_counts.h5ad  \
    endometrium_example_DEGs.tsv  \
    --microenvs endometrium_example_microenviroments.tsv  \
    --counts-data hgnc_symbol  \
    --database database/database/cellphonedb_user_2021-06-29-11_41.db \
    --threshold 0.1
图片.png

至于cellphoneDB的绘图操作,大家可以参考文章空间通讯分析章节2,软件链接在CellphoneDB.

生活很好,有你更好

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

推荐阅读更多精彩内容