【10X空間轉錄組Visium】(六)新版Seurat v3.2分析Visium空間轉錄組結果的代碼實操

舊號無故被封,小號再發一次

更多空間轉錄組文章:

1. 新版10X Visium
2. 舊版Sptial

環境說明:
為了避免與之前的Seurat包沖突,當前環境沒有安裝之前的Seurat版本的win10 Rstudio,而非服務器生產環境

一、Seurat v3.2 對空間轉錄組Visium的結果分析中實現的功能:

  • 歸一化
  • 降維和聚類
  • 檢測空間可變特征(spatially-variable features)
  • 互動式的可視化
  • 與單細胞RNA-seq數據整合
  • 處理多個切片

二、安裝Seurat v3.2 :

#For learning Seurat v2.3
#Author:Robin 2019.12.22
# Enter commands in R (or R studio, if installed)

# Install the devtools package from Hadley Wickham
install.packages("devtools")

devtools::install_github("satijalab/seurat", ref = "spatial")
devtools::install_github('satijalab/seurat-data')

一開始嘗試了幾次都裝不成功,后面突然就行了,而且網速還很快,果然是看運氣的。。

成功安裝!

> library(Seurat)
> package.version("Seurat")
[1] "3.1.2"  #說是官網v3.2,實際上是v3.1.2

加載包:

library(Seurat)
library(SeuratData)
library(ggplot2)
library(cowplot)
library(dplyr)

對于第一個小插圖,我們分析了使用10x Genomics 的Visium技術生成的數據集。我們將擴展Seurat以便在不久的將來使用其他數據類型,包括SLIDE-SeqSTARmapMERFISH

三、下載數據集(但一般不這么做)

在這里,我們將使用使用Visium v??1化學方法生成的最近發布的矢狀小鼠大腦切片數據集。小鼠大腦的矢狀面前段后段(There are two serial anterior sections, and two (matched) serial posterior sections.)

  • 這將讀取spaceranger管道的輸出,并返回一個Seurat對象,該對象包含spot-level表達數據以及組織切片的關聯圖像。
  • 您還可以使用我們的SeuratData包來輕松訪問數據,如下所示。安裝數據集后,您可以鍵入?stxBrain以了解更多信息。
InstallData("stxBrain")
brain <- LoadData("stxBrain", type = "anterior1")

由于國內網速很慢,建議直接在此處下載數據包到本地,然后使用Load10X_Spatial函數將其加載到Seurat中。

四、加載10X Visiumspaceranger管道中生成的結果文件

在生產中,我們實際上加載的數據集通常是自己經過Visium spaceranger管道生成的結果文件,而非直接從網上下載的數據集。

從10X Visium流程中生成結果文件的方法: 10X空間轉錄組Visium學習筆記(三)跑通Visium全流程記錄

查看目錄結構

$cd /V1_Adult_Mouse_Brain/outs
$tree -L 2
.
├── analysis
│   ├── clustering
│   ├── diffexp
│   ├── pca
│   ├── tsne
│   └── umap
├── cloupe.cloupe
├── filtered_feature_bc_matrix
│   ├── barcodes.tsv.gz
│   ├── features.tsv.gz
│   └── matrix.mtx.gz
├── filtered_feature_bc_matrix.h5  #實際上需要的文件①
├── metrics_summary.csv
├── molecule_info.h5
├── possorted_genome_bam.bam
├── possorted_genome_bam.bam.bai
├── raw_feature_bc_matrix
│   ├── barcodes.tsv.gz
│   ├── features.tsv.gz
│   └── matrix.mtx.gz
├── raw_feature_bc_matrix.h5
├── spatial  # 實際上需要的文件②;記錄空間信息:用戶提供的原始全分辨率brightfield圖像的下采樣版本。下采樣是通過box濾波實現的,它對全分辨率圖像中像素塊的RGB值進行平均,得到下采樣圖像中一個像素點的RGB值。
│   ├── aligned_fiducials.jpg 
│   ├── detected_tissue_image.jpg
│   ├── scalefactors_json.json
│   ├── tissue_hires_image.png
│   ├── tissue_lowres_image.png
│   └── tissue_positions_list.csv
└── web_summary.html

9 directories, 20 files

