3.3 挑选表达量高变化基因
刘小泽写于2020.6.28
1 前言
我们经常使用scRNA数据探索细胞异质性。聚类分群和降维也是常用的操作,它们都是依赖于基因表达量(例如综合细胞中各个基因的表达量,然后把表达模式相近的细胞聚在一起)。因此挑选哪些基因进行聚类分群和降维分析,这是非常关键的,挑选的基因一定要有代表性,尽可能多的包含生物信息而剔除其他技术噪音。
单细胞分析的一个重点就是:用尽可能少的维度来展示数据真实的结构。降维的过程其实就是去繁存简,每个基因的变化都对整体有影响,对细胞来讲都是一个变化维度。但这么多维度我们看不了也处理不了,需要尽可能保证真实差异的前提下减少维度的数量,因此需要挑出那些更能代表整体差异的基因。
对每一个细胞来讲,2万多个基因都是它身上长向四面八方的维度,但其中有一些影响很大,一些影响很弱。我们试图把影响最大的几个维度找出来(比如Gene1、Gene2、Gene3),然后用这几个维度代表这个细胞的生物学特征。

上面说了这么多,重点还是:如何挑选有价值的基因(feature)
一般来说,如果一个基因在细胞群体中变化幅度很大,就是受关注对象,我们也会认为是生物因素导致了这么大的差异。这样的基因叫做:高度变化基因(highly variable genes ,HVGs)
数据准备
10X PBMC
其中的处理步骤值得学习,其中pbmc4k_raw_gene_bc_matrices.tar.gz数据已经帮大家下载好,链接:https://share.weiyun.com/s2wbVd7p 密码:3iwypw
下载的内容包含三件套,然后使用read10xCounts读取:

其中使用到了一个函数:uniquifyFeatureNames() ,它的作用是
uniquifyFeatureNames() make gene name unique and valid,如果有symbol name的,它会将Ensembl ID替换为symbol name,没有name的仍然使用ID;如果name相同、ID不同(即两个Ensembl ID对应同一个Symbol name),它会将ID与name组合保证特异性(详见?uniquifyFeatureNames) 详见我之前写的:来自刘小泽理解的一份诚意满满的单细胞教程:https://www.jianshu.com/p/e90f5d4d0ab6
之后添加位置信息,得到了基因所在的染色体,可以看到存在13个基因在线粒体上

416B数据
可以看到这里归一化没有使用quickCluster() ,这是因为416b数据自带了block,和cluster的效果一样

2 衡量每个基因的变化程度/方差(Variance)
2.1 方法一:使用log-counts衡量变化程度
这也是最简单的处理方法,基因log后的表达量在细胞间变化幅度越大,就说明细胞间距离越远(这个距离指欧氏距离Euclidean distances)
计算每个基因的变化程度很简单,但要基于这么多基因的结果去挑选最有价值的基因(feature),还需要构建一个模型。这个模型叫:mean-variance relationship,看上去与均值、方差有关
先看计算方法

每个点表示一个基因
图中蓝线指的是:技术因素导致的偏差
纵坐标表示总偏差:它等于技术偏差+生物因素偏差
因此,要衡量一个基因的生物因素偏差大小,就看对应的纵坐标减去对应的蓝线的值
最后可以得到一个表:

可以看到生物因素(bio)导致的偏差从大到小排列,然而会有一些负值存在,难不成总体偏差比技术偏差还要小?这是因为拟合曲线时会有一些基因处于线以下(看上图也能知道),这部分其实可以忽略,反正这部分基因也用不到。我们实则更关心那些bio值更大的
2.2 方法二:使用变异系数(CV)衡量变化程度
这是另一种可选方案,和上面的log-counts是平行关系,它会使用
squared coefficient of variation (CV^2)
关于概念: 可以看https://www.jianshu.com/p/f2df679843f3 和 https://www.jianshu.com/p/3525e624946a
Coefficient of variation (CV)中文翻译是变异系数,它是标准差与均值的比值 ,因此
CV^2就是方差与均值的平方比值如果两组数据的观测值在一个数量级,那么可以用标准差来比较它们的离散度
如果两个数据差别太大(比如一群老鼠和一群大象的重量),然后就要用
CV或CV^2,这样可以去除不同量纲均值差异的影响
我们这里可以利用modelGeneCV2()来计算
同样的,我们这里的假设是: most genes contain random noise and that the trend captures mostly technical variation,即大部分基因都包含外部噪音,并且拟合的曲线能捕获大部分技术偏差
如果CV^2 越大,偏离拟合曲线越远,就可能包含更多的生物偏差,更具有生物学意义
来自
modelGeneCV2()的帮助文档: The ratio of the total CV2 to the trend is used as a metric to rank interesting genes, with larger ratios being indicative of strong biological heterogeneity.

