10X單細胞空間聯(lián)合分析之十(RCTD)

hello,上一篇文章中,10X空間轉(zhuǎn)錄組數(shù)據(jù)分析之空間注釋(解卷積幸乒,STdeconvolve)中提到了單細胞空間聯(lián)合的分析方法碱妆,SPOTlight辛馆,RCTD,其中SPOTlight已經(jīng)分享過了,今天加把勁百宇,把單細胞空間聯(lián)合的分析方法RCTD也分享給大家考廉,供大家認真學習和參考。

RCTD方法的文章Robust decomposition of cell type mixtures in spatial transcriptomics携御,2021年2月發(fā)表于nature biotechnology昌粤。IF = 54分,醫(yī)學類雜志分數(shù)都普遍較高啄刹,方法的網(wǎng)址在RCTD,下面來幾張分析的效果圖:

圖片.png
圖片.png

圖片.png

當然涮坐,方法的靈活運用還是要看我們自己,好了誓军,開始我們這次的分享袱讹。

Abstract

空間轉(zhuǎn)錄組學技術(shù)的局限性在于,單個測量值可能包含來自多個細胞的貢獻昵时,阻礙了細胞類型特異性定位和表達空間模式的發(fā)現(xiàn)捷雕。在這里椒丧,作者開發(fā)了穩(wěn)定的細胞類型分解軟件(RCTD),這是一種計算方法救巷,它利用從單細胞 RNA-seq 中學到的細胞類型譜來分解細胞類型混合物(還是上一篇說的不錯壶熏,很依賴注釋好的單細胞數(shù)據(jù)),同時校正不同測序技術(shù)的差異浦译。文中展示了 RCTD 在模擬數(shù)據(jù)集上檢測混合物和識別細胞類型的能力久橙。此外,RCTD 在小鼠大腦的 Slide-seq 和 Visium 數(shù)據(jù)集中準確地再現(xiàn)了已知的細胞類型和亞型定位模式管怠。最后,分析展示了 RCTD 對細胞類型定位的恢復如何能夠在細胞類型中發(fā)現(xiàn)基因缸榄,其表達取決于空間環(huán)境渤弛。使用 RCTD 對細胞類型進行空間映射可以定義細胞身份的空間成分,揭示生物組織中細胞組織的新原理甚带。

Introduction

組織由不同的細胞類型和狀態(tài)組成她肯,其空間組織控制著相互作用和功能。 空間轉(zhuǎn)錄組學技術(shù)的最新進展使 RNA 測序與生物組織中的空間信息的高通量收集成為可能鹰贵。 使用此類技術(shù)對細胞類型進行空間映射是了解組織結(jié)構(gòu)的基礎(chǔ)晴氨。 特別是,特定細胞亞型的空間定位知識仍然不完整且難以獲得碉输。
空間轉(zhuǎn)錄組學技術(shù)有可能闡明細胞環(huán)境和基因表達之間的相互作用籽前,增加對健康功能和組織疾病狀態(tài)的了解。 空間轉(zhuǎn)錄組學數(shù)據(jù)由每個空間測量位置的基因表達計數(shù)組成敷钾,這里稱為像素(其實就是我們空間數(shù)據(jù)的spot)枝哄,平鋪二維 (2D) 表面。 一項常見的任務(wù)是識別表達隨空間變化的基因阻荒。 當前的計算方法在不按細胞類型分層的情況下搜索基因表達的空間模式挠锥。 然而,這些方法檢測到的大部分變異可能是由空間景觀中不同的細胞類型組成驅(qū)動的侨赡,因為單細胞 RNA 測序 (scRNA-seq) 研究表明蓖租,細胞類型可以解釋群體中的大部分變異。 因此羊壹,在搜索空間基因表達模式時蓖宦,有必要考慮細胞類型信息。
即使對于高分辨率方法(例如 Slide-seq)舶掖,細胞類型的分配在分析上也具有挑戰(zhàn)性球昨,因為盡管像素分辨率可以接近哺乳動物細胞的大小(例如眨攘,Slide-seq主慰,10 μm)嚣州,固定像素位置可能與多個細胞重疊。 因此共螺,單個像素的基因表達測量可能是多種細胞類型混合的結(jié)果该肴。 目前,最廣泛使用的識別細胞類型的方法依賴于無監(jiān)督聚類藐不。 然而匀哄,這種方法不允許細胞類型混合的可能性。 因此雏蛮,一個基本的挑戰(zhàn)是將這些混合像素正確識別為多種細胞類型的組合涎嚼,從而可以更完整地表征空間轉(zhuǎn)錄組學中細胞類型的空間定位。
最近的幾種方法使用 scRNA-seq 參考來預測空間轉(zhuǎn)錄組學數(shù)據(jù)上的細胞類型挑秉; 然而法梯,盡管最近有證據(jù)表明,scRNA-seq 數(shù)據(jù)分析中解釋基因表達計數(shù)數(shù)據(jù)這些方面的方法優(yōu)于假設(shè)正態(tài)性的方法犀概,但有些并未對平臺效應(yīng)立哑、泊松采樣和過度分散計數(shù)進行統(tǒng)計建模。 其他尚未被證明可以擴展到大型數(shù)據(jù)集的數(shù)據(jù)集姻灶,例如通過 Slide-seq 獲得的數(shù)據(jù)集铛绰,并且它們在區(qū)域而不是單個像素的水平上執(zhí)行細胞類型富集測試。
在這里产喉,開發(fā)介紹了 RCTD捂掰,一種將 RNA 測序混合物分解為單個細胞類型的監(jiān)督學習方法(就是利用單細胞數(shù)據(jù)來注釋空間轉(zhuǎn)錄組),從而能夠?qū)⒓毎愋头峙浣o空間轉(zhuǎn)錄組像素镊叁。 具體來說尘颓,利用帶注釋的 scRNA-seq 數(shù)據(jù)來定義空間轉(zhuǎn)錄組學數(shù)據(jù)中預期存在的細胞類型的細胞類型特異性概況。 幾種有監(jiān)督的細胞類型分配方法在 scRNA-seq 中取得了很高的準確性晦譬,但不是為多種細胞類型的混合物設(shè)計的疤苹。 RCTD 擬合一個統(tǒng)計模型,該模型估計每個像素的細胞類型混合敛腌。
監(jiān)督細胞類型學習的一個相關(guān)挑戰(zhàn)是所說的平臺效應(yīng)卧土,即依賴于技術(shù)的文庫制備對測序平臺之間單個基因捕獲率的影響。 分析表明像樊,如果不考慮這些平臺效應(yīng)尤莺,監(jiān)督方法不太可能成功,因為系統(tǒng)技術(shù)可變性主導了相關(guān)的生物信號生棍。 這些影響先前已在同一生物樣本上的單細胞和單核 RNA-seq (snRNA-seq) 之間的比較中發(fā)現(xiàn)颤霎,其中已經(jīng)表明,例如,核定位基因富含 snRNA-seq . 在這里友酱,證明了 scRNA-seq 參考和空間轉(zhuǎn)錄組學目標之間的平臺效應(yīng)在將細胞類型知識轉(zhuǎn)移到空間轉(zhuǎn)錄組學時提出了挑戰(zhàn)晴音。 為了在 RCTD 中實現(xiàn)跨平臺學習,作者開發(fā)并驗證了平臺效應(yīng)規(guī)范化程序缔杉。
文中的例子證明 RCTD 可以準確地發(fā)現(xiàn)模擬和真實空間轉(zhuǎn)錄組數(shù)據(jù)中細胞類型的定位锤躁。 此外,RCTD 可以檢測細微的轉(zhuǎn)錄組差異以在空間上映射細胞亞型或详。 最后系羞,使用 RCTD 來計算預期的細胞類型特異性基因表達,從而能夠根據(jù)細胞的空間環(huán)境檢測基因表達的變化霸琴。分析部分展示了 RCTD 如何學習空間轉(zhuǎn)錄組學數(shù)據(jù)中細胞類型的混合物椒振,促進空間位置和局部細胞環(huán)境對細胞類型內(nèi)基因表達的影響的量化。