加載數據
此處是將服務器之前跑的Space Ranger的輸出結果 filtered_feature_bc_matrix.h5文件和一個spatial文件夾放置到本地win10環境中test/目錄下


讀取文件需要安裝好hdf5r

> brain<-Load10X_Spatial(
+   data.dir = 'E:\\BioInfo\\DATA\\Visium\\test',  #該目錄包含10X提供的matrix.mtx,genes.tsv(或features.tsv)和barcodes.tsv文件。
+   assay = "Spatial",
+   slice = "slice1",  #組織切片存儲圖像的名稱
+   filter.matrix = TRUE, #僅保留已確定位于組織上方的spot
+   to.upper = FALSE, #將所有功能名稱轉換為大寫。 例如,當分析需要在人類和小鼠基因名稱之間進行比較時,該功能將非常有用。
+ )
# 查看Seurat對象信息
> brain
An object of class Seurat 
31053 features across 2698 samples within 1 assay 
Active assay: Spatial (31053 features)

當然,也可以?stxBrain會給出類似10X ATAC構建Seurat對象那種方法,不過可能有些麻煩:Seurat 新版教程:分析空間轉錄組數據

Seurat中如何存儲空間數據?

來自10x的visium數據包含以下數據類型:

  • 基因表達矩陣的點
  • 組織切片的圖像(從數據采集期間的H&E染色獲得)
  • 原始高分辨率圖像此處用于可視化的較低分辨率圖像相關聯的比例因子
  • 在Seurat對象中,基因表達矩陣的spot類似于典型的“ RNA”Assay ,但它包含spot水平,而不是單細胞水平數據。
  • 圖像本身存儲在Seurat對象的images新插槽中。
  • 所述images槽圖還存儲必要的信息,以將spot與其在組織圖像上的物理位置相關聯
    Seurat對象結構跟以前差不多

五、數據預處理

1. 數據標準化 Normalization

與scRNA-seq實驗相似。除了測序深度的差異,對于空間數據集,分子計數/spot的差異可能很大,尤其是如果整個組織的細胞密度存在差異時。

plot1 <- VlnPlot(brain, features = "nCount_Spatial", pt.size = 0.5) + NoLegend()
plot2 <- SpatialFeaturePlot(brain, features = "nCount_Spatial") + theme(legend.position = "right")
plot_grid(plot1, plot2)
  • 這些圖表明,分子計數(molecular counts)在點間的差異不僅是技術上的,而且還取決于組織的解剖結構(組織中神經元耗竭的區域(如皮層白質),可重復顯示較低的分子數)
  • 因此,標準方法(如LogNormalize函數)可能會有問題,因為它會強制每個數據點在標準化之后具有相同的底層“大小”underlying ‘size’
  • 作為一種替代方法,建議使用sctransform (Hafemeister和Satija,已出版),它構建了基因表達的正則化負二項模型,以便在保留生物學差異的同時考慮技術偽像。

有關sctransform的更多信息,請參見 here的預印和here的Seurat教程。sctransform將數據歸一化,檢測高方差特征high-variance features,并將數據存儲在SCTassay中。

brain <- SCTransform(brain, assay = "Spatial", verbose = FALSE)
  • sct 與 log-normalization的比較
    為了探索規范化方法的差異,我們檢查了sctransform和log規范化結果如何與UMI數量相關。

為了進行比較,我們首先重新運行sctransform以存儲所有基因的值,然后通過NormalizeData進行 log-normalization 過程。

# rerun normalization to store sctransform residuals for all genes
brain <- SCTransform(brain, assay = "Spatial", return.only.var.genes = FALSE, verbose = FALSE)
# also run standard log normalization for comparison
brain <- NormalizeData(brain, verbose = FALSE, assay = "Spatial") #這步有些慢

第一次運行NormalizeData的報錯:"Error: std::bad_alloc".

解決方法:可能是內存不夠,關掉了沒用的網頁,重新打開Rstudio重新運行,問題解決。

# Computes the correlation of the log normalized data and sctransform residuals with the number of UMIs
brain <- GroupCorrelation(brain, group.assay = "Spatial", assay = "Spatial", slot = "data", do.plot = FALSE)
brain <- GroupCorrelation(brain, group.assay = "Spatial", assay = "SCT", slot = "scale.data", do.plot = FALSE)