最后也能得到一个表:
其中偏离拟合曲线的数值用ratio表示,也是我们定义HVGs的途径
这个ratio = total (CV^2) / trend (CV^2) ,这样一相除,就抵消了均值的影响,最后实际上变成了方差的比值。但如果是相减,还是会带着均值【把公式从纸上一列就很清楚了】

总结:
log-counts与CV2都是衡量基因变化程度的有效途径
优先使用log-counts的结果,因为下游的分析也是基于log-counts值
2.3 考虑技术噪音
有两种方式:一种是有spike-in的,一种是没有的,都可以操作
之前画的技术偏差拟合线都是基于一个假设:大部分基因的表达量都是受外界技术误差的影响。但实际上,除了技术误差,还有一些生物因素会导致数据波动(例如transcriptional bursting)。因此之前估计的技术偏差可能”超出了实际的大小“,有些过度估计。
之前估计的偏差实际上是:真正的技术偏差 + 一些无关紧要的生物学因素偏差。因此如果有spike-in的话,它和内源基因不同,不会受到生物因素的影响。利用spike-in画的拟合线,更能代表技术偏差
如果有spike-in


其中黑点是基因,红点是spike-in,蓝线是根据红点画的拟合线
如果没有spike-in
可以考虑利用数据分布来表示技术噪音,例如只考虑技术噪音的话,UMI counts通常会呈现近似泊松分布

有趣的是,如果真的单纯考虑技术偏差,我们会得到比原来更多的变化基因。其中就包含了之前没有的一些管家基因。不过这些基因在后面分析(比如研究细胞异质性)中又不太感兴趣,因此使用更准确的技术噪音拟合方法,可能不会得到更准确的HVGs排序
2.4 考虑批次效应
2.4.1 方法一:绘制拟合曲线时加入批次信息(Fitting block-specific trends)
有时我们看到的在不同细胞间高变化的基因,不一定是生物学因素驱动,也不一定是由于技术误差导致,而是由于不同细胞的批次不同,导致同一基因的表达量差异很大。
我们更想知道的是,在一个批次中的HVGs信息。一般可以一个批次一个批次地去处理,例如:
看看不同批次的差异

其中黑点是基因,红点是spike-in,蓝线是根据红点画的拟合线。看到这里的两个批次之间差异很小,表示重复效果不错
2.4.2 利用实验设计矩阵(design matrix)
当只有一个批次信息时(例如只考虑sce.416b$block信息),使用上面的绘制拟合曲线方法是足够的,但如果再加上其他的批次信息,例如:
就需要利用实验设计矩阵(很像DESeq2、edgeR等差异分析做的),像是modelGeneVarWithSpikes()和modelGeneVar() 都支持这个参数

