Skip to content

SeekSpace 高级分析:基于 scider 的细胞密度与共定位

作者: SeekGene
时长: 19 分钟
字数: 4.3k 字
更新: 2026-02-28
阅读: 0 次
空间转录组 分析指南 Notebooks 共定位分析

加载数据

执行环境选择 TumorBoundary
scider 是一个 R 包,提供了针对空间转录组的一下分析和可视化功能。分析基于 SpatialExperiment 对象,可以集成到 Bioconductor 的各种空间转录组学相关软件包中。 分析内容主要包括:

  • 特定细胞密度分布图
  • 细胞共定位
  • 自动检测感兴趣区域(ROI)
  • 特定细胞等高线图以及每个等高线内部细胞组成

scider 是一个用户友好的 R 软件包,提供了在空间转录组学数据幻灯片中模拟细胞全局密度的功能。该软件包中的所有功能都是基于 SpatialExperiment 对象构建的,可以集成到 Bioconductor 的各种空间转录组学相关软件包中。在对密度建模之后,该软件包允许进行多个下游分析,包括共定位分析,边界检测分析和差分密度分析。 scider 通过密度估计进行细胞类型相关和通过实数距离进行细胞类型共定位,实现了用细胞类型注释分析空间转录组学数据的功能。功能包括密度估计、统计建模和可视化。

在空间转录组学数据切片中模拟细胞全局密度的功能。该软件包中的所有功能都是基于 SpatialExperiment 对象构建的,可以集成到 Bioconductor 的各种空间转录组学相关软件包中。该软件包还可以进行多个下游分析,包括共定位分析,边界检测分析和差分密度分析。
数据主要需要表达矩阵和空间坐标,可以直接读取三个矩阵文件和空间坐标文件,也可以从 rds 中提取。

R
expr_matrix <- Read10X('/PROJ2/FLOAT/weichendan/seekspace/WTH1092/demo_WTH1092/Outs/WTH1092_filtered_feature_bc_matrix/')
R
dim(expr_matrix)
expr_matrix[1:5,1:5]
  1. 32285
  2. 32758
5 x 5 sparse Matrix of class "dgCMatrix"
        AACAGGGTACTGAGGCTAAGGCACTAT AAGCGAGTACATGCAGTGCTCTGCTTC
Xkr4                              .                           .
Gm1992                            .                           .
Gm19938                           .                           .
Gm37381                           .                           .
Rp1                               .                           .
        AAGCGTTTACGTTCTACAGCGACGGAT AAGTCGTCGACTCTAGAGCTCTGCTTC
Xkr4                              .                           .
Gm1992                            .                           .
Gm19938                           .                           .
Gm37381                           .                           .
Rp1                               .                           .
        AATGCCATACGCAGGTTCTAAGTACGA
Xkr4                              .
Gm1992                            .
Gm19938                           .
Gm37381                           .
Rp1                               .
R
spatial_coords <- read.table("/PROJ2/FLOAT/weichendan/seekspace/WTH1092/demo_WTH1092/Outs/WTH1092_filtered_feature_bc_matrix/cell_locations.tsv.gz",header=T,row.names=1)
colnames(spatial_coords) <- c("spatial_1","spatial_2")
spatial_coords <- spatial_coords[colnames(expr_matrix),]
spatial_coords <- as.matrix(spatial_coords)
R
dim(spatial_coords)
head(spatial_coords)
  1. 32758
  2. 2
A matrix: 6 × 2 of type int
spatial_1spatial_2
AACAGGGTACTGAGGCTAAGGCACTAT35374 4592
AAGCGAGTACATGCAGTGCTCTGCTTC3792317104
AAGCGTTTACGTTCTACAGCGACGGAT3586618687
AAGTCGTCGACTCTAGAGCTCTGCTTC3448017330
AATGCCATACGCAGGTTCTAAGTACGA4405514412
ACAGAAATACGGCAGTCTTCTGCGCTC15652 6521

创建 SpatialExperiment 对象

scider 分析是基于 SpatialExperiment 对象,在构建了 SpatialExperiment 对象后,可以添加对于细胞细胞的各种注释和分群信息

