細胞通訊分析【一】——CellChat上游分析

本期內(nèi)容已同步分享至單細胞天地

細胞通訊是指細胞與細胞之間的聯(lián)系趟妥。細胞和人類一樣钝侠,多細胞生物的很多細胞會相互作用,形成“細胞社會”伐弹,在這個社會里拉馋,細胞與細胞之間會發(fā)生相互作用和信息的傳遞,細胞建立通訊聯(lián)絡是必需的。如生物體的生長發(fā)育煌茴、分化柠逞、各種組織器官的形成、組織的維持以及它們各種生理活動的協(xié)調(diào)景馁。經(jīng)典的例子莫過于 神經(jīng)細胞之間的神經(jīng)遞質(zhì)的傳遞與接收

細胞與細胞之間的通訊有三種形式:

  • 細胞之間的直接接觸逗鸣;
  • 細胞之間通過其間的胞外基質(zhì)相互聯(lián)系合住;
  • 細胞之間通過分子間的相互作用產(chǎn)生聯(lián)系。

在這個過程中撒璧,“受體-配體”的概念十分重要透葛,什么是受體,什么是配體卿樱?受體與配體之間結(jié)合的結(jié)果是受體被激活僚害,并產(chǎn)生受體激活后續(xù)信號傳遞的基本步驟。在單細胞分析當中繁调,不同細胞類型之間的通訊可能會對某些生物學過程具有重要意義萨蚕,因此利用單細胞數(shù)據(jù)進行細胞通訊分析是單細胞高級分析的一大重點。

CellChat

CellChat是一款2021年發(fā)表于Nature Communications的單細胞細胞通訊分析工具蹄胰。

CellChat上游分析

1. 安裝 CellChat
devtools::install_github("sqjin/CellChat")
2. 細胞通訊分析

這里我們使用 pbmc3k 的公共數(shù)據(jù)集為例來一起學習如何利用 CellChat 進行細胞通訊分析岳遥。

2.1 數(shù)據(jù)輸入

CellChat 需要的輸入文件包括:

  • 細胞的基因表達矩陣(已經(jīng)經(jīng)過normalize的)
    不同的基因作為行名,細胞ID作為列名裕寨。這一點和Seurat對象的結(jié)構(gòu)是保持一致的浩蓉。
  • 細胞的metadata信息
    細胞層面的信息,這里可以是我們上游分析的注釋信息宾袜,可以直接把SeuratObject的metadata提取出來使用捻艳。

所以我們的輸入文件可以這樣準備:

library(CellChat)
library(Seurat)
library(SeuratData)

data("pbmc3k.final")

data <- GetAssayData(object = pbmc3k.final, slot = 'data')
meta <- pbmc3k.final@meta.data

這里涉及到一個小知識點:SeuratObjectRNA assay中不同slot所存儲的是什么值:

  • counts:原始的基因counts數(shù),也就是簡單reads計數(shù)的結(jié)果庆猫,對于10X Genomics平臺數(shù)據(jù)來說认轨,這是cellranger運行的結(jié)果;
  • data:這是原始表達矩陣經(jīng)過質(zhì)控之后進行NormalizeData()的數(shù)據(jù)月培,NormalizeData去除了不同細胞之間測序深度的差異好渠,同時對結(jié)果進行了對數(shù)化,這個數(shù)據(jù)是CellChat想要的數(shù)據(jù)节视。
  • scale.data:這是函數(shù)ScaleData()運行的結(jié)果拳锚,主要是將每個基因的表達量轉(zhuǎn)換成了符合標準正態(tài)分布的數(shù)據(jù),從而降低部分細胞異常表達值的影響寻行。

因為實際上我們在使用CellChat時是都已經(jīng)默認上游的處理已經(jīng)完成了霍掺,所以我在這里不打算介紹CellChat本身自帶的函數(shù)去normalize原始counts的分析。

