1 背景主成分分析法是数据挖掘中常用的一种降维算法,是Pearson在1901年提出的,再后来由hotelling在1933年加以发展提出的一种多变量的统计方法,其最主要的用途在于“降维”,通过析取主成分显出的最大的个别差异,也可以用来削减回归分析和聚类分析中变量的数目,与因子分析类似。 所谓降维,就是把具有相关性的变量数目减少,用较少的变量来取代原先变量。如果原始变量互相正交,即没有相关性,则主成分分析没有效果。 在生物信息学的实际应用情况中,通常是得到了成百上千个基因的信息,这些基因相互之间会有影响,通过主成分分析后,得到有限的几个主成分就可以代表它们的基因了。也就是所谓的降维。 R语言有非常多的途径做主成分分析,比如自带的princomp()和psych包的principal()函数,还有gmodels包的fast.prcomp函数。 2 拆解主成分分析步骤实际应用时我们通常会选择主成分分析函数,直接把input数据一步分析到位,只需要看懂输出结果即可。但是为了加深理解,这里一步步拆解主成分分析步骤,讲解原理。 2.1 测试数据数据集USJudgeRatings包含了律师对美国高等法院法官的评分。数据框包含43个样本,12个变量! 下面简单看一看这12个变量是什么,以及它们的相关性。 library(knitr) 这12个变量的介绍如下: [,1] CONT Number of contacts of lawyer with judge. 这些是专业领域的用词,大家可以先不用纠结具体细节。 2.2 为什么要做主成分分析不管三七二十一就直接套用统计方法都是耍流氓,做主成分分析并不是拍脑袋决定的。 在这个例子里面,我们拿到了这43个法官的12个信息,就可以通过这12个指标来对法官进行分类,但也许实际情况下收集其他法官的12个信息比较麻烦,所以我们希望只收集三五个信息即可,然后也想达到比较好的分类效果。或者至少也得剔除几个指标吧,这个时候主成分分析就能派上用场啦。这12个变量能得到12个主成分,如果前两个主成分可以揭示85%以上的变异度,也就是说我们可以用两个主成分来代替那12个指标。 在生物信息学领域,比如我们测了1000个病人的2万个基因的表达矩阵,同时也有他们的健康状态信息。那么我们想仔细研究这些数据,想得到基因表达与健康状态的某种关系。这样我就可以对其余几十亿的人检测基因表达来预测其健康状态。如果我们进行了主成分分析,就可以选择解释度比较高的主成分对应的基因,可能就几十上百个而已,大幅度的降低广泛的基因检测成本。 2.3 step1:数据标准化(中心化)dat_scale=scale(USJudgeRatings,scale=F) scale()是对数据中心化的函数,当参数scale=F时,表示将数据按列减去平均值,scale=T表示按列进行标准化,公式为(x-mean(x))/sd(x),本例采用中心化。 2.4 step2:求相关系数矩阵dat_cor=cor(dat_scale) 从相关系数看,只有 CONT 变量跟其它变量没有相关性。 当然,这样的矩阵不易看清楚规律,很明显,画个热图就一眼看出来了。 2.5 step3:计算特征值和特征向量利用eigen函数计算相关系数矩阵的特征值和特征向量。这个是主成分分析法的精髓。 dat_eigen=eigen(dat_cor) ## [1] 10.133504 1.104147 0.332902 0.253847 0.084453 0.037286 0.019683 pca_var=dat_var/sum(dat_var) ## [1] 0.8444586 0.0920122 0.0277418 0.0211539 0.0070377 0.0031072 0.0016402 pca_cvar=cumsum(dat_var)/sum(dat_var) ## [1] 0.8445 0.9365 0.9642 0.9854 0.9924 0.9955 0.9972 0.9984 0.9991 0.9996 可以看出,PC1(84.4%)和PC2(9.2%)共可以解释这12个变量的93.6的程度,除了CONT外的其他的11个变量与PC1都有较好的相关性,所以PC1与这11个变量基本斜交,而CONT不能被PC1表示,所以基本与PC1正交垂直,而PC2与CONT基本平行,表示其基本可以表示CONT。 2.6 step4:崖低碎石图和累积贡献图library(ggplot2) p1+geom_point(pch=2,lwd=3,col=2)+geom_line(col=2,lwd=1.2) 崖低碎石图(scree plot)即贡献率图,是希望图形一开始很陡峭,如悬崖一般,而剩下的数值都很小,如崖底的碎石一样。 崖低碎石图和累积贡献率图是对主成分贡献率和累积贡献率的一种直观表示,用以作为选择主成分个数的参考。本例中第一个主成分解释总变异的84.4%,可以只选择第一个主成分,但第二主成分也不小,因此选择前两个主成分。 主成分的个数选择没有一定之规,需按实际情况具体分析,一般要求累积贡献率大于85%或特征值大于1. 但是在实际的生物信息学应用中,通常达不到这个要求。 2.7 step5:主成分载荷主成分载荷表示各个主成分与原始变量的相关系数。 pca_vect= dat_eigen$vector ## 相关系数矩阵的特征向量
结果表明,CONT指标跟其它指标表现完全不一样,第一个主成分很明显跟除了CONT之外的所有其它指标负相关,而第二个主成分则主要取决于CONT指标。 2.8 step6:主成分得分计算和图示将中心化的变量dat_scale乘以特征向量矩阵即得到每个观测值的得分。 pca_score=as.matrix(dat_scale)%*%pca_vect ## [,1] [,2] 将两个主成分以散点图形式展示,看看这些样本被这两个主成分是如何分开的 p=ggplot(,aes(x=pca_score[,1],y=pca_score[,2]))+geom_point(color=USJudgeRatings[,1],pch=USJudgeRatings[,2]) 对于主成分分析,不同数据会有不同的分析方法,应具体情况具体分析。 总结一下PCA的算法步骤: 设有m条n维数据。
PCA本质上是将方差最大的方向作为主要特征,并且在各个正交方向上将数据“离相关”,也就是让它们在不同正交方向上没有相关性。 PCA也存在一些限制,例如它可以很好的解除线性相关,但是对于高阶相关性就没有办法了,对于存在高阶相关性的数据,可以考虑Kernel PCA,通过Kernel函数将非线性相关转为线性相关,关于这点就不展开讨论了。另外,PCA假设数据各主特征是分布在正交方向上,如果在非正交方向上存在几个方差较大的方向,PCA的效果就大打折扣了。 最后需要说明的是,PCA是一种无参数技术,也就是说面对同样的数据,如果不考虑清洗,谁来做结果都一样,没有主观参数的介入,所以PCA便于通用实现,但是本身无法个性化的优化。 3 实战一比如你要做一项分析人的糖尿病的因素有哪些,这时你设计了10个你觉得都很重要的指标,然而这10个指标对于你的分析确实太过繁杂,这时你就可以采用主成分分析的方法进行降维。10个指标之间会有这样那样的联系,相互之间会有影响,通过主成分分析后,得到三五个主成分指标。此时,这几个主成分指标既涵盖了你10个指标中的绝大部分信息,这让你的分析得到了简化(从10维降到3、5维)。
library(lars) ## age sex bmi dim(x) ## [1] 442 10 length(y) ## [1] 442 summary(y) ## Min. 1st Qu. Median Mean 3rd Qu. Max. boxplot(y) 其中x矩阵含有10个变量,分别是:“age” “sex” “bmi” “map” “tc” “ldl” “hdl” “tch” “ltg” “glu” 它们都在一定程度上或多或少的会影响个体糖尿病状态。 数据的详细介绍见 Efron, Hastie, Johnstone and Tibshirani (2003) “Least Angle Regression” (with discussion) Annals of Statistics; 一步法主成分分析 上面我们把整个主成分分析步骤拆解开来讲解具体原理,但是实际数据处理过程中我们通常是用现成的函数一步法完成主成分分析,而且这个是非常高频的分析,所以R里面自带了一个函数 data=x ## 这里的x是上面的 diabetes 数据集里面的 442个病人的10个生理指标 cor是逻辑变量,当cor=TRUE表示用样本的相关矩阵R做主成分分析,当cor=FALSE表示用样本的协方差阵S做主成分分。 summary(pca) ## Importance of components: 可以看到前三个主成份的信息量也只有67.2%,达不到我们前面说到85%,所以很难说可以用这3个主成分去代替这10个生理指标来量化病人的状态。 值得一提的是,如果你看懂了前面的主成分分析的拆解步骤,就应该明白有多少个变量就有多少个主成分,只是并不是所有的主成分都有意义,理想状态下我们希望有限的几个主成分就可以代替数量繁多的变量,尤其是生物信息学里面的基因表达矩阵,两三万个基因的表达情况我们希望几十个基因就可以替代它们,因为那些基因之间是相互关联的。 碎石图 也可以画出主成分的碎石图,来决定选几个主成分。 screeplot(pca, type='lines') 由碎石图可以看出,第5个主成分之后,图线变化趋于平稳,因此可以选择前5个主成分做分析。 样本分布的散点图 根据前两个主成分画出样本分布的散点图。 biplot(pca) 上面这个图似乎意义不大,因为大部分情况下都是需要结合样本的分组信息来看看这些主成分是否可以把样本比较不错的分开。 ** 获得训练数据前4个主成份的值 ** kable(predict(pca, data)[1:4,]) kable(data[1:4,]) 预测主成份的值,这里用的就是训练数据,所以得出训练数据主成分的值。 4 实战二R中自带数据集 data(Harman23.cor) ## Warning in kable_markdown(x = structure(c("0", "0", "0", "0", "0", "0", : ## Warning in kable_markdown(x = structure("305", .Dim = c(1L, 1L), .Dimnames 5 进阶的主成分分析-psych包正文中的princomp()函数为基础包中进行主成分分析的函数。 另外,R中psych包中提供了一些更加丰富有用的函数,这里列出几个相关度较高的函数,以供读者了解。 还有很多主成分分析结果可视化包,在直播我的基因组里面都提到过。 6 推荐一个R包factoextrafactoextra是一个R包,易于提取和可视化探索性多变量数据分析的输出,包括:
有许多R包实现主要组件方法。这些包包括:FactoMineR,ade4,stats,ca,MASS和ExPosition。然而,根据使用的包,结果呈现不同。为了帮助解释和多变量分析的可视化(如聚类分析和维数降低分析),所以作者开发了一个名为factoextra的易于使用的R包。 7.主成分分析的生物信息学应用比如对千人基因组计划的对VCF突变数据进行主成分分析来区分人种:https://www./p/185869/ 再比如每次做表达矩阵都需要根据样本分组信息PCA分析及可视化看看分组是否可靠。 详细例子见:http://github.com/jmzeng1314/GEO/ 然后就是单细胞转录组数据也经常会PCA看看分群,或者PCA来去除前几个主成分因素来抹掉某些影响等等。 8. 主成分分析的其它可视化方法看到一个包 > install.packages('ropls') 现在什么包都往bioconductor里面丢真奇怪。但是作图颜值还可以,大家可以看看: 后来仔细看标题,终于明白了。
构建的就是组学数据,所以放在bioconductor也是正常。 9.参考资料:
|
|