p1 <- GroupCorrelationPlot(brain, assay = "Spatial", cor = "nCount_Spatial_cor") + ggtitle("Log Normalization") + 
  theme(plot.title = element_text(hjust = 0.5))
p2 <- GroupCorrelationPlot(brain, assay = "SCT", cor = "nCount_Spatial_cor") + ggtitle("SCTransform Normalization") + 
  theme(plot.title = element_text(hjust = 0.5))
p3 <- plot_grid(p1, p2)
ggsave(p3, filename = "lOG_VS_SCT.png")
  • 對于上面的箱線圖,我們計算每個特征(基因)與UMI數量(此處為變量nCount_Spatial)的相關性。然后,我們根據基因的平均表達量將基因分組,并生成這些相關系數的箱線圖。
  • 您可以看到 log-normalization 未能使前三組中的基因充分歸一化,這表明技術因素繼續影響高表達的基因的歸一化表達估計值。相反,sctransform歸一化實質上減輕了這種影響。

六、基因表達可視化

在Seurat v3.2中,我們加入了新的功能來探索和與空間數據固有的可視化特性。

Seurat的SpatialFeaturePlot函數擴展了FeaturePlot, 可以將表達數據覆蓋在組織組織上。例如,在這個小鼠大腦數據中,Hpca基因是一個強烈的海馬區(hippocampal )marker ,Ttr是一個脈絡叢(choroid plexus)marker。

SpatialFeaturePlot(brain, features = c("Hpca", "Ttr"))
看到的區域很明顯了

Seurat中的默認參數強調分子數據的可視化。但是,您還可以通過更改以下參數來調整斑點的大小(及其透明度),以改善組織學圖像的可視化:

  • pt.size.factor-這將縮放斑點的大小。默認值為1.6
  • alpha-最小和最大透明度。默認值為c(1,1)。
  • 嘗試設置為alphac(0.1,1),以降低具有較低表達的點的透明度
p1 <- SpatialFeaturePlot(brain, features = "Ttr", pt.size.factor = 1)
p2 <- SpatialFeaturePlot(brain, features = "Ttr", alpha = c(0.1, 1))
plot_grid(p1, p2)

七、降維,聚類和可視化

然后,我們可以使用與scRNA-seq分析相同的工作流程,對RNA表達數據進行降維和聚類。

brain <- RunPCA(brain, assay = "SCT", verbose = FALSE)  #選擇SCT歸一化的assay
brain <- FindNeighbors(brain, reduction = "pca", dims = 1:30)
brain <- FindClusters(brain, verbose = FALSE)
brain <- RunUMAP(brain, reduction = "pca", dims = 1:30)

再然后,我們可以在UMAP空間(使用DimPlot)或使用SpatialDimPlot將聚類clustering的結果顯示在圖像上

p1 <- DimPlot(brain, reduction = "umap", label = TRUE)
p2 <- SpatialDimPlot(brain, label = TRUE, label.size = 3)
plot_grid(p1, p2)

由于顏色太多,因此可視化哪個立體像素voxel屬于哪個cluster可能是一個挑戰。
解決方案:

  • 設置label參數會在每個cluster的中間處放置一個彩色框(請參見上圖),
  • 而SpatialDimPlot的do.hover參數允許交互式地查看當前點的標識。
# move your mouse
SpatialDimPlot(brain, do.hover = TRUE)
選擇操作與Loupe Browser差不多

您還可以在SpatialDimPlot上使用cells.highlight參數在上劃分特定的關注細胞,這對于區分單個cluster的空間定位非常有用。如下所示:

SpatialDimPlot(brain, cells.highlight = CellsByIdentities(object = brain, idents = c(1, 2, 5, 3, 
4, 8)), facet.highlight = TRUE, ncol = 3)

感覺自己畫出來沒有官網出來的效果好

此外,LinkedDimPlotLinkedFeaturePlot函數支持交互式可視化。這些圖將UMAP表示與組織圖像表示聯系起來,并允許交互選擇。例如,您可以在UMAP圖中選擇一個區域,圖像表示中相應的點將突出顯示。

LinkedDimPlot(brain)
顏色是對應的

八、識別空間可變特征

Seurat提供了兩種工作流程來識別與組織內空間位置相關的分子特征。

  • 第一種方法,是基于組織內預先標注的解剖區域執行差異表達,這可以從無監督聚類或先驗知識中確定。在這種情況下,此策略將起作用,因為上面的cluster顯示出明顯的空間限制。
