10x Visium空间转录组数据下游聚类时,可以分为两种策略:一是基于细胞类型相对比例聚类,二是基于基因表达值聚类。第二种与普通单细胞处理方法一致,第一种略有不同。
10x Visium空间转录组数据的捕获基于spot
,这就导致一个spot
里面可能会包含多个细胞,分析时可以对数据反卷积获取spot
内不同细胞类型的相对丰度。然后,基于细胞类型相对比例进行聚类,将spot
分成不同的生态位。
ILR (isometric log ratio)
适用于composition
数据的处理,变换可以消除组成数据中的“无偏性”问题,后续可以应用于常规的统计分析方法,如主成分分析(PCA)、聚类分析、回归分析等。
spot
的细胞类型丰度可以当成composition
数据,聚类前先进行ILR
处理以获取更好的结果。在Python
和R
里面都有不少现成的包可以用来转换,下面分别给出一个示例。
Python
实现ILR
转换:
import pandas as pd
from composition_stats import ilr
df
ct1 ct2 ct3 ct4
0 0.1 0.3 0.4 0.2
1 0.2 0.5 0.1 0.2
2 0.3 0.2 0.3 0.2
pd.DataFrame(ilr(df.values))
0 1 2
0 -0.776836 -0.683398 0.117048
1 -0.647915 0.940026 0.064416
2 0.286707 -0.165530 0.234095
可以看出ILR
转换还带有一点降维的作用,变换的数据变量会减少一个维度。如ct1-4
为四种细胞类型,列维度为4,变换后细胞类型维度变为3,细胞数不变。
R
实现ILR
转换:
library(compositions)
df
ct1 ct2 ct3 ct4
1 0.1 0.3 0.4 0.2
2 0.2 0.5 0.1 0.2
3 0.3 0.2 0.3 0.2
ilr(df)
[,1] [,2] [,3]
[1,] 0.7768362 0.6833980 -0.11704769
[2,] 0.6479154 -0.9400264 -0.06441599
[3,] -0.2867071 0.1655304 -0.23409539
第一眼看到这个结果,心里一蒙,咋跟Python
不一样,什么情况?仔细再看一眼,好像又没有问题。R
的结果整体乘以-1
就与Python
的结果一致了,这种差别并不会影响后续的聚类。下面可以生成数据来验证一下。
tmp <- seq(from=0, to=1, by=0.1)
df <- data.frame(ct1=sample(tmp, size=6), ct2=sample(tmp, size=6), ct3=sample(tmp, size=6),
ct4=sample(tmp, size=6), ct5=sample(tmp, size=6), ct6=sample(tmp, size=6))
ilr1 <- as.matrix(ilr(df))
rownames(ilr1) <- paste0('cell',1:6)
ilr1
[,1] [,2] [,3] [,4] [,5]
cell1 -0.9802581 0.45692438 -1.3621133 -0.07245972 8.673617e-17
cell2 0.1577863 0.09109797 0.4714511 -0.87475494 -1.346988e+00
cell3 -0.6479154 0.28804762 -0.3053578 -0.07345574 4.063415e-01
cell4 -0.4901291 0.61403703 0.3933885 0.60416743 1.126055e+00
cell5 0.0000000 -0.66212175 -0.7173308 0.20220423 2.437939e-02
cell6 0.1090010 -0.37139162 -0.2865855 -1.46192756 5.827060e-01
hc1 <- hclust(dist(ilr1))
plot(hc1)
结果如下:
将上面的ilr1
乘以-1
,然后聚类:
ilr2 <- ilr1 * -1
ilr2
[,1] [,2] [,3] [,4] [,5]
cell1 0.9802581 -0.45692438 1.3621133 0.07245972 -8.673617e-17
cell2 -0.1577863 -0.09109797 -0.4714511 0.87475494 1.346988e+00
cell3 0.6479154 -0.28804762 0.3053578 0.07345574 -4.063415e-01
cell4 0.4901291 -0.61403703 -0.3933885 -0.60416743 -1.126055e+00
cell5 0.0000000 0.66212175 0.7173308 -0.20220423 -2.437939e-02
cell6 -0.1090010 0.37139162 0.2865855 1.46192756 -5.827060e-01
hc2 <- hclust(dist(ilr2))
plot(hc2)
结果如下:
可以看出聚类结果完全一致,这种矩阵间整体的线性关系不会影响数据中的相对关系,可以放心食用。由此,也可以看出Python
和R
内部在数据处理的实现过程中虽然存在差别,但殊途同归。