这种方法做起来很简单,但不太准确,因为没有考虑到各个批次中的平均表达水平。而这个表达水平又影响真正的技术偏差估计
the true technical component is the average of the fitted values at the per-block means, which may be quite different for strong batch effects and non-linear mean-variance relationships
相比之下,第一种方法的block= 更稳妥一些
3 挑选出高变化基因HVGs
既然前面找到了每个基因的变化程度,并且排了个序。但挑多少基因呢,这是个问题。我们首先想是不是多多益善?
的确,一个大的基因集保留了更多的基因信息,可以防止丢失一些有趣的生物信号,但代价是增加一些和研究不相干的基因信号,造成干扰。而哪些是不相干,这个不好权衡,因为一种情况下的不相干,可能在另一种情况下又是有用的。
例如,T细胞活化反应中存在的异质性是有趣的,但如果我们关注点是区分主要的免疫表型,那么前面这个异质性就是无关的噪音。简言之,虽然都是有趣的生物学信号,但我们关注点只有一个,研究一个势必另一个会成为干扰因素。
关于HVGs的选择,有以下几种方案:
3.1 基于方差最大化
这个方法是最简单理解的,就是提取在生物学因素中方差最大的(也就是对波动贡献最大)基因。优点就是可以自己控制基因的数量,方便对后面的分析复杂度有一个大体的估计。
比如可以挑选前1000个变化最大的基因:
对于modelGeneVar() 和 modelGeneVarWithSpikes() 基于方差的,直接根据结果表格bio这一列提取
对于modelGeneCV2()和modelGeneCV2WithSpikes() 基于CV2的,可以根据结果表格的ratio这一列提取
重点还是参数n的设定,实际上大部分基因对生物学异质性的贡献不大。如果我们知道一个假设:不超过5%的基因是差异表达的,那么这个问题就轻松许多。我们之间设置n小于等于基- 因总数的5%即可。但事实上,我们实现不知道差异基因的占比,这个5%也只是虚构。但给我们一些提示:
如果数据异质性比较低,可以降低
n的数值,保留最多的生物信号同时,尽可能剔除不相干的噪音如果数据异型性很高,就应该使用更大的
n值,在寻求主要差异的同时,保留更多的次要差异因素
从上面的操作和解读来看,这个方法存在一定的弊端:设置一个固定的数值,就让基因们形成了竞争关系,能被n选择成为HVGs的,势必会把其他有信息价值的基因排除在外,如果这些被排除的基因还是一些细胞亚群的marker基因【这种问题在高度异质性群体中尤为严重】
另外这个n的选择很主观,从500-5000之间似乎都能说得通。上面选择1000,其实也没有什么特别的原因,只是一个直觉。如果选择这种方法,那么什么都不要管,根据直觉选择一个值,进行剩余的分析,通过结果来判断这个值选的是不是合理,而不是在这里辗转反侧思考用什么数值。
3.2 基于假设检验
原假设是:基因的方差与之前拟合的曲线相符(也就是对生物学角度的波动没什么贡献)。由此可以设置adjusted p-values的阈值,例如
这个方法适用于HVGs的确大部分都是与研究点相关,使用FDR只会让结果更准确;但缺点是:比第一种指定数量的方法更难以预测。既然是假设检验,就可能存在假阳性,可能得到更多不相干的基因。另外,我们的关注重点实际上不在于这些基因本身,而是看它们对下游分析有没有作用,因此也不能认为5%的FDR阈值可以得到低噪音的基因集。
或许还会想,之前计算的表格中有p值这一列,那么可不可以用这一列来替代bio或者ratio那一列进行排序,从而挑选基因呢?
最好不要,因为还是那句话,表现显著的基因不一定对我们感兴趣的生物学问题有帮助。很多基因确实p值很小,这是因为它们的技术偏差非常小,但同时总体偏差并不大,因此它看上去很显著,但实际我们不感兴趣。
因此这种方法还是慎用
3.3 保留之前拟合曲线上面全部的基因
这个方法的目的很单纯,拟合曲线以下的基因都是不感兴趣的,因为它们的生物学偏差很小,于是把它们全部剔除,留下剩下的。这也是走了一个极端:为了偏差最小化,选择了噪音最大化(保留了很多与研究问题无关的基因)。看下面计算的数量就知道
如果之前使用了modelGeneVar():
如果之前使用了modelGeneCV2():保留所有ratio大于1的
这种方法对于研究罕见的细胞亚群最有帮助,另外对于异质性非常严重的数据(包含许多不同类型的细胞类型,例如多个数据集合并后的数据)比较适合
4 特殊情况一:Keep or not
场景就是:我们筛选出来HVGs,剩下的基因是删除还是继续保留呢? 主要有三种方法
首先选取前10%的HVGs
利用参数prop=0.1
方法一:直接删除非HVGs
下游分析也全部基于HVGs,不过日后如果突然发现,一些非HVGs的基因也有点意思,想看看它们就变得很麻烦
方法二:原数据不动,只是下游分析基于小部分HVGs
这样的好处是,如果以后调整了chosen这个HVGs基因集,那么还是可以继续进行下游分析的
方法三:原数据先备份,下游分析也是基于原数据,最后再复原
5 特殊情况二:利用先验基因
如果想证明某个通路的基因不存在有意义的异质性,那么可以选取这部分基因作为先验基因,重复一遍分析,检查到底是否存在异质性。这个想法和荧光激活细胞分选(fluorescence activated cell sorting ,FACS)相似,只不多scRNA分析中可以更方便地更改先验基因
选取部分先验基因
例如PBMC数据集中,可以用MSigDB数据库的免疫相关基因集:C7 immunologic signatures
以上就是我们自己筛选的先验基因集,然后利用这些作为chosen基因再进行下游分析,看看结果与我们推测的是否一致
剔除某些先验基因
和上面相反,我们还可以先剔除一些比较不感兴趣的基因,再进行下游分析
例如,可以剔除核糖体蛋白基因或线粒体基因
对于免疫细胞数据集,可以剔除免疫球蛋白基因和T细胞受体基因【当然这些都取决于生物背景】
不过以上的操作要慎重,如果下游分析没有发现问题,以及对先验基因存在十足的把握,还是不要随意使用先验基因
最后更新于
这有帮助吗?