de_markers <- FindMarkers(brain, ident.1 = 0, ident.2 = 1)
SpatialFeaturePlot(object = brain, features = rownames(de_markers)[1:3], alpha = c(0.1, 1), ncol = 3)
嗯,這個看起來就很好看
  • 第二種方法FindSpatiallyVariables在中實施的是在沒有預先注釋的情況下搜索展現出空間模式spatial patterning的特征。

    默認參數(method = 'markvariogram)受Trendsceek啟發,該工具將空間轉錄組學數據建模為標記點過程(mark point process),并計算“variogram”,以識別其表達水平取決于其空間位置的基因。更具體地說,此過程計算 gamma(r) 值,該值測量相距某個“ r”距離的兩個點之間的依賴性。默認情況下,我們在這些分析中使用 r-value為“ 5”,并且僅計算可變基因的這些值(變異variation的計算獨立于空間位置)以節省時間。

文獻中有多種方法可以完成此類任務,包括SpatialDESplotch。Seurat團隊鼓勵感興趣的用戶探索這些方法,并希望在不久的將來為其提供支持。

現在,我們可視化此方法確定的前6個特征的表達情況。

top.features <- head(SpatiallyVariableFeatures(brain, selection.method = "markvariogram"), 6)
SpatialFeaturePlot(brain, features = top.features, ncol = 3, alpha = c(0.1, 1))

這步可能有點久

九、可視化解剖區域中取子集(Subset out)

與單細胞對象一樣,您可以對對象進行取子集操作,以便重點集中在處理數據的子集。在這里,我們大概將額葉皮層(frontal cortex)進行取子集操作。此過程還有助于在下一節中將這些數據與皮質(cortical )scRNA-seq數據集整合。

PS:取得子集這步目前還是有些坑
具體請看:http://www.lxweimin.com/p/497efa6b727f

所以這里往下的我都是用官網的結果,還沒有嘗試自己跑

  • 首先,我們獲取clusters的子集
cortex <- subset(brain, idents = c(1, 2, 3, 5, 6, 7))
  • 然后根據精確位置進一步細分。
# now remove additional cells, use SpatialDimPlots to visualize what to remove
# SpatialDimPlot(cortex,cells.highlight = WhichCells(cortex, expression = image_imagerow > 400 |
# image_imagecol < 150))
cortex <- subset(cortex, anterior1_imagerow > 400 | anterior1_imagecol < 150, invert = TRUE)
cortex <- subset(cortex, anterior1_imagerow > 275 & anterior1_imagecol > 370, invert = TRUE)
cortex <- subset(cortex, anterior1_imagerow > 250 & anterior1_imagecol > 440, invert = TRUE)
  • 取子集后,我們可以在完整圖像或裁剪圖像上對皮質細胞進行可視化。
p1 <- SpatialDimPlot(cortex, crop = TRUE, label = TRUE)
p2 <- SpatialDimPlot(cortex, crop = FALSE, label = TRUE, pt.size.factor = 1, label.size = 3)
plot_grid(p1, p2)

十、與單細胞數據整合進行聯合分析(10X一貫的玩法)

  • 在?50um時,來自于visium測定的 spots 將涵蓋多個細胞的表達譜。對于可獲得scRNA-seq數據的系統列表不斷增長,用戶可能有興趣對每個空間體素voxels進行“反卷積”以預測細胞類型的潛在組成。在準備此小插圖時,我們使用了參考scRNA-seq數據集測試了多種反卷積和整合方法decovonlution and integration

反褶積是對一個信號進行濾波以補償一個不需要的卷積的過程。反褶積的目的是重現卷積之前的信號。

  • 使用SMART-Seq2協議生成的來自Allen研究所的約14,000個成年小鼠皮質細胞分類學。我們一直發現使用整合方法integration (而不是反卷積方法)具有優越的性能,這可能是由于描述 空間和單細胞數據集的特征的 噪聲模型存在很大差異,并且整合方法經過專門設計以對這些差異具有穩健性。

  • 因此,我們應用了Seurat v3中最近引入的基于“錨”的集成工作流 ‘anchor’-based integration workflow ,該工作流使注釋能夠從reference到查詢集的概率轉移probabilistic transfer。因此,我們利用sctransform歸一化方法遵循此處介紹的標簽轉移工作流程,但期望新的方法來將被開發完成此任務。

我們首先加載數據(可在此處下載),對scRNA-seq參考進行預處理,然后執行標簽轉移。該過程為每個點輸出每個scRNA-seq派生類的概率分類(a probabilistic classification for each of the scRNA-seq derived classes)。我們將這些預測添加作為Seurat對象中的新測定。

allen_reference <- readRDS("~/Downloads/allen_cortex.rds")
# note that setting ncells=3000 normalizes the full dataset but learns noise models on 3k cells
# this speeds up SCTransform dramatically with no loss in performance
library(dplyr)
allen_reference <- SCTransform(allen_reference, ncells = 3000, verbose = FALSE) %>% RunPCA(verbose = FALSE) %>% 
    RunUMAP(dims = 1:30)
# After subsetting, we renormalize cortex
cortex <- SCTransform(cortex, assay = "Spatial", verbose = FALSE) %>% RunPCA(verbose = FALSE)
# the annotation is stored in the 'subclass' column of object metadata
DimPlot(allen_reference, group.by = "subclass", label = TRUE)

嗯,然后是經典的FindAnchor

anchors <- FindTransferAnchors(reference = allen_reference, query = cortex, normalization.method = "SCT")
predictions.assay <- TransferData(anchorset = anchors, refdata = allen_reference$subclass, prediction.assay = TRUE, 
    weight.reduction = cortex[["pca"]])
cortex[["predictions"]] <- predictions.assay

現在我們獲得每個class的每個的預測得分。在額葉皮層區域中特別感興趣的是層狀興奮性神經元。在這里,我們可以區分這些神經元亞型的不同順序層,例如:的預測得分。在額葉皮層區域中特別感興趣的是層狀興奮性神經元。在這里,我們可以區分這些神經元亞型的不同順序層sequential layers ,例如:

DefaultAssay(cortex) <- "predictions"
SpatialFeaturePlot(cortex, features = c("L2/3 IT", "L4"), pt.size.factor = 1.6, ncol = 2, crop = TRUE)

基于這些預測分數,我們還可以預測位置受空間限制的細胞類型。我們使用基于marked point processes的相同方法來定義空間可變特征,但是是將細胞類型預測得分用作“marks”而不是基因表達。

cortex <- FindSpatiallyVariableFeatures(cortex, assay = "predictions", features = rownames(cortex), 
    r.metric = 5, slot = "data")
top.clusters <- head(SpatiallyVariableFeatures(cortex), 4)
SpatialPlot(object = cortex, features = top.clusters, ncol = 2)

最后,我們證明我們的整合程序能夠恢復神經元和非神經元子集的已知空間定位模式,包括層狀興奮性、 layer-1 星形膠質細胞和皮質灰質。


十一、在Seurat中處理多個切片

小鼠大腦的該數據集包含與大腦另一半相對應的另一個切片。在這里,我們將其讀入并執行相同的初始歸一化。

brain2 <- LoadData("stxBrain", type = "posterior1")
brain2 <- SCTransform(brain2, assay = "Spatial", verbose = FALSE)

為了在同一個Seurat對象中使用多個切片,我們提供了該merge函數。

brain.merge <- merge(brain, brain2)

然后,這就使得能夠用聯合降維并在RNA表達數據的基礎上聚類。

DefaultAssay(brain.merge) <- "SCT"
VariableFeatures(brain.merge) <- c(VariableFeatures(brain), VariableFeatures(brain2))
brain.merge <- RunPCA(brain.merge, verbose = FALSE)
brain.merge <- FindNeighbors(brain.merge, dims = 1:30)
brain.merge <- FindClusters(brain.merge, verbose = FALSE)
brain.merge <- RunUMAP(brain.merge, dims = 1:30)

最后,可以在單個UMAP圖中共同進行數據可視化。SpatialDimPlotSpatialFeaturePlot默認情況下會將所有切片繪制為列,將groupings/features繪制為行。

DimPlot(brain.merge, reduction = "umap", group.by = c("ident", "orig.ident"))
SpatialDimPlot(brain.merge)
SpatialFeaturePlot(brain.merge, features = c("Hpca", "Plp1"))

參考文章

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容