2.2 創(chuàng)建CellChat對象

CellChat對象和Seurat對象很像,我們可以這樣來進行創(chuàng)建:

cellchat <- createCellChat(object = data,
                           meta = meta,
                           group.by = 'seurat_annotations')

這里的group.by參數(shù)是不可少的杆烁,來自于我們的metadata的列名牙丽,我們一般指定為細胞類型注釋的結(jié)果,這是有利于我們的分析結(jié)果的兔魂。

除此之外烤芦,不得不介紹的還有這個函數(shù)不僅僅支持將你自己提取的表達矩陣作為輸入,還支持直接用SeuratObject作為輸入析校,不過需要注意的是构罗,如果是多組樣本整合的SeuratObject,我們不能利用integrated assay作為輸入智玻,因為其含有負值遂唧,所以我們可用下面的這段代碼實現(xiàn)和前面代碼一樣的目的:

cellchat <- createCellChat(object = pbmc3k.final,
                           meta = meta,
                           group.by = 'seurat_annotations',
                           assay = 'RNA')

此外還有一個參數(shù)do.sparse不要去改動它(默認為TRUE),用稀疏矩陣處理單細胞數(shù)據(jù)能夠節(jié)省更多的空間和時間吊奢。

簡單介紹一下CellChat數(shù)據(jù)的結(jié)構(gòu):

str(cellchat)
Formal class 'CellChat' [package "CellChat"] with 14 slots
  ..@ data.raw      : num[0 , 0 ] 
  ..@ data          :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  .. .. ..@ i       : int [1:2238732] 29 73 80 148 163 184 186 227 229 230 ...
  .. .. ..@ p       : int [1:2639] 0 779 2131 3260 4220 4741 5522 6304 7094 7626 ...
  .. .. ..@ Dim     : int [1:2] 13714 2638
  .. .. ..@ Dimnames:List of 2
  .. .. .. ..$ : chr [1:13714] "AL627309.1" "AP006222.2" "RP11-206L10.2" "RP11-206L10.9" ...
  .. .. .. ..$ : chr [1:2638] "AAACATACAACCAC" "AAACATTGAGCTAC" "AAACATTGATCAGC" "AAACCGTGCTTCCG" ...
  .. .. ..@ x       : num [1:2238732] 1.64 1.64 2.23 1.64 1.64 ...
  .. .. ..@ factors : list()
  ..@ data.signaling: num[0 , 0 ] 
  ..@ data.scale    : num[0 , 0 ] 
  ..@ data.project  : num[0 , 0 ] 
  ..@ net           : list()
  ..@ netP          : list()
  ..@ meta          :'data.frame':  2638 obs. of  7 variables:
  .. ..$ orig.ident        : Factor w/ 1 level "pbmc3k": 1 1 1 1 1 1 1 1 1 1 ...
  .. ..$ nCount_RNA        : num [1:2638] 2419 4903 3147 2639 980 ...
  .. ..$ nFeature_RNA      : int [1:2638] 779 1352 1129 960 521 781 782 790 532 550 ...
  .. ..$ seurat_annotations: Factor w/ 9 levels "Naive CD4 T",..: 2 4 2 3 7 2 5 5 1 6 ...
  .. ..$ percent.mt        : num [1:2638] 3.02 3.79 0.89 1.74 1.22 ...
  .. ..$ RNA_snn_res.0.5   : Factor w/ 9 levels "0","1","2","3",..: 2 4 2 3 7 2 5 5 1 6 ...
  .. ..$ seurat_clusters   : Factor w/ 9 levels "0","1","2","3",..: 2 4 2 3 7 2 5 5 1 6 ...
  ..@ idents        : Factor w/ 9 levels "Naive CD4 T",..: 2 4 2 3 7 2 5 5 1 6 ...
  ..@ DB            : list()
  ..@ LR            : list()
  ..@ var.features  : list()
  ..@ dr            : list()
  ..@ options       :List of 1
  .. ..$ mode: chr "single"