Results

Challenges in spatial transcriptomics: cell type mixtures and platform effects.

空間轉(zhuǎn)錄組學像素從多個而不是單個細胞中獲取 RNA梧乘,這為細胞類型學習帶來了挑戰(zhàn)杠人。 在 Slide-seq 小腦數(shù)據(jù)中,發(fā)現(xiàn)最廣泛使用的 scRNA-seq 細胞類型識別方法宋下,即無監(jiān)督聚類,錯誤地對空間共定位但轉(zhuǎn)錄不相似的細胞類型進行了分類辑莫。 例如学歧,Bergmann and Purkinje cells在空間上共定位于同一層,從而產(chǎn)生具有兩種細胞類型標記基因的cluster(下圖)
圖片.png
  • 注:Expression of Bergmann and Purkinje cell marker genes for pixels colored by unsupervised clustering cell type assignment within a Slide-seq cerebellum dataset. For example, the Bergmann cell markers axis is the sum of the expression (counts per 500) of Bergmann cell differentially expressed genes各吨。
對這一觀察結(jié)果最可能的解釋是這些像素包含兩個或多個不同類型的細胞枝笨,但無監(jiān)督聚類將這些雙重像素僅分配給一種細胞類型。 此外揭蜒,這種方法不僅預測顆粒層中的顆粒細胞横浑,許多細胞在分子層和少突膠質(zhì)細胞層內(nèi)被錯誤預測,并且顆粒細胞標記物表達較低屉更。
圖片.png
  • 注:b, Expression (counts per 500) of granule cell marker genes in Slide-seq; scale bar, 250 μm. c, Spatial plot of granule cells identified by unsupervised clustering. Pixels are colored by whether they spatially belong to the granule cell layer; scale bar, 250 μm
另一個挑戰(zhàn)徙融,平臺效應(yīng),出現(xiàn)在應(yīng)用監(jiān)督學習中瑰谜,其中利用 scRNA-seq 細胞類型譜對空間轉(zhuǎn)錄組細胞類型進行分類欺冀。 例如,在具有已知細胞類型的評估 snRNA-seq 小腦數(shù)據(jù)集上訓練的標準監(jiān)督學習方法在訓練平臺中獲得的準確度遠高于測試平臺 scRNA-seq 小腦數(shù)據(jù)集萨脑。
圖片.png
  • 注:d, Confusion matrix of true versus predicted cell types within a training dataset (snRNA-seq) by non-negative least squares regression. Color represents the proportion of the cell type on the x axis classified as the cell type on the y axis. The diagonal line representing ground truth is boxed in red. e, Confusion matrix of cell type predictions across platforms using non-negative least-squares regression trained on snRNA-seq data and tested on scRNA-seq data. The same color scale was used as in d
這種差異可以通過平臺效應(yīng)的存在來解釋隐轩,平臺效應(yīng)會導致基因表達在 snRNA-seq 和 scRNA-seq 之間成倍變化(看來大家在選擇單細胞轉(zhuǎn)錄組還是單細胞核轉(zhuǎn)錄組的時候一定要慎重了)。
圖片.png
  • 注:Density plot across genes of measured platform effects between cerebellum scRNA-seq and snRNA-seq data. The platform effect is defined as the log2 ratio of average gene expression between platforms. UBCs, unipolar brush cells.
NMFreg 是一種之前為 Slide-seq 開發(fā)的監(jiān)督細胞類型混合分配算法(關(guān)于非負矩陣分解的內(nèi)容渤早,我分享了很多了职车,大家可以看看我之前分享的文章),也沒有考慮平臺效應(yīng)。 在 Slide-seq 小腦數(shù)據(jù)集上進行測試時悴灵,NMFreg 自信地將少數(shù)(n = 11,626 的 24.8%)SPOT分配給細胞類型和錯誤定位的廣泛細胞類型類別扛芽。 同樣,DWLS 是一種為批量 RNA-seq 反卷積設(shè)計的方法称勋,它沒有考慮平臺效應(yīng)胸哥,并且在參考內(nèi)細胞類型分類方面比跨平臺細胞類型分類表現(xiàn)更好。

RCTD enables cross-platform detection of cell type mixtures.