R
spe <- SpatialExperiment(
  assays = list(counts = expr_matrix),          # 表达矩阵,通常命名为 "counts"
  spatialCoords = spatial_coords                # 空间坐标
)
R
spe
output
class: SpatialExperiment
dim: 32285 32758
metadata(0):
assays(1): counts
rownames(32285): Xkr4 Gm1992 ... AC234645.1 AC149090.1
rowData names(0):
colnames(32758): AACAGGGTACTGAGGCTAAGGCACTAT
AAGCGAGTACATGCAGTGCTCTGCTTC ... TGCTTGCGCTGGCAGATCCTAATAACG
TCACAAGATGCGTATAAAGCGACGGAT
colData names(1): sample_id
reducedDimNames(0):
mainExpName: NULL
altExpNames(0):
spatialCoords names(2) : spatial_1 spatial_2
imgData names(0):
R
anno <- read.table("/PROJ2/FLOAT/weichendan/seekspace/WTH1092/annotation.csv",header = T, sep = ',')
R
dim(anno)
head(anno)
  1. 32758
  2. 2
A data.frame: 6 × 2
Sub_CellTypeMain_CellType
<chr><chr>
AACAGGGTACTGAGGCTAAGGCACTATUnknownUnknown
AAGCGAGTACATGCAGTGCTCTGCTTCUnknownUnknown
AAGCGTTTACGTTCTACAGCGACGGATUnknownUnknown
AAGTCGTCGACTCTAGAGCTCTGCTTCUnknownUnknown
AATGCCATACGCAGGTTCTAAGTACGAUnknownUnknown
ACAGAAATACGGCAGTCTTCTGCGCTCUnknownUnknown
R
colData(spe) <- cbind(colData(spe), anno)
R
spe
output
class: SpatialExperiment
dim: 32285 32758
metadata(0):
assays(1): counts
rownames(32285): Xkr4 Gm1992 ... AC234645.1 AC149090.1
rowData names(0):
colnames(32758): AACAGGGTACTGAGGCTAAGGCACTAT
AAGCGAGTACATGCAGTGCTCTGCTTC ... TGCTTGCGCTGGCAGATCCTAATAACG
TCACAAGATGCGTATAAAGCGACGGAT
colData names(3): sample_id Sub_CellType Main_CellType
reducedDimNames(0):
mainExpName: NULL
altExpNames(0):
spatialCoords names(2) : spatial_1 spatial_2
imgData names(1): sample_id
R
options(repr.plot.height=7, repr.plot.width=10)
plotSpatial(spe, group.by = "Sub_CellType", pt.alpha = 1,pt.size = 0.5,pt.shape = 16)

基于网格的分析

scider 能够对空间转录组数据进行基于网格的密度分析。

密度计算

使用函数 gridDensity 对每种细胞类型进行密度计算。计算出的密度和网格信息保存在 SpatialExperimnet 对象的元数据中。

R
spe <- gridDensity(spe,id = "Sub_CellType")
output
Warning message:
“data contain duplicated points”
Warning message:
“data contain duplicated points”
Warning message:
“data contain duplicated points”
Warning message:
“data contain duplicated points”
R
names(metadata(spe))
  1. 'grid_density'
  2. 'grid_info'
R
Sys.setenv(PROJ_LIB = "/PROJ2/FLOAT/weichendan/software/micromamba/envs/TumorBoundary/share/proj")
plotDensity(spe, probs = 0)

图注:整个组织上所有细胞的细胞密度。

R
unique(colData(spe)$Sub_CellType)
  1. 'Unknown'
  2. 'Endo'
  3. 'Ext_Thal_Unk'
  4. 'Inh'
  5. 'Astro'
  6. 'Ext_Hpc_DG'
  7. 'OPC'
  8. 'Ext_Hpc_CA2'
  9. 'Oligo'
  10. 'Micro'
  11. 'Inh_Pvalb'
  12. 'Ext_Hpc_CA1'
  13. 'Inh_Sst'
  14. 'Ependymal'
  15. 'Ext_L56_1'
  16. 'Ext_ClauPyr'
  17. 'Ext_Thal'
  18. 'Ext_L23'
  19. 'Inh_Vip_Lamp5'
  20. 'Ext_L25'
  21. 'Ext_L56_3'
  22. 'Ext_L56_2'
  23. 'Ext_L5'
  24. 'Ext_Unk'