截止到目前為止盖彭,我們的CellChat對象結(jié)構(gòu)如上所示,可以看到:

  • 我們輸入的數(shù)據(jù)存在了data這個稀疏矩陣里面页滚,而后面的data.signaling等對象還有待后面的分析進行填充召边;
  • 此外,我們應該重點關(guān)注的就是meta部分裹驰,這個部分是一個數(shù)據(jù)框掌实,所以我們還是可以在創(chuàng)建CellChat對象之后來更改細胞的信息,這是比較方便的邦马,可以看到目前CellChat對象對細胞的分析是基于seurat_annotations的贱鼻,這是我們前面設置好的,如果我們想要改變只需要setIdent(cellchat, ident.use = "labels")就可以了滋将,同時我們還可以通過levels(cellchat@idents)來查看當前的細胞分組信息邻悬。
2.3 選擇受體配體數(shù)據(jù)庫

CellChat 有一個專門的數(shù)據(jù)庫,叫做CellChatDB随闽,這個數(shù)據(jù)庫是 CellChat 的作者們通過閱讀大量文獻父丰,手動整理出來的“受體-配體”對,目前有人掘宪、鼠以及斑馬魚的版本蛾扇。其中人的叫做 CellChatDB.human,鼠的叫做 CellChatDB.mouse魏滚,斑馬魚的叫做 CellChatDB.zebrafish镀首。關(guān)于這兩個數(shù)據(jù)庫中具體的“受體-配體”對信息可以通過showDatabaseCategory()函數(shù)獲得,在這里就不贅述了鼠次。

  • mouse
    2,021 validated molecular interactions, including 60% of secrete autocrine/paracrine signaling interactions, 21% of extracellular matrix (ECM)-receptor interactions and 19% of cell-cell contact interactions.
  • human
    1,939 validated molecular interactions, including 61.8% of paracrine/autocrine signaling interactions, 21.7% of extracellular matrix (ECM)-receptor interactions and 16.5% of cell-cell contact interactions.

加載數(shù)據(jù)庫:

CellChatDB <- CellChatDB.human

來看一下數(shù)據(jù)庫的結(jié)構(gòu)(option):

head(CellChatDB$interaction)

最后更哄,千萬不要忘了把數(shù)據(jù)庫嵌入到 CellChat 對象中芋齿,否則后面的分析會報錯:

cellchat@DB <- CellChatDB

有的時候我們并不想分析所有的細胞通訊,例如我們只關(guān)心Secreted Signaling成翩,或者我們只相信經(jīng)過KEGG分析驗證過的細胞通訊觅捆,為了節(jié)約運行空間和時間,我們可以使用subsetDB()函數(shù)來取數(shù)據(jù)庫的子集麻敌,簡單查看一下數(shù)據(jù)庫的數(shù)據(jù)結(jié)構(gòu):

dplyr::glimpse(CellChatDB$interaction)
Rows: 1,939
Columns: 11
$ interaction_name   <chr> "TGFB1_TGFBR1_TGFBR2", "TGFB2_TGFBR1_TGFBR2", "TGFB3_TGFBR1_TGFBR2", "TGFB1_ACVR1B_TGFB…
$ pathway_name       <chr> "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb",…
$ ligand             <chr> "TGFB1", "TGFB2", "TGFB3", "TGFB1", "TGFB1", "TGFB2", "TGFB2", "TGFB3", "TGFB3", "TGFB1…
$ receptor           <chr> "TGFbR1_R2", "TGFbR1_R2", "TGFbR1_R2", "ACVR1B_TGFbR2", "ACVR1C_TGFbR2", "ACVR1B_TGFbR2…
$ agonist            <chr> "TGFb agonist", "TGFb agonist", "TGFb agonist", "TGFb agonist", "TGFb agonist", "TGFb a…
$ antagonist         <chr> "TGFb antagonist", "TGFb antagonist", "TGFb antagonist", "TGFb antagonist", "TGFb antag…
$ co_A_receptor      <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",…
$ co_I_receptor      <chr> "TGFb inhibition receptor", "TGFb inhibition receptor", "TGFb inhibition receptor", "TG…
$ evidence           <chr> "KEGG: hsa04350", "KEGG: hsa04350", "KEGG: hsa04350", "PMID: 27449815", "PMID: 27449815…
$ annotation         <chr> "Secreted Signaling", "Secreted Signaling", "Secreted Signaling", "Secreted Signaling",…
$ interaction_name_2 <chr> "TGFB1 - (TGFBR1+TGFBR2)", "TGFB2 - (TGFBR1+TGFBR2)", "TGFB3 - (TGFBR1+TGFBR2)", "TGFB1…