為了解決這些挑戰(zhàn)赡鲜,RCTD 考慮了平臺效應(yīng)空厌,同時使用 scRNA-seq 參考將每個空間轉(zhuǎn)錄組學像素分解為單個細胞類型的混合物。 RCTD 首先計算帶注釋的 scRNA-seq 參考中每種細胞類型的平均基因表達譜银酬。 接下來嘲更,RCTD 通過將每個空間轉(zhuǎn)錄組學像素擬合為單個細胞類型的線性組合來創(chuàng)建細胞類型的空間圖。 RCTD 將每個spot的 RNA 測序計數(shù)作為輸入揩瞪,并假設(shè)多個細胞的未知混合物
圖片.png
每種細胞類型對每個基因都貢獻了未觀察到的計數(shù)比例赋朦。 RCTD 通過擬合統(tǒng)計模型來估計每個spot的每種細胞類型的比例,其中李破,對于每個spot i 和基因 j宠哄,假設(shè)觀察到的基因計數(shù) Yi,j 服從泊松分布。rate parameter由spot的總轉(zhuǎn)錄本計數(shù)嗤攻、Ni 和 λi,j(K 細胞類型表達譜的混合物)決定: (數(shù)學方面的知識毛嫉,大家盡量多多學習)
圖片.png
為了考慮平臺效應(yīng)和其他自然變異源,例如空間變異性妇菱,我們假設(shè) λi,j 是一個隨機變量承粤,定義為 :
圖片.png
where μk,j represents the mean gene expression profile for cell type k, αi is a fixed pixel-specific effect, γj is a gene-specific platform random effect and εi,j is a random effect to account for gene-specific overdispersion.
使用最大似然估計 (MLE) 來推斷細胞類型比例 βi,k,表明每個像素中存在哪些細胞類型(后面方法中討論)闯团。 RCTD 可以在不限制每個像素的細胞類型數(shù)量的情況下使用辛臊,或者使用雙合模式,它搜索每個像素的最佳擬合一種或兩種細胞類型房交。 特別是彻舰,如果像素僅包含一種細胞類型,將像素稱為單峰候味,如果它們包含兩種細胞類型淹遵,我們將像素稱為雙峰。 如我們在 Slide-seq 中發(fā)現(xiàn)的那樣负溪,如果預計三種或更多細胞類型的混合物很少見透揣,雙峰模式可能會減輕過度擬合。 軟件還擴展了雙合模式川抡,可選擇每個像素適合兩種以上的細胞類型
由于無法從原始數(shù)據(jù)中觀察到基因特異性平臺效應(yīng)辐真,作者開發(fā)了一個程序來估計具有 RCTD 的測序平臺之間的平臺效應(yīng)须尚。 在 snRNA-seq 小腦參考和 scRNA-seq 小腦數(shù)據(jù)集上訓練 RCTD,驗證了RCTD的方法能夠可靠地恢復平臺效應(yīng)(R2 = 0.90)
圖片.png
  • 注: Scatter plot of measured versus predicted platform effect (by RCTD) for each gene between the single-cell and single-nucleus cerebellum datasets. The line represents the identity line. The measured platform effect is calculated as the log2 ratio of average gene expression between platforms.
After normalizing cell type profiles for platform effects, RCTD achieved high cross-platform single-cell classification accuracy (89.5% of n = 3,960 cells) Transcriptomically similar cell types, for example, oligodendrocytes/polydendrocytes, accounted for most of the remaining errors (91.8% of n = 415 errors).
圖片.png
  • 注:Confusion matrix for RCTD’s performance on cross-platform (trained on snRNA-seq data and tested on scRNA-seq data) cell type assignments for single cells. Color represents the proportion of the cell type on the x axis classified as the cell type on the y axis. The diagonal representing ground truth is boxed in red.
由于空間轉(zhuǎn)錄組學數(shù)據(jù)集中的真實細胞類型身份未知侍咱,使用從先前研究中獲得的真實細胞類型對 RCTD 在 snRNA-seq 和 scRNA-seq 數(shù)據(jù)集上的性能進行了基準測試耐床。 為了評估 RCTD 在存在平臺效應(yīng)的情況下檢測和分解空間轉(zhuǎn)錄組學數(shù)據(jù)中的混合物的能力,我們在 snRNA-seq 小腦參考上訓練了 RCTD楔脯,并在模擬為單細胞與已知細胞類型的計算混合物的雙聯(lián)數(shù)據(jù)集上進行了測試撩轰。 scRNA-seq 數(shù)據(jù)集。 通過改變真實的基礎(chǔ)細胞類型比例昧廷,觀察到 RCTD 以高精度正確分類了單峰 (89.2% ± 0.5% s.e.) 和雙峰 (81.1% ± 0.3% s.e.)
圖片.png
很大一部分雙峰錯誤分類來自出現(xiàn)在同一雙峰像素上的轉(zhuǎn)錄相似細胞類型堪嫂,RCTD 經(jīng)常將其錯誤分類 (87.0% ± 1.2% s.e.) 為單峰。 此外木柬,RCTD 以 98.2% 的準確率識別每個雙峰上存在的每個細胞類別(方法皆串;跨 66 個細胞類型對為 ±2.8% s.d.)
圖片.png
  • 注:On simulated doublets of cell class 1 and cell type 2, the percentage of confident calls by RCTD that correctly identifies the cell class, where cell classes group four pairs of transcriptionally similar cell types based on a previous dendrogram20 (polydendrocytes/oligodendrocytes, molecular layer interneurons 1 and 2 (MLI1/MLI2), Bergmann cells/astrocytes and endothelial cells/fibroblasts). Column represents cell class 1, and color represents cell type 2
最后,RCTD 以 12.8% r.m.s.e. 準確估計了樣本中每種細胞類型的比例眉枕。 (±6.9% s.d. 跨越 66 個細胞類型對)(下圖)恶复。 這些技術(shù)驗證表明,RCTD 可以準確地學習單個細胞混合數(shù)據(jù)集中的細胞類型信息速挑。
圖片.png
  • 注:c, On simulated Bergmann–Purkinje doublets, the predicted Bergmann cell proportions by RCTD are shown. The x axis represents the true proportion of UMIs sampled from the Bergmann cell. The red line is the identity line, and the blue line is the average and s.d. (n = 30 simulations per condition) of RCTD’s prediction. d, For each pair of cell types, the r.m.s.e. of predicted versus true cell type proportion (as in c) by RCTD on simulated doublets (n = 390 simulations per cell type pair) is displayed. Column represents cell type 1, and color represents cell type 2.
接下來谤牡,將模擬數(shù)據(jù)上的 RCTD 驗證擴展到其他情況,包括每像素不同的唯一分子標識符 (UMI) 計數(shù)姥宝、每像素超過兩種細胞類型以及參考中缺失的細胞類型拓哟。 我們發(fā)現(xiàn)每個像素的額外 UMI 導致置信率增加,并且 RCTD 對包含≥100 個 UMI 的像素實現(xiàn)了高分類精度伶授。 此外,我們發(fā)現(xiàn) RCTD 能夠準確預測包含三種或四種細胞類型的像素上的細胞類別比例流纹,這是低分辨率空間轉(zhuǎn)錄組學中的典型方案糜烹。 當參考中缺少模擬空間數(shù)據(jù)中的細胞類型時,RCTD 將像素歸類為參考中轉(zhuǎn)錄最相似的細胞類型(如果可用)漱凝。 當參考中沒有可用的最接近的細胞類型時疮蹦,RCTD 以降低的置信率預測細胞類型,但經(jīng)常錯誤分類此類像素(我們更加希望的是茸炒,沒有這種細胞類型的時候預測報錯)愕乎。

RCTD localizes cell types in spatial transcriptomics data.

接下來應(yīng)用 RCTD 來分配和分解空間轉(zhuǎn)錄組學數(shù)據(jù)中的細胞類型。 我們首先應(yīng)用 RCTD 來定位小鼠小腦中的細胞類型壁公,使用 snRNA-seq 參考進行訓練和在成年小鼠小腦上收集的 Slide-seqV2 數(shù)據(jù)集作為目標感论。 RCTD 自信地對大多數(shù)像素(n = 11,626 的 86.9%)進行了分類,并且由此產(chǎn)生的細胞類型調(diào)用與小腦的空間結(jié)構(gòu)一致
圖片.png
  • 注:RCTD’s spatial map of cell type assignments in the cerebellum. Of 19 cell types, the 7 most common appear in the legend
