单细胞不同数据整合时会用到concatenate函数,这里的batch尤其要小心处理:
import scanpy as sc
import numpy as np
np.random.seed(1)#设置随机种子
x=np.random.randn(3000,100)#
y=np.random.randn(2000,100)#
z=np.random.randn(1000,100)
adata1=sc.AnnData(x)
adata2=sc.AnnData(y)
adata3=sc.AnnData(z)
adata =sc.AnnData.concatenate(adata1,adata2,adata3)
print(adata.obs)
如果各自的adata没有batch属性,那么sc.AnnData.concatenate就会自动创建最终的结果如下:
adata.obs['batch']

如果起初的各个adata已经具有batch的标示,那么sc.AnnData会重新覆盖,且取值只会是0,1,2....... 特别要注意的是,如果你在整合不同批次的样本预先设定了批次(adata[i].obs['batch'] = batch[i]
),但是在concatenate后batch将被重新排序为从0开始增大。那么导致的最终结果是你的batch并不是你预期的那样。
解决方法是再创建一个batch,命名为BATCH (类似于adata[i],obs['BATCH'] = batch[i]
,然后adata = adata1.concatenate(adata2,adata3,batch_key='BATCH')
如图所示:

然后:
adata = sc.AnnData.concatenate(adata1,adata2,adata3,batch_key = 'BATCH')
或者adata = adata1.concatenate(adata2,adata3,batch_key = 'BATCH')
得到的结果是:

网友评论