我們只選擇Secreted Signaling相關(guān)的細胞間通訊信息:

subsetDB(CellChatDB.human, search = 'Secreted Signaling')

當然我們能做的絕不僅這些栅炒,我們可以通過更改subsetDB()函數(shù)的key參數(shù)來實現(xiàn)任何標準的篩選,例如我們想篩選出evidenceKEGG的細胞間通訊:

subsetDB(CellChatDB.human, search = '^KEGG', key = 'evidence') #regular expression here!!!
2.4 細胞通訊鑒定

在這個部分我們?yōu)榱私档瓦\行的內(nèi)存和時間消耗术羔,我們會抽取部分細胞進行分析赢赊,分析的流程也很好理解:首先,鑒定出細胞中高表達的受體和配體編碼基因聂示,然后再依據(jù)這個表達譜構(gòu)建細胞之間的受體與配體作用對。和單細胞分析一樣簇秒,這里我們也可以使用 future 包來進行并行計算鱼喉,加速我們的分析過程。

library(future)
plan(strategy = 'multiprocess', workers = 4)
#subset
cellchat <- subsetData(cellchat)

為什么這里要做subset趋观,因為為了節(jié)省運算時間和空間扛禽,通過這一步,我們后面的分析將只關(guān)注于與細胞通訊有關(guān)的基因(從數(shù)據(jù)框中提取出來的)皱坛,所以在這里針對于表達矩陣的基因取了子集编曼。

cellchat <- identifyOverExpressedGenes(cellchat)
cellchat <- identifyOverExpressedInteractions(cellchat)

上面兩個函數(shù)分別鑒定除了每個細胞群中高表達的細胞通訊相關(guān)基因和細胞群之間根據(jù)細胞通訊相關(guān)基因的表達情況(identifyOverExpressedGenes())最終鑒定出的細胞間通訊關(guān)系(identifyOverExpressedInteractions)。

cellchat <- computeCommunProb(cellchat)
cellchat <- filterCommunication(cellchat, min.cells = 10)

注意到為了獲得更可信的細胞間通訊剩辟,方便后續(xù)的驗證掐场,這里首先對每個通訊計算了相應的概率值,同時進行了基于每個細胞類群中支持該通訊的細胞數(shù)量的過濾贩猎。

需要注意的是熊户,預測出的細胞間通訊的數(shù)量是和每個細胞群的基因表達量有關(guān)的,所以對于基因平均表達量的計算就顯得很重要吭服,在默認情況下嚷堡,computeCommunProb()函數(shù)使用的是trimean方法,該方法默認如果一群細胞里面不足25%的細胞表達某個基因的話艇棕,這個基因在該群細胞里面的平均表達量就是0蝌戒。不過你可以通過設置type = "truncatedMean"trim=來自己指定這個閾值,比如trim=0.1就表示閾值為10%沼琉。顯然默認方法trimean能幫我們篩選出更少的北苟、更可信的細胞間通訊。此外打瘪,考慮到細胞數(shù)更多的細胞群之間的細胞通訊信號往往會更強粹淋,為了去除不同細胞群之間的細胞數(shù)量差異吸祟,我們可以嘗試使用population.size = TRUE來輔助我們發(fā)現(xiàn)稀有細胞類群之間的細胞通訊。你可以通過computeAveExpr(cellchat, features = c("CXCL12","CXCR4"), type = "truncatedMean", trim = 0.1)來提取你所感興趣的細胞通訊相關(guān)基因的平均表達量信息桃移。