由于空間轉(zhuǎn)錄組學數(shù)據(jù)不存在真實細胞類型標簽紊册,為了評估 RCTD 的準確性比肄,我們使用了多種驗證策略,包括與標記基因的比較和空間組織的先驗知識。 雖然應(yīng)該預期標記基因的存在大致對應(yīng)于細胞類型的存在芳绩,但我們不期望完美的關(guān)系掀亥,因此結(jié)合先前的生物學知識尋找標記基因的存在筐乳。 我們首先考慮了Purkinje/Bergman cells纲岭,這兩種細胞類型在小腦中空間共定位概页。 我們發(fā)現(xiàn)分配給Purkinje/Bergman細胞類型的 RCTD 的單線態(tài)像素不具有其他細胞類型的標記激涤。
圖片.png
Moreover, pixels predicted as doublets contained marker genes of both Bergmann and Purkinje cells, with estimated cell type proportion correlating with marker gene ratio廷区。接下來觀察到 RCTD 正確地將分子層中間神經(jīng)元定位到分子層渤刃,顆粒細胞定位到顆粒層泉手,少突膠質(zhì)細胞定位到白質(zhì)層应民,RCTD 的分配與每種細胞類型的標記基因之間的空間對應(yīng)關(guān)系進一步支持了預測
圖片.png
接下來吼拥,為了驗證 RCTD 正確定位雙峰的能力倚聚,我們利用了小腦的分層組織
圖片.png
  • 注:Top, schematic of spatial cell type organization within the cerebellum. Bottom, connectivity graph of cell types that are likely to spatially colocalize.
RCTD found doublets within a layer and between adjacent layers but rarely between spatially separated layers
圖片.png
為了測試 RCTD 在多個數(shù)據(jù)集上訓練時是否獲得一致的結(jié)果,我們另外在 scRNA-seq 小腦數(shù)據(jù)集上訓練了 RCTD凿可,并在 Slide-seq 小腦數(shù)據(jù)上進行了測試惑折。 在可靠分類的像素上,RCTD 在兩個不同的參考資料上進行了訓練枯跑,同意 95.7% 的細胞類型預測惨驶。 我們還驗證了 RCTD 在小鼠體感皮層的 Slide-seqV2 數(shù)據(jù)集中重現(xiàn)皮層細胞類型分層結(jié)構(gòu)的能力,在 Smart-seq2 參考上進行訓練我們發(fā)現(xiàn)皮層神經(jīng)元亞型出現(xiàn)在適當?shù)膶又辛仓哂?L2/3 端腦內(nèi)( IT)粗卜,接著是 L4,接著是 L5 IT 和 L5 錐體束 (PT)纳击,接著是 L6 皮質(zhì)丘腦 (CT) 和 L6 IT续扔,接著是 L6b,這與其他研究的結(jié)果一致

RCTD discovers spatial localization of cellular subtypes.

接下來焕数,我們測試了 RCTD 描繪細胞亞型空間定位的能力纱昧,正如最近通過大規(guī)模轉(zhuǎn)錄組學分析所定義的,對于這些細胞亞型在其常駐組織中的空間位置了解有限堡赔。 為此识脆,我們驗證了 RCTD 對先前定義的海馬中間神經(jīng)元亞型進行分類的能力。 我們首先使用 RCTD 在小鼠海馬體的 Slide-seq 數(shù)據(jù)中對細胞類型進行空間注釋
圖片.png
  • 注:RCTD’s spatial map of predicted cell types in the hippocampus. Of 17 cell types, the 8 most common appear in the legend善已。
在 scRNA-seq 海馬數(shù)據(jù)集上進行訓練灼捂。 我們發(fā)現(xiàn) RCTD 正確定位海馬細胞類型。 我們還驗證了 RCTD 在 Visium 空間轉(zhuǎn)錄組學數(shù)據(jù)集中定位海馬細胞類型的能力换团,并發(fā)現(xiàn) Slide-seq 和 Visium 上預測的細胞類型定位模式之間的定性一致性悉稠。 然后我們觀察了分配給廣泛類別的中間神經(jīng)元的像素的空間聚類
圖片.png
我們推斷它來自大的單個中間神經(jīng)元細胞,這一推斷得到了組織學檢查的支持艘包。 因此偎球,我們測試了 RCTD 在將一個簇內(nèi)的像素分配給同一中間神經(jīng)元子類時的性能洒扎,并發(fā)現(xiàn)同一空間cluster內(nèi)的置信像素之間的粗略子類分類具有很高的一致性(97.1% ± 0.09% s.e.)
圖片.png
Additionally, we found that the spatial localization of the basket/OLM subclass coincided with the expression of Sst, a differentially expressed gene for this subclass
圖片.png
Finally, we used RCTD to assign each spatial cluster to 1 of 27 transcriptomically defined interneuron subtypes, confidently classifying the majority of interneuron pixels。
圖片.png
已知亞型的定位衰絮,例如出現(xiàn)在 CA1 的腔隙分子層 (SLM) 層中的 CA1 腔隙 (參考) 和主要出現(xiàn)在層層 (SO) 中的 OLM袍冷,與已知的解剖結(jié)構(gòu)一致。 我們得出結(jié)論猫牡,RCTD 能夠識別空間轉(zhuǎn)錄組學數(shù)據(jù)中細胞亞型的空間位置胡诗。

RCTD enables detection of spatially variable genes within cell type.(檢測空間高變基因)

