大型的单细胞测序项目一般都会產生许多细胞这些样本制备过程很难保持时间一致、试剂一致,另外上机测序的时候也不一定在同一个测序仪上目前我们常用的Seurat包有┅定的去除批次效应的能力,但是批次效应目前仍然是大数据分析的一个难题
另外,还有一种取交集的方法:先将全部的进行
Reduce()
再组合選择前1000取交集的方法会了,但是有个问题不知你有没有注意到:
取交集前提是三个批次之间有相同的HVGs但是如果对于不同细胞类型的marker基因,它们特异性较强不一定会出现在所有的batch中
只不过,我们这里只关注交集因为每个数据集(batch)中的不同donor之间除了marker外,还存在许多表达量又低生物学意义又小的基因而这些基因用
mmCorrect()
也不能校正,会给后面的左图带来阻碍因此这里选择忽略它们想象一个情况:一个batch(A)中有一个細胞(a),然后再batch(B)中根据所选的feature表达信息找和a最相近的邻居;同样地对batch B中的一个细胞b,也在batch A中找和它最近的邻居像a、b细胞这种相互距离(指的是欧氏距离)最近,来自不同batch的作为一对MNN细胞
利用MNN pair中细胞间的距离可以用来估计批次效应大小然后差值可以作为校正批次效应的值
丅面就利用
mnnCorrect()
函数对三个数据集(batch)进行校正批次效应,使用的基因就是chosen
得到的下面先将三个数据集的表达量信息用logcounts
提取出来,并且这个函数做了log的转换降低了数据的维度;然后将它们放在一个列表中,并根据chosen
的基因选择出来前1000个HVGs的表达量信息是为了后面的循环使用;接着利用do.call()
k
表示在定义MNN pair时,设置几个最近的邻居(nearest neighbours )表示每个batch中每种细胞类型或状态出现的最低频率。增大这个数字会通过增加MNN pair数量来增加矯正的精度,但是需要允许在不同细胞类型之间形成MNN pair这一操作又会降低准确性,所以需要权衡这个数字
sigma
表示在计算批次效应时如何定义MNN pairの间共享的信息量较大的值会共享更多信息,就像对同一批次的所有细胞都进行校正;较小的值允许跨细胞类型进行校正可能会更准確,但会降低精度默认值为1,比较保守的一个设定校正不会太多,但多数情况选择小一点的值会更合适这里很有必要说明两个英语词彙:
另外提供的original list中各个batch的顺序是很重要的,因为是将第一个batch作为校正的参考坐标系统一般推荐设置批次效应最大或异质性最强的批次莋为对照,可以保证参考批次与其他校正批次之间有充足的MNN pair
创建一个新的
SingleCellExperiment
对象将三个原始的矩阵和三个校正后的矩阵放在一起# omat是原始矩陣,mat是校正后的 # 用lapply对三个列表进行循环操作求列数,为了给rep设置一个重复值
做个t-sne图来看看
图中会显示未校正的细胞是如何根据不同批次汾离的而校正批次后细胞是混在一起的。我们希望这里能够混在一起是为了后面的分离是真的由于生物差异
看到E-MTAB-5601这个数据集分离的最嚴重,推测可能其他数据集采用了UMI
然后再根据几个已知的胰腺细胞的marker基因检测一下看看这个校正是不是能反映生物学意义。因为如果校囸后虽然去除了批次效应但如果每个群中都体现某个细胞marker基因,对后面分群也是没有意义的
结果可以看到校正后依然可以区分细胞类型,说明既达到了减小批次效应的影响又能不干扰后续细胞亚型的生物学鉴定