hello,大家好,今天我们来分享一下有关PCA维度选取的知识,深入探讨一下PCA维度选取的原理,我们首先需要知道的是单细胞PCA分析的降维原理 ,以及10X单细胞10X空间转录组降维分析之PCA轴的秘密,接下来我们就要进行下游的非线性降维,其中有一个参数dim,有的选择1:20,有的选择1:30,那么到底这个数值应该选择多少呢?今天我们来深入分析一下,我们就从PCA完成降维的部分开始
其实有关PCA轴的选取,存在于两个流派,我们首先来看官方的选择方法;
To overcome the extensive technical noise in any single feature for scRNA-seq data, Seurat clusters cells based on their PCA scores, with each PC essentially representing a ‘metafeature’ that combines information across a correlated feature set. The top principal components therefore represent a robust compression(压缩,浓缩) of the dataset. However, how many components should we choose to include? 10? 20? 100?
we implemented a resampling test inspired by the JackStraw procedure. We randomly permute a subset of the data (1% by default) and rerun PCA, constructing a ‘null distribution’ of feature scores, and repeat this procedure. We identify ‘significant’ PCs as those who have a strong enrichment of low p-value features.
我们来解决一下基础知识,什么是null distribution ?
零分布就是在H0假设条件成立的条件下数据的分析,通常在置换检验中用到,我们这里举一个例子
Permutation Test 置换检验
显著性检验通常可以告诉我们一个观测值是否是有效的,例如检测两组样本均值差异的假设检验可以告诉我们这两组样本的均值是否相等(或者那个均值更大)。我们在实验中经常会因为各种问题(时间、经费、人力、物力)得到一些小样本结果,如果我们想知道这些小样本结果的总体是什么样子的,就需要用到置换检验。
Permutation test 置换检验是Fisher于20世纪30年代提出的一种基于大量计算(computationally intensive),利用样本数据的全(或随机)排列,进行统计推断的方法,因其对总体分布自由,应用较为广泛,特别适用于总体分布未知的小样本资料,以及某些难以用常规方法分析资料的假设检验问题。在具体使用上它和Bootstrap Methods类似,通过对样本进行顺序上的置换,重新计算统计检验量,构造经验分布,然后在此基础上求出P-value进行推断。
下面通过一个简单例子来介绍Permutation test的思想。
假设我们设计了一个实验来验证加入某种生长素后拟南芥的侧根数量会明显增加。A组是加入某种生长素后,拟南芥的侧根数量;B是不加生长素时,拟南芥的侧根数量(均为假定值)。
A组侧根数量(共12个数据):24 43 58 67 61 44 67 49 59 52 62 50
B组侧根数量(共16个数据):42 43 65 26 33 41 19 54 42 20 17 60 37 42 55 28
我们来用假设检验的方法来判断生长素是否起作用。我们的零假设为:加入的生长素不会促进拟南芥的根系发育。在这个检验中,若零假设成立,那么A组数据的分布和B组数据的分布是一样的,也就是服从同个分布。
接下来构造检验统计量——A组侧根数目的均值同B组侧根数目的均值之差。
statistic:= mean(Xa)-mean(Xb)
对于观测值有 Sobs:=mean(Xa)-mean(Xb)=(24+43+58+67+61+44+67+49+59+52+62+50)/12-(42+43+65+26+33+41+19+54+42+20+17+60+37+42+55+28)/16=14
我们可以通过Sobs在置换分布(permutation distribution)中的位置来得到它的P-value。
Permutation test的具体步骤是:
1.将A、B两组数据合并到一个集合中,从中挑选出12个作为A组的数据(X'a),剩下的作为B组的数据(X'b)。
Gourp:=24 43 58 67 61 44 67 49 59 52 62 50 42 43 65 26 33 41 19 54 42 20 17 60 37 42 55 28
挑选出 X'a:=43 17 44 62 60 26 28 61 50 43 33 19
X'b:=55 41 42 65 59 24 54 52 42 49 37 67 67 20 42 58
2.计算并记录第一步中A组同B组的均值之差。Sper:=mean(X'a)-mean(X'b)= -7.875
3.对前两步重复999次(重复次数越多,得到的背景分布越”稳定“)
这样我们得到有999个置换排列求得的999个Sper结果,这999个Sper结果能代表拟南芥小样本实验的抽样总体情况。
如上图所示,我们的观测值 Sobs=14 在抽样总体右尾附近,说明在零假设条件下这个数值是很少出现的。在permutation得到的抽样总体中大于14的数值有9个,所以估计的P-value是9/999=0.01
最后还可以进一步精确P-value结果(做一个抽样总体校正),在抽样总体中加入一个远大于观测值 Sobs=14的样本,最终的P-value=(9+1)/(999+1)=0.01。(为什么这样做是一个校正呢?自己思考:))结果表明我们的原假设不成立,加入生长素起到了促使拟南芥的根系发育的作用。
这里需要我们注意的点很多,首先一个重采样测试,随机置换了数据的一部分(1%),重新运行PCA,从而构建出来的null distribution,然后重复此过程。 我们将“重要”的PC识别为具有丰富的低P值功能的PC。
其实这个检验过程跟cellphoneDB对配受体的置换检验原理是一样的
代码是
pbmc <- JackStraw(pbmc, num.replicate = 100)
pbmc <- ScoreJackStraw(pbmc, dims = 1:20)
JackStrawPlot(pbmc, dims = 1:15)
我们来挨个看看,首先看看函数JackStraw
Randomly permutes(排列) a subset of data, and calculates projected PCA scores for these 'random' genes. Then compares the PCA scores for the 'random' genes with the observed PCA scores to determine statistical signifance. End result is a p-value for each gene's association with each principal component.
这里需要注意一下,PCA scores即降维之后的结果矩阵
这一步我们得到了Returns a Seurat object where JS(object = object[['pca']], slot = 'empirical') represents p-values for each gene in the PCA analysis. If ProjectPCA is subsequently run, JS(object = object[['pca']], slot = 'full') then represents p-values for all genes
这部分结果就是每个PCA轴中每个基因的显著性,看来抽取数据的过程中,是对基因进行了置换检验。
下一个函数ScoreJackStraw
Significant PCs should show a p-value distribution that is strongly skewed to the left compared to the null distribution(就是置换检验). The p-value for each PC is based on a proportion test(比例检验) comparing the number of features with a p-value below a particular threshold (score.thresh), compared with the proportion of features expected under a uniform distribution of p-values.(算法的精髓,醍醐灌顶的感觉)
看看参数
help(ScoreJackStraw)
#注意其中的一个参数
score.thresh: Threshold to use for the proportion test of PC significance (see Details)
默认值是1e-05
接下来就是画图的结果
看看画图函数的解释Plots the results of the JackStraw analysis for PCA significance. For each PC, plots a QQ-plot comparing the distribution of p-values for all genes across each PC(所有基因), compared with a uniform distribution. Also determines a p-value for the overall significance of each PC
当然,我们如果选择显著性小于0.01的PC轴,那么dim就选择1:13,现在这个流派终于理解了吧
第二个流派,贡献度,这个也是大部分公司选择的方法
我们在运行PCA的时候会得到这样一张图,
不知道大家理解了没有,看过我之前关于PCA分享的文章应该都知道,一般的选择是拐点出,人工判断一下就选择了,这里大概就是10,但是这样不够严谨,通常的做法是,选择的维度代表的差异占总差异的85%以上,就是刚好累加差异贡献度超过总差异度的85%,我们来逐步看一下。
首先是计算stdev
data.use <- Stdev(object = pbmc, reduction = 'pca')
累加这个贡献度,占总贡献度的85%以上,我们来看一下:
这里应该选多少个PC轴呢?? 大家自己算一下把。
好了,这次分享的内容就这么多,大家好好学习,科研顺利
生活很好,有你更好