以前的計算方法在不包含細胞類型信息的情況下搜索空間可變基因。 然而淌友,由于細胞類型在空間中分布不均煌恢,并且不同的細胞類型具有不同的表達譜,這種方法可能會導致將細胞類型標記基因與空間可變基因混淆震庭。 例如瑰抵,我們發(fā)現(xiàn) Slide-seq 海馬數(shù)據(jù)中空間自相關(guān)性最高的 20 個基因主要僅在少數(shù)細胞類型中表達,表明它們的空間變異部分由細胞類型組成驅(qū)動器联。在調(diào)節(jié)細胞類型后二汛,這些基因中的大多數(shù)表現(xiàn)出小的剩余空間變異。 例如拨拓,Ptk2b 在興奮性神經(jīng)元中差異表達肴颊,但沒有表現(xiàn)出任何無法單獨由細胞類型解釋的空間變化
圖片.png
相反,RCTD 能夠估計每種細胞類型內(nèi)的空間基因表達模式渣磷。 確定細胞類型后婿着,我們使用 RCTD 計算每個像素內(nèi)每種細胞類型的預期細胞類型特異性基因表達。 使用這種特定于細胞類型的預期基因表達醋界,我們檢測到 CA3 錐體神經(jīng)元內(nèi)具有大空間變異的基因竟宋。 對于這些基因,我們通過局部加權(quán)回歸恢復了空間上基因表達的平滑模式
圖片.png
除了空間可變基因外形纺,RCTD 還可用于檢測細胞環(huán)境對基因表達的影響丘侠。在海馬體中,RCTD 在不同的空間區(qū)域檢測到具有多種細胞類型的星形膠質(zhì)細胞雙聯(lián)體挡篓;我們假設(shè)星形膠質(zhì)細胞轉(zhuǎn)錄組可能因細胞環(huán)境而異。我們檢測到其在星形膠質(zhì)細胞中的表達依賴于與另一種細胞類型的共定位的基因帚称。例如官研,我們發(fā)現(xiàn) Entpd2 富含與齒狀神經(jīng)元共定位的星形膠質(zhì)細胞(P = 0.025,雙尾 z 檢驗)闯睹。這與先前的研究一致戏羽,該研究在表達 Entpd2 的齒狀核中檢測到星形膠質(zhì)細胞樣祖細胞群。此外楼吃,能夠攝取 GABA 神經(jīng)遞質(zhì)并可能調(diào)節(jié)抑制性突觸的 Slc6a11 在興奮性神經(jīng)元周圍的星形膠質(zhì)細胞中差異表達(P < 10-6始花,雙尾 z 檢驗)妄讯。因此,RCTD 能夠測量細胞環(huán)境和空間對基因表達的影響
圖片.png

Discussion

細胞類型的準確空間映射和基因表達的細胞類型特異性空間模式的檢測對于理解組織組織和功能至關(guān)重要酷宵。在這里亥贸,介紹了 RCTD,這是一種使用針對平臺效應(yīng)標準化的 scRNA-seq 參考將空間轉(zhuǎn)錄組像素準確分解為細胞類型混合物的計算方法浇垦。 RCTD 將包含多個細胞的未知混合物的每個像素的 RNA 測序計數(shù)作為輸入炕置,并預測每個像素上每種細胞類型的比例。 RCTD 準確映射細胞類型男韧,如模擬雙聯(lián)體數(shù)據(jù)集以及小腦和海馬空間轉(zhuǎn)錄組學數(shù)據(jù)集所示朴摊。我們還證明了 RCTD 在 Visium 海馬空間轉(zhuǎn)錄組學數(shù)據(jù)集中正確定位亞型的能力,表明 RCTD 可以廣泛應(yīng)用于不同的平臺此虑。我們進一步表明 RCTD 可以在空間上定位海馬中間神經(jīng)元的轉(zhuǎn)錄組學定義的細胞亞型甚纲。最后,我們證明了 RCTD 能夠發(fā)現(xiàn)海馬細胞類型內(nèi)空間變化的基因表達朦前。
隨著測序成本的降低介杆,scRNA-seq 數(shù)據(jù)集變得越來越普遍且更容易生成 。單個 scRNA-seq 方法在其平臺效應(yīng)方面可能或多或少類似于空間轉(zhuǎn)錄組學數(shù)據(jù)集况既,這可以通過 RCTD 進行測量这溅。例如,相對于 Slide-seq棒仍,我們發(fā)現(xiàn)單細胞海馬參考的平臺效應(yīng)比單核小腦參考的平臺效應(yīng)要低悲靴。雖然空間平臺效應(yīng)很難先驗測量,但我們已經(jīng)證明我們的平臺效應(yīng)歸一化程序?qū)⒖迹╯cRNA-seq莫其、snRNA-seq癞尚、Smart-seq)的選擇具有魯棒性。因此乱陡,我們預計 RCTD 應(yīng)該與未來的 scRNA-seq 模式兼容浇揩。此外,我們的方法可以靈活地選擇目標平臺憨颠。例如胳徽,我們估計平臺效應(yīng)的過程僅取決于將所有像素合并為一個偽批量測量。因此爽彤,我們的方法可用于估計從 scRNA-seq 參考到任何其他測序技術(shù)(包括批量 RNA 測序)的平臺效應(yīng)养盗,為 RNA 測序提供普遍適用的歸一化程序。盡管受空間轉(zhuǎn)錄組學的啟發(fā)适篙,我們希望 RCTD 可以在其他非空間數(shù)據(jù)集上學習單個細胞或多種細胞類型的混合細胞類型往核。
RCTD 的一個限制是它依賴于平臺效應(yīng)在細胞類型之間共享的假設(shè)。 這是基于參考的細胞類型學習的普遍問題嚷节,在未來的工作中探索學習細胞類型特定的平臺效應(yīng)將很重要聂儒。 我們還發(fā)現(xiàn) RCTD 的一個具有挑戰(zhàn)性的問題是參考中缺少但存在于空間數(shù)據(jù)中的細胞類型虎锚。 這個問題可以通過裁剪空間數(shù)據(jù)以排除先驗已知的主要包含參考中不存在的細胞類型的區(qū)域來緩解。 未來的工作包括改進我們的方法來識別具有參考之外的細胞類型的像素衩婚。
當精細的空間分辨率導致三種或更多細胞類型定位到一個像素不常見時(例如窜护,Slide-seq),我們建議使用 RCTD 的雙峰模式谅猾,它限制每個像素最多兩種細胞類型柄慰。 否則,RCTD 可用于分解每個像素的任意數(shù)量的細胞類型(例如税娜,Visium)坐搔。 原理上類似于 Akaike 信息準則 (AIC) 模型選擇方法,雙峰模式通過懲罰使用的細胞類型數(shù)量來減少過度擬合敬矩,提高 RCTD 的統(tǒng)計能力概行。 這個概念可以很容易地擴展到triplets及以后的工作中。
空間轉(zhuǎn)錄組學的一個主要目標是了解細胞類型和細胞環(huán)境對細胞狀態(tài)的影響弧岳。 RCTD 通過計算每個空間轉(zhuǎn)錄組學像素的預期細胞類型特異性基因表達來促進這些效應(yīng)的發(fā)現(xiàn)凳忙。 例如,分析了星形膠質(zhì)細胞內(nèi)的基因表達禽炬,以檢測受局部細胞環(huán)境影響的星形膠質(zhì)細胞基因涧卵。 基因依賴細胞環(huán)境的驅(qū)動因素有很多,包括細胞間相互作用腹尖、區(qū)域信號因子或發(fā)育過程中的細胞歷史柳恐。 RCTD 獨特地定位細胞類型的能力使關(guān)于空間和環(huán)境對基因表達的影響的生物學相關(guān)假設(shè)的高通量生成成為可能。 隨著更多空間轉(zhuǎn)錄組學數(shù)據(jù)集的產(chǎn)生热幔,預計 RCTD 將有助于發(fā)現(xiàn)生物組織中細胞組織的新原理乐设。

Method(數(shù)學的知識大家多多學習,很多公式寫起來很麻煩绎巨,就直接截圖了)近尚。