R
plotDensity(spe, coi = "Ext_Hpc_DG",probs = 0)

图注:整个组织上指定细胞(Ext_Hpc_DG)类型的细胞密度。

通过算法检测感兴趣区域(ROI)

在获得每个 COI 的基于网格的密度后,我们可以根据密度或用户选择来检测感兴趣区域(ROI)。
为了自动检测 ROI,我们可以使用函数 findROI。检测到的 ROI 保存在 SpatialExperiment 对象的元数据中。
在这里,我们根据 Ext_Hpc_DG 细胞密度确定 ROI。

R
spe <- findROI(spe, coi = "Ext_Hpc_DG")
R
spe
output
class: SpatialExperiment
dim: 32285 32758
metadata(3): grid_density grid_info ext_hpc_dg_roi
assays(1): counts
rownames(32285): Xkr4 Gm1992 ... AC234645.1 AC149090.1
rowData names(0):
colnames(32758): AACAGGGTACTGAGGCTAAGGCACTAT
AAGCGAGTACATGCAGTGCTCTGCTTC ... TGCTTGCGCTGGCAGATCCTAATAACG
TCACAAGATGCGTATAAAGCGACGGAT
colData names(3): sample_id Sub_CellType Main_CellType
reducedDimNames(0):
mainExpName: NULL
altExpNames(0):
spatialCoords names(2) : x_centroid y_centroid
imgData names(1): sample_id
R
metadata(spe)$ext_hpc_dg_roi
output
DataFrame with 11883 rows and 6 columns
component members x y xcoord ycoord
factor character character character numeric numeric
1 1 227-190 227 190 30935 17377.9
2 1 228-190 228 190 31035 17377.9
3 1 229-190 229 190 31135 17377.9
4 1 227-191 227 191 30885 17464.5
5 1 228-191 228 191 30985 17464.5
... ... ... ... ... ... ...n 11879 21 261-122 261 122 34335 11488.9
11880 21 262-122 262 122 34435 11488.9
11881 21 263-122 263 122 34535 11488.9
11882 21 264-122 264 122 34635 11488.9
11883 21 265-122 265 122 34735 11488.9
R
plotROI(spe, roi = "Ext_Hpc_DG")

图注:Ext_Hpc_DG 细胞的 ROIs 的空间展示图。以 Ext_Hpc_DG 细胞的分布密度为关注点,得到的 ROI。

细胞类型之间的密度相关性

在定义感兴趣区域(ROIs)后,我们可以测试任意两种细胞类型在每个 ROI 内或整体上的相关性,同时使用三次样条函数或线性拟合来控制 ROI 间的变异。

R
plotDensCor(spe, celltype1 = "Ext_Hpc_CA2", celltype2 = "Ext_Hpc_DG", roi = "Ext_Hpc_DG")

图注:每个 ROI 中 Ext_Hpc_CA2 和 Ext_Hpc_DG 两种细胞类型的密度相关性。图中的点是空间转录组数据的网格,横轴是 Ext_Hpc_CA2 的网格密度,纵轴是 Ext_Hpc_DG 的网格密度。

R
plotDensCor(spe, celltype1 = "Ext_Hpc_CA2", celltype2 = "Ext_Hpc_DG")

图注:整体上 Ext_Hpc_CA2 和 Ext_Hpc_DG 两种细胞类型的密度相关性。图中的点是空间转录组数据的网格,横轴是 Ext_Hpc_CA2 的网格密度,纵轴是 Ext_Hpc_DG 的网格密度。

R
results <- corDensity(spe, roi = "Ext_Hpc_DG")

分别在每个 Ext_Hpc_DG 感兴趣区域(ROI)中每对细胞类型之间的空间相关性:

R
head(as.data.frame(results$ROI))
A data.frame: 6 × 9
celltype1celltype2ROIngridcor.coeftdfp.Posp.Neg
<chr><chr><chr><dbl><dbl><dbl><dbl><dbl><dbl>
1AstroEndo1 24 0.8530792 2.6455314 2.6183300.0445913090.9554087
2AstroEndo2 46 0.9282104 4.9024113 3.8613800.0043918250.9956082
3AstroEndo3 179-0.5480082-1.1226607 2.9364780.8275429150.1724571
4AstroEndo41546-0.1131211-0.439329114.8901640.6666340980.3333659
5AstroEndo5 179-0.7398525-2.1496765 3.8210970.9493859960.0506140
6AstroEndo6 108 0.7589837 2.3418250 4.0360090.0393186710.9606813

表注:
​​celltype1​​:第一种细胞类型的名称,例如 "Astro"(星形胶质细胞)。
​​celltype2​​:第二种细胞类型的名称,例如 "Endo"(内皮细胞)。
​​ROI​​:感兴趣区域(Region of Interest, ROI)的编号,用于区分不同的空间区域。
​​ngrid​​:该 ROI 中用于计算空间相关性的网格点(或空间单元)的总数,可以理解为参与计算的位置点数量。
​​cor.coef​​:两个细胞类型(celltype1 和 celltype2)在指定 ROI 中的空间相关性系数,取值范围一般为 [-1, 1]。

  • 接近 ​​1​表示正相关(两种细胞的空间分布倾向于一起出现)
  • 接近 ​​-1​​ 表示负相关(两种细胞的空间分布倾向于互相排斥)
  • 接近 ​​0​​ 表示无明显空间相关性

​​t​​:用于检验相关性是否显著的 t 统计量(t-statistic),基于相关性检验计算得出,用于衡量相关性的统计显著性。
​​df​​:自由度(degrees of freedom),与 t 检验相关,用于查找对应的 p 值,受样本量(ngrid)影响。
​​p.Pos​​:双侧检验中,相关性为正(即 cor.coef > 0)的 p 值。它表示在随机情况下,观察到当前或更强的正相关性的概率。
​​p.Neg​​:双侧检验中,相关性为负(即 cor.coef < 0)的 p 值。它表示在随机情况下,观察到当前或更强的负相关性的概率。

所有 Ext_Hpc_DG 感兴趣区域中每对细胞类型之间的空间相关性:

R
head(as.data.frame(results$overall))
A data.frame: 6 × 5
celltype1celltype2cor.coefp.Posp.Neg
<chr><chr><dbl><dbl><dbl>
1AstroEndo 0.22672222250.0069026330.54630570
2AstroEpendymal 0.00015764450.6530843010.07044218
3AstroExt clau pyr 0.04050232580.1379782140.23472097
4AstroExt hpc ca1 0.01170071210.0514017540.08106990
5AstroExt hpc ca2 -0.10593104060.7648047920.02204070
6AstroExt hpc dg 0.12254012300.0295047540.74864420

表注:
​​celltype1​​:第一种细胞类型的名称,例如 "Astro"(星形胶质细胞)。
​​celltype2​​:第二种细胞类型的名称,例如 "Endo"(内皮细胞)。
​​cor.coef​​:两个细胞类型(celltype1 和 celltype2)在指定 ROI 中的空间相关性系数,取值范围一般为 [-1, 1]。

  • 接近 ​​1​表示正相关(两种细胞的空间分布倾向于一起出现)
  • 接近 ​​-1​​ 表示负相关(两种细胞的空间分布倾向于互相排斥)
  • 接近 ​​0​​ 表示无明显空间相关性

​​p.Pos​​:双侧检验中,相关性为正(即 cor.coef > 0)的 p 值。它表示在随机情况下,观察到当前或更强的正相关性的概率。
​​p.Neg​​:双侧检验中,相关性为负(即 cor.coef < 0)的 p 值。它表示在随机情况下,观察到当前或更强的负相关性的概率。

ROI 区域上每对细胞类型之间的空间相关性:

R
options(repr.plot.height=7, repr.plot.width=10)
plotCorHeatmap(results$overall)