2.5 細胞通訊與信號通路關(guān)系的構(gòu)建

細胞之間的通訊往往會是信號通路的重要組成部分屋匕,把細胞通訊放到信號通路中進行理解可能會更有利于我們理解生物學過程。

cellchat <- computeCommunProbPathway(cellchat)

每對受配體的細胞間通訊網(wǎng)絡會被存儲到net的slot中借杰,而每個信號通過的細胞間通訊網(wǎng)絡信息將會被存儲到netP網(wǎng)絡中过吻。

2.6 細胞通訊網(wǎng)絡的構(gòu)建

進一步的,我們將細胞間的通訊進行整合蔗衡,就能構(gòu)建出細胞間的通訊網(wǎng)絡纤虽。

cellchat <- aggregateNet(cellchat)

當然,你可能只關(guān)心部分細胞之間的通訊绞惦,你可以通過指定 信號發(fā)出細胞信號作用細胞 來進行個性化的分析:

?aggregateNet
#output
aggregateNet(
  object,
  sources.use = NULL,
  targets.use = NULL,
  signaling = NULL,
  pairLR.use = NULL,
  remove.isolate = TRUE,
  thresh = 0.05,
  return.object = TRUE
)

也就是這里的 sources.usetargets.use逼纸。那么指定成什么呢?這個時候metadata信息的作用就來了济蝉,指定的就是前面 group.by 所包含的細胞類群信息杰刽。

至此,上游分析已經(jīng)算是結(jié)束王滤,下面就是如何對信息進行展示贺嫂,即 可視化

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雁乡,一起剝皮案震驚了整個濱河市第喳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌踱稍,老刑警劉巖曲饱,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異珠月,居然都是意外死亡渔工,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門桥温,熙熙樓的掌柜王于貴愁眉苦臉地迎上來引矩,“玉大人,你說我怎么就攤上這事侵浸⊥拢” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵掏觉,是天一觀的道長区端。 經(jīng)常有香客問我,道長澳腹,這世上最難降的妖魔是什么织盼? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任杨何,我火速辦了婚禮,結(jié)果婚禮上沥邻,老公的妹妹穿的比我還像新娘危虱。我一直安慰自己,他們只是感情好唐全,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布埃跷。 她就那樣靜靜地躺著,像睡著了一般邮利。 火紅的嫁衣襯著肌膚如雪弥雹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天延届,我揣著相機與錄音剪勿,去河邊找鬼。 笑死方庭,一個胖子當著我的面吹牛厕吉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播二鳄,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼赴涵,長吁一口氣:“原來是場噩夢啊……” “哼媒怯!你這毒婦竟也來了订讼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扇苞,失蹤者是張志新(化名)和其女友劉穎欺殿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳖敷,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡脖苏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了定踱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棍潘。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖崖媚,靈堂內(nèi)的尸體忽然破棺而出亦歉,到底是詐尸還是另有隱情,我是刑警寧澤畅哑,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布肴楷,位于F島的核電站,受9級特大地震影響荠呐,放射性物質(zhì)發(fā)生泄漏赛蔫。R本人自食惡果不足惜砂客,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呵恢。 院中可真熱鬧鞠值,春花似錦、人聲如沸瑰剃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晌姚。三九已至粤剧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挥唠,已是汗流浹背抵恋。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宝磨,地道東北人弧关。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像唤锉,于是被迫代替她去往敵國和親世囊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容