圖片.png

圖片.png

看看示例代碼,示例代碼很多,我們就分享其中的一部分场勤。

RCTD on the Hippocampus and spatially localizing three interneuron subclasses
library(RCTD)
library(Matrix)
library(ggplot2)
library(ggpubr)
library(gridExtra)
library(reshape2)
library(Seurat)
source('../../R/RCTD_helper.R')
source('../../R/IRWLS.R')
source('../../R/prob_model.R')

Load in results of RCTD and select interneurons

#given a puck object, returns a puck with counts filtered based on UMI threshold and gene list
restrict_counts <- function(puck, gene_list, UMI_thresh = 1, UMI_max = 20000) {
  keep_loc = (puck@nUMI >= UMI_thresh) & (puck@nUMI <= UMI_max)
  puck@counts = puck@counts[gene_list,keep_loc]
  if(length(puck@cell_labels) > 0) #check cell_labels non null
    puck@cell_labels = puck@cell_labels[keep_loc]
  puck@nUMI = puck@nUMI[keep_loc]
  return(puck)
}

#Command used to save the data from the gather_results.R script:
#save(puck_d, iv, results, file = 'Data/SpatialRNA/Puck_200115_08/results/final_analysis/gathered_results.RData')
#loading in that data:
refdir = '../../Data/Reference/DropVizHC'
load('../../Data/SpatialRNA/Puck_200115_08/results/final_analysis/gathered_results.RData')
results_df <- results$results_df
barcodes <- rownames(results_df)
singlet_ind = results_df$first_type == "Interneuron" & results_df$spot_class == "singlet"
singlet_barcodes <- barcodes[singlet_ind]
doublet_barcodes <- c(barcodes[results_df$first_type == "Interneuron" & results_df$spot_class == "doublet_certain"], barcodes[results_df$first_type == "Interneuron" & results_df$spot_class == "doublet_uncertain"],
                      barcodes[results_df$second_type == "Interneuron" & results_df$spot_class == "doublet_certain"])
doub_first <- c(barcodes[results_df$first_type == "Interneuron" & results_df$spot_class == "doublet_certain"], barcodes[results_df$first_type == "Interneuron" & results_df$spot_class == "doublet_uncertain"])
doub_second <- barcodes[results_df$second_type == "Interneuron" & results_df$spot_class == "doublet_certain"]
second_type_list <- unlist(list(results_df[doub_first,]$second_type,results_df[doub_second,]$first_type))
names(second_type_list) <- doublet_barcodes
inter_barcodes <- c(singlet_barcodes, doublet_barcodes)

puck <- readRDS('../../Data/SpatialRNA/Puck_200115_08/puckCropped.RDS')
cell_type_info <- readRDS(file.path(refdir,'info_renorm_coarse.RDS'))
gene_list <- intersect(rownames(cell_type_info[[1]]),rownames(puck@counts))
puck <- restrict_puck(puck, names(which(puck@nUMI >= 100)))
puck <- restrict_counts(puck, gene_list, UMI_max = 200000)

Q_mat <- readRDS(file.path('../../Data/SpatialRNA/Puck_200115_08/results','Q_mat.RDS'))
N_X = dim(Q_mat)[2]; delta = 1e-5; X_vals = (1:N_X)^1.5*delta
K_val = dim(Q_mat)[1] - 3; use_Q = T

Run RCTD on interneurons to classify into 3 interneuron subtypes

refdir <- '../../Data/Reference/DropVizHC'
inter_names<- c("Basket_OLM" ,'CGE',  "Neurogliaform_Lacunosum")
log_l_thresh <- 10
singlet_ind = results_df$first_type == "Interneuron" & results_df$spot_class == "singlet"
singlet_barcodes <- barcodes[singlet_ind]
doublet_barcodes <- c(barcodes[results_df$first_type == "Interneuron" & results_df$spot_class == "doublet_certain"], barcodes[results_df$first_type == "Interneuron" & results_df$spot_class == "doublet_uncertain"],
                      barcodes[results_df$second_type == "Interneuron" & results_df$spot_class == "doublet_certain"])
doub_first <- c(barcodes[results_df$first_type == "Interneuron" & results_df$spot_class == "doublet_certain"], barcodes[results_df$first_type == "Interneuron" & results_df$spot_class == "doublet_uncertain"])
doub_second <- barcodes[results_df$second_type == "Interneuron" & results_df$spot_class == "doublet_certain"]
second_type_list <- unlist(list(results_df[doub_first,]$second_type,results_df[doub_second,]$first_type))
names(second_type_list) <- doublet_barcodes
inter_barcodes <- c(singlet_barcodes, doublet_barcodes)
N = length(inter_barcodes)
inter_df <- data.frame(best_type = factor(character(N),levels = inter_names), confident = logical(N), score_diff = numeric(N))
rownames(inter_df) <- inter_barcodes
i <- 1
for(barcode in singlet_barcodes) {
  print(i)
  i <- i + 1
  score_best <- 100000
  score_second <- 100000
  best_type <- NULL
  for (type in inter_names) {
    score <- get_singlet_score(cell_type_info, gene_list, puck@counts[gene_list,barcode], puck@nUMI[barcode], type, F)
    if(score < score_best) {
      score_second <- score_best
      score_best <- score
      best_type <- type
    } else if(score < score_second) {
      score_second <- score
    }
    inter_df[barcode,type] <- score
  }
  inter_df[barcode,"confident"] <- (score_second - score_best) > log_l_thresh
  inter_df[barcode,"score_diff"] <- (score_second - score_best)
  inter_df[barcode,"best_type"] <- best_type
}

for(barcode in doublet_barcodes) {
  print(i)
  i <- i + 1
  score_best <- 100000
  score_second <- 100000
  best_type <- NULL
  for (type in inter_names) {
    score <- decompose_sparse(cell_type_info[[1]], gene_list, puck@nUMI[barcode], puck@counts[gene_list,barcode], type1=type, type2=as.character(second_type_list[barcode]), score_mode = T, constrain = F)
    if(score < score_best) {
      score_second <- score_best
      score_best <- score
      best_type <- type
    } else if(score < score_second) {
      score_second <- score
    }
    inter_df[barcode,type] <- score
  }
  inter_df[barcode,"confident"] <- (score_second - score_best) > log_l_thresh
  inter_df[barcode,"score_diff"] <- (score_second - score_best)
  inter_df[barcode,"best_type"] <- best_type
}

Plot the confident classification results in space