图注:ROI 区域上每对细胞类型之间的空间相关性热图。横轴和纵轴是 ROI 区域上的细胞类型,图中颜色表示空间相关性强度的高低

基于细胞的分析

根据网格密度,我们可以针对数据提出许多生物学问题。例如,我们想知道位于指定细胞类型高密度区域的某种细胞类型,与来自指定细胞不同密度区域的同种细胞类型是否存在差异。

基于网格密度的细胞标注

为了解决这一问题,我们首先需要将细胞划分为不同网格密度等级。这可以通过使用 getContour 函数的等高线识别策略来实现。

R
spe <- getContour(spe, coi = "Ext_Hpc_DG", equal.cell = TRUE, id = "Sub_CellType")
output
Using bins = 10 to draw contours with equal cell numbers.
R
spe
output
class: SpatialExperiment
dim: 32285 32758
metadata(4): grid_density grid_info ext_hpc_dg_roi ext_hpc_dg_contour
assays(1): counts
rownames(32285): Xkr4 Gm1992 ... AC234645.1 AC149090.1
rowData names(0):
colnames(32758): AACAGGGTACTGAGGCTAAGGCACTAT
AAGCGAGTACATGCAGTGCTCTGCTTC ... TGCTTGCGCTGGCAGATCCTAATAACG
TCACAAGATGCGTATAAAGCGACGGAT
colData names(5): sample_id Sub_CellType Main_CellType ext_hpc_dg_roi
ext_hpc_dg_contour
reducedDimNames(0):
mainExpName: NULL
altExpNames(0):
spatialCoords names(2) : x_centroid y_centroid
imgData names(1): sample_id
R
options(repr.plot.height=7, repr.plot.width=10)
plotContour(spe, coi = "Ext_Hpc_DG", id = "Sub_CellType")

图注:Ext_Hpc_DG 细胞的等高线图。图中点表示细胞,线性区域是不同的等高线密度区域。

然后,我们可以使用函数 allocateCells 根据细胞在每个轮廓内的位置对其进行区域聚类或注释。

R
spe <- allocateCells(spe)
output
Assigning cells to ROIs defined by Ext hpc dg


Assigning cells to contour levels of Ext hpc dg


Linking to GEOS 3.12.2, GDAL 3.9.2, PROJ 9.5.0; sf_use_s2() is TRUE
R
spe
output
class: SpatialExperiment
dim: 32285 32758
metadata(4): grid_density grid_info ext_hpc_dg_roi ext_hpc_dg_contour
assays(1): counts
rownames(32285): Xkr4 Gm1992 ... AC234645.1 AC149090.1
rowData names(0):
colnames(32758): AACAGGGTACTGAGGCTAAGGCACTAT
AAGCGAGTACATGCAGTGCTCTGCTTC ... TGCTTGCGCTGGCAGATCCTAATAACG
TCACAAGATGCGTATAAAGCGACGGAT
colData names(5): sample_id Sub_CellType Main_CellType ext_hpc_dg_roi
ext_hpc_dg_contour
reducedDimNames(0):
mainExpName: NULL
altExpNames(0):
spatialCoords names(2) : x_centroid y_centroid
imgData names(1): sample_id
R
plotSpatial(spe, group.by = "ext_hpc_dg_contour", pt.alpha = 0.5)

图注:根据 Ext_Hpc_DG 细胞的等高线密度区域得到的分群。图中的点表示细胞,不同的颜色表示不同的分群。

每个级别的细胞类型组成的可视化

R
plotCellCompo(spe, contour = "Ext_Hpc_DG", id = "Sub_CellType")

图注:Ext_Hpc_DG 细胞相关的每个等高线区域的细胞类型占比分析。横轴表示等高线区域,纵轴是细胞类型占比。

R
plotCellCompo(spe, contour = "Ext_Hpc_DG", roi = "Ext_Hpc_DG", id = "Sub_CellType")

图注:Ext_Hpc_DG 细胞相关的每个 ROI 区域中等高线区域的细胞类型占比分析。横轴表示等高线区域,纵轴是细胞类型占比,每个小的占比图表示 ROI 区域。

R
0 条评论·0 条回复