my_pal <- c("#D55E00","#9E0073", "#0072B2")
conf_inter <- inter_df$confident
barcodes_cur <- inter_barcodes[conf_inter]
new_class <- inter_df$best_type
names(new_class) <- inter_barcodes
counter_barcodes <- barcodes[results_df$spot_class == "singlet" & results_df$first_type %in% c("CA1","CA3","Denate")]
p3 <- plot_class(puck, barcodes_cur, new_class, counter_barcodes = counter_barcodes) + ggplot2::scale_color_manual("",values = my_pal)+ ggplot2::scale_shape_identity() + ggplot2::theme_classic() + ggplot2::scale_size_identity() + coord_fixed() + guides(colour = guide_legend(override.aes = list(size=2)))+ 
  scale_x_continuous(breaks = c(1500,3500,5500), limits = c(1450,5700)) + scale_y_continuous(breaks = c(2000,3250,4500), limits = c(1800,4700)) + theme(legend.position="top") +theme(legend.text=element_text(size=8),legend.spacing.x = unit(0, 'cm'))+geom_segment(aes(x = 1700, y = 2100, xend = 2084.6, yend = 2100), color = "black")+ theme(axis.title.x=element_blank(),axis.text.x=element_blank(),axis.ticks.x=element_blank(), axis.title.y=element_blank(),axis.text.y=element_blank(),axis.ticks.y=element_blank())
ggarrange(p3)
image.png

Spatially cluster interneurons and compute rate of agreement of subclass classifications

d <- dist(puck@coords[inter_barcodes,], method = "euclidean")
hc1 <- hclust(d, method = "average")
num_clusters = 200

my_class <- as.factor(cutree(hc1,k=200))
#manually split doublet spatial clusters
library(plyr)
relabel <- read.csv(file.path('../../Data/SpatialRNA/Puck_200115_08','cluster_relabels.csv'))
for(i in unique(relabel$Cluster))
  relabel[relabel$Cluster==i,"barcodes"] <- mapvalues(relabel[relabel$Cluster==i,]$Index,from = which(rownames(puck@coords) %in% inter_barcodes[my_class==i]), to=inter_barcodes[my_class==i])
rownames(relabel) <- relabel$barcodes
new_labels <- as.character(my_class)
names(new_labels) <- names(my_class)
new_labels[relabel$barcode] <- apply(relabel,1,function(x) paste(x[3],x[2],sep='_')) 
new_labels <- as.factor(new_labels)
new_labels <- mapvalues(new_labels, from = levels(new_labels), to = sample(1:length(levels(new_labels))))

total = 0
agree = 0
total_sq = 0
for(i in levels(new_labels)) {
  these_barcodes = which(new_labels == i & conf_inter)
  if(length(these_barcodes) >= 2) {
    total_sq = total_sq + (length(these_barcodes)*(length(these_barcodes)-1)/2)^2
    total = total + length(these_barcodes)*(length(these_barcodes)-1)/2
    agree = agree + sum(unlist(lapply(table(new_class[these_barcodes]),function(x) x*(x-1)/2)))
  }
}
correct = agree / total
paste("Within cluster agreement: ", correct) # 0.971
std_cor = ((agree / total) - (agree / total)^2)*(total_sq/(total^2))
paste("Std dev: ", std_cor) # 0.009

Compare to Sst gene for reference

my_mod <- function(p) {
  p + scale_x_continuous(breaks = c(1500,3500,5500), limits = c(1450,5700)) + scale_y_continuous(breaks = c(2000,3250,4500), limits = c(1800,4700)) + geom_segment(aes(x = 1700, y = 2100, xend = 2084.6, yend = 2100), color = "black")+ theme(axis.title.x=element_blank(),axis.text.x=element_blank(),axis.ticks.x=element_blank(), axis.title.y=element_blank(),axis.text.y=element_blank(),axis.ticks.y=element_blank())+ theme(legend.position="top")
}
MULT = 500
cur_range = c(0,MULT*0.003)
p4 <-plot_puck_continuous(puck,inter_barcodes,MULT*puck@counts["Sst",inter_barcodes]/puck@nUMI[inter_barcodes],counter_barcodes = counter_barcodes,ylimit=cur_range)
p4 <- my_mod(p4)+ggplot2::scale_colour_gradientn(paste("Sst Expression"), colors = pals::kovesi.rainbow(20), limits = cur_range, breaks = cur_range)
ggarrange(p4)
image.png

Plot all hippocampal cell types

my_mod <- function(p) {
  p + scale_x_continuous(breaks = c(1500,3500,5500), limits = c(1450,5700)) + scale_y_continuous(breaks = c(2000,3250,4500), limits = c(1800,4700)) + geom_segment(aes(x = 1700, y = 2100, xend = 2084.6, yend = 2100), color = "black")+  theme(axis.title.x=element_blank(),axis.text.x=element_blank(),axis.ticks.x=element_blank(), axis.title.y=element_blank(),axis.text.y=element_blank(),axis.ticks.y=element_blank())+ theme(legend.position="top")
}
barcodes = rownames(results_df[results_df$spot_class != "reject" & puck@nUMI >= 200,])
my_table = puck@coords[barcodes,]
my_table$class = results_df[barcodes,]$first_type
n_levels = iv$cell_type_info[[3]]
my_pal = pals::kelly(n_levels+1)[2:(n_levels+1)]
names(my_pal) = iv$cell_type_info[[2]]
my_pal_curr <- my_pal
my_pal_curr["Ependymal"] <- "#D55E00"
my_pal_curr["Interneuron"] <- "#E69F00"
my_pal_curr["CA1"] <- "#56B4E9"
my_pal_curr["Denate"] <- "#009E73"
my_pal_curr["Oligodendrocyte"] <- "#EFCB00"
my_pal_curr["CA3"] <- "#0072B2"
my_pal_curr["Microglia_Macrophages"] <- "#000000"
my_pal_curr["Astrocyte"] <- "#CC79A7"
my_pal_curr["Choroid"] <- my_pal["Oligodendrocyte"]
my_pal_curr["Entorihinal"] <- my_pal["CA3"]
pres = unique(as.integer(my_table$class))
pres = pres[order(pres)]
p1 <- ggplot2::ggplot(my_table, ggplot2::aes(x=x, y=y)) + ggplot2::geom_point(ggplot2::aes(size = .05, shape=19,color=class)) + ggplot2::scale_color_manual("",values = my_pal_curr[pres],breaks = c('Astrocyte','Denate','Interneuron','Oligodendrocyte','Microglia_Macrophages','Ependymal','CA1','CA3'), labels = c('Astrocyte','Dentate','Interneuron','Oligo','Microglia','Ependymal','CA1','CA3'))+ ggplot2::scale_shape_identity() + ggplot2::theme_classic() + ggplot2::scale_size_identity() + coord_fixed() + guides(colour = guide_legend(override.aes = list(size=2)))+ theme(legend.position="top") +theme(legend.text=element_text(size=8),legend.spacing.x = unit(0, 'cm'))
p1 <- my_mod(p1)

ggarrange(p1)
image.png

Find marker genes

get_marker_data <- function(cell_type_names, cell_type_means, gene_list) {
  marker_means = cell_type_means[gene_list,]
  marker_norm = marker_means / rowSums(marker_means)
  marker_data = as.data.frame(cell_type_names[max.col(marker_means)])
  marker_data$max_epr <- apply(cell_type_means[gene_list,],1,max)
  colnames(marker_data) = c("cell_type",'max_epr')
  rownames(marker_data) = gene_list
  marker_data$log_fc <- 0
  epsilon <- 1e-9
  for(cell_type in unique(marker_data$cell_type)) {
    cur_genes <- gene_list[marker_data$cell_type == cell_type]
    other_mean = rowMeans(cell_type_means[cur_genes,cell_type_names != cell_type])
    marker_data$log_fc[marker_data$cell_type == cell_type] <- log(epsilon + cell_type_means[cur_genes,cell_type]) - log(epsilon + other_mean)
  }
  return(marker_data)
}

iv <- init_RCTD(load_info_renorm = T)
cur_cell_types <- c("Astrocyte","CA1","CA3","Denate","Interneuron","Neurogenesis","Oligodendrocyte")
puck <- readRDS('../../data/SpatialRNA/Puck_200115_08/puckCropped.RDS')
reference <- readRDS('../../data/Reference/DropVizHC/scRefSubsampled1000.RDS')
myRCTD <- create.RCTD(puck, reference)
cell_type_info_restr = myRCTD@cell_type_info$info
cell_type_info_restr[[1]] = cell_type_info_restr[[1]][,cur_cell_types]
cell_type_info_restr[[2]] = cur_cell_types; cell_type_info_restr[[3]] = length(cur_cell_types)

de_genes <- get_de_genes(cell_type_info_restr, puck, fc_thresh = 3, expr_thresh = .0001, MIN_OBS = 3)
#de_genes_spec <- get_de_genes(cell_type_info_restr, puck, fc_thresh = 4, expr_thresh = .0001, MIN_OBS = 3)
marker_data_de = get_marker_data(cell_type_info_restr[[2]], cell_type_info_restr[[1]], de_genes)
saveRDS(marker_data_de, '../../data/SpatialRNA/Puck_200115_08/results/marker_data_de_standard.RDS')

Plot interneurons (by RCTD) and interneuron markers

my_pal = pals::brewer.blues(20)[2:20]
cell_type = "Interneuron"
marker_data_de <- readRDS('../../Data/SpatialRNA/Puck_200115_08/results/marker_data_de_standard.RDS')
cur_range <- c(0,0.010*MULT)
gran_genes <- intersect(rownames(marker_data_de[marker_data_de$cell_type == cell_type,]), rownames(puck@counts))
p7 <- RCTD::plot_puck_continuous(puck,colnames(puck@counts)[puck@nUMI >= 300], MULT*colSums(puck@counts[gran_genes,])/puck@nUMI, ylimit = cur_range, size = .4, alpha = 1, small_point = T)
p7 <- my_mod(p7)+ggplot2::scale_colour_gradientn(paste(cell_type,"Markers"), colors = my_pal, limits = cur_range, breaks = cur_range)

cur_range <- c(0,1)
all_weights <- results$weights_doublet[puck@nUMI >= 300 & results_df$spot_class == "doublet_certain" & results_df$second_type == cell_type,2, drop=FALSE]
all_weights <- rbind(all_weights, results$weights_doublet[puck@nUMI >= 100 & !(results_df$spot_class == "reject") & results_df$first_type == cell_type,1,drop=FALSE])
all_weights_vec <- as.vector(all_weights); names(all_weights_vec) <- rownames(all_weights)
p8 <- RCTD::plot_puck_continuous(puck, rownames(all_weights), all_weights_vec, ylimit = cur_range, size = .6, alpha = 1, small_point = T)
p8 <- my_mod(p8)+ggplot2::scale_colour_gradientn(paste(cell_type,"Weight"), colors = my_pal, limits = cur_range, breaks = cur_range)
ggarrange(p7,p8,nrow=1,ncol=2)
image.png

生活很好戈锻,有你更好

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者和媳。
  • 序言:七十年代末格遭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子窗价,更是在濱河造成了極大的恐慌如庭,老刑警劉巖叹卷,帶你破解...
    沈念sama閱讀 205,874評論 6 479
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撼港,死亡現(xiàn)場離奇詭異坪它,居然都是意外死亡,警方通過查閱死者的電腦和手機帝牡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,151評論 2 382
  • 文/潘曉璐 我一進店門往毡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人靶溜,你說我怎么就攤上這事开瞭。” “怎么了罩息?”我有些...
    開封第一講書人閱讀 152,270評論 0 342
  • 文/不壞的土叔 我叫張陵嗤详,是天一觀的道長。 經(jīng)常有香客問我瓷炮,道長葱色,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,137評論 1 278
  • 正文 為了忘掉前任娘香,我火速辦了婚禮苍狰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烘绽。我一直安慰自己淋昭,他們只是感情好,可當我...
    茶點故事閱讀 64,116評論 5 370
  • 文/花漫 我一把揭開白布安接。 她就那樣靜靜地躺著翔忽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赫段。 梳的紋絲不亂的頭發(fā)上呀打,一...
    開封第一講書人閱讀 48,935評論 1 283
  • 那天,我揣著相機與錄音糯笙,去河邊找鬼贬丛。 笑死,一個胖子當著我的面吹牛给涕,可吹牛的內(nèi)容都是我干的豺憔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,261評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼够庙,長吁一口氣:“原來是場噩夢啊……” “哼恭应!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起耘眨,我...
    開封第一講書人閱讀 36,895評論 0 259
  • 序言:老撾萬榮一對情侶失蹤昼榛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后剔难,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胆屿,經(jīng)...
    沈念sama閱讀 43,342評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡奥喻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,854評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了非迹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片环鲤。...
    茶點故事閱讀 37,978評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖憎兽,靈堂內(nèi)的尸體忽然破棺而出冷离,到底是詐尸還是另有隱情,我是刑警寧澤纯命,帶...
    沈念sama閱讀 33,609評論 4 322
  • 正文 年R本政府宣布西剥,位于F島的核電站,受9級特大地震影響亿汞,放射性物質(zhì)發(fā)生泄漏蔫耽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,181評論 3 307
  • 文/蒙蒙 一留夜、第九天 我趴在偏房一處隱蔽的房頂上張望匙铡。 院中可真熱鬧,春花似錦碍粥、人聲如沸鳖眼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,182評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钦讳。三九已至,卻和暖如春枕面,著一層夾襖步出監(jiān)牢的瞬間愿卒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,402評論 1 260
  • 我被黑心中介騙來泰國打工潮秘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留琼开,地道東北人。 一個月前我還...
    沈念sama閱讀 45,376評論 2 352
  • 正文 我出身青樓枕荞,卻偏偏與公主長得像柜候,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子躏精,可洞房花燭夜當晚...
    茶點故事閱讀 42,677評論 2 344

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