单次使用科学计数法: 怎么在R语言中怎么切换科学计数法 - 开发技术 - 亿速云 (yisu.com)
全局判定公式: digits + 1 (小数点)+ 4 (e+XX科学计数法表示) + scipen
单次使用的函数: format(109000000, scientific = FALSE)
options主要是用来设置可以改变R的计算和显示结果全局选项。如果用该命令后还是显示不全,则可以把变量转换成字符型然后再转换成数值型,再进行显示。
options(digits = 7) # 控制要打印数值的位数(最大只能到22)
options(scipen = 100) # 平时常用的数值或科学计数法输出,此处用于设置显示的位数
format主要是为了输出一个统一的格式。
format(c(6.0, 13.1), digits = 2) #保留两位有效数字
输出结果:" 6" "13"
format(2^31-1, scientific = TRUE)#用科学计数法表示该数值,如果想显示全的话可以把scientific设置为FALSE
输出结果:"2.147484e+09"
signif主要是用于指定参数的有效数字的四舍五入。
例:
x2为下列五个数:
0.03141593 3.14159265 314.15926536 31415.92653590 3141592.65358979
signif(x2, 3)
输出结果: 0.0314 3.1400 314.0000 31400.0000 3140000.0000
round(x2, 3) #是保留小数点后三位有效数字
输出结果: 0.031 3.142 314.159 31415.927 3141592.654
主成分分析法是数据挖掘中常用的一种降维算法,是Pearson在1901年提出的,再后来由hotelling在1933年加以发展提出的一种多变量的统计方法,其最主要的用途在于“降维”,通过析取主成分显出的最大的个别差异,也可以用来削减回归分析和聚类分析中变量的数目,与因子分析类似。所谓降维,就是把具有相关性的变量数目减少,用较少的变量来取代原先变量。如果原始变量互相正交,即没有相关性,则主成分分析没有效果。
在生物信息学的实际应用情况中,通常是得到了成百上千个基因的信息,这些基因相互之间会有影响,通过主成分分析后,得到有限的几个主成分就可以代表它们的基因了。也就是所谓的降维。
R语言有非常多的途径做主成分分析,比如自带的princomp()和psych包的principal()函数,还有gmodels包的fast.prcomp函数。
2 拆解主成分分析步骤
实际应用时我们通常会选择主成分分析函数,直接把input数据一步分析到位,只需要看懂输出结果即可。但是为了加深理解,这里一步步拆解主成分分析步骤,讲解原理。
2.1 测试数据
数据集USJudgeRatings包含了律师对美国高等法院法官的评分。数据框包含43个样本,12个变量!
下面简单看一看这12个变量是什么,以及它们的相关性。
library(knitr)
kable(head(USJudgeRatings))
这12个变量的介绍如下:
[,1]CONTNumber of contacts of lawyer with judge.
[,2]INTGJudicial integrity.司法诚实性
[,3]DMNRDemeanor.风度;举止;行为
[,4]DILGDiligence.勤奋,勤勉;注意的程度
[,5]CFMGCase flow managing.
[,6]DECIPrompt decisions.
[,7]PREPPreparation for trial.
[,8]FAMIFamiliarity with law.
[,9]ORALSound oral rulings.
[,10] WRITSound written rulings.
[,11] PHYSPhysical ability.
[,12] RTENWorthy of retention.
这些是专业领域的用词,大家可以先不用纠结具体细节。
2.2 为什么要做主成分分析
不管三七二十一就直接套用统计方法都是耍流氓,做主成分分析并不是拍脑袋决定的。 在这个例子里面,我们拿到了这43个法官的12个信息,就可以通过这12个指标来对法官进行分类,但也许实际情况下收集其他法官的12个信息比较麻烦,所以我们希望只收集三五个信息即可,然后也想达到比较好的分类效果。或者至少也得剔除几个指标吧,这个时候主成分分析就能派上用场啦。这12个变量能得到12个主成分,如果前两个主成分可以揭示85%以上的变异度,也就是说我们可以用两个主成分来代替那12个指标。
在生物信息学领域,比如我们测了1000个病人的2万个基因的表达矩阵,同时也有他们的健康状态信息。那么我们想仔细研究这些数据,想得到基因表达与健康状态的某种关系。这样我就可以对其余几十亿的人检测基因表达来预测其健康状态。如果我们进行了主成分分析,就可以选择解释度比较高的主成分对应的基因,可能就几十上百个而已,大幅度的降低广泛的基因检测成本。
2.3 step1:数据标准化(中心化)
dat_scale=scale(USJudgeRatings,scale=F)
options(digits=4, scipen=4)
kable(head(dat_scale))
scale()是对数据中心化的函数,当参数scale=F时,表示将数据按列减去平均值,scale=T表示按列进行标准化,公式为(x-mean(x))/sd(x),本例采用中心化。
2.4 step2:求相关系数矩阵
dat_cor=cor(dat_scale)
options(digits=4, scipen=4)
kable(dat_cor)
从相关系数看,只有 CONT 变量跟其它变量没有相关性。
当然,这样的矩阵不易看清楚规律,很明显,画个热图就一眼看出来了。
2.5 step3:计算特征值和特征向量
利用eigen函数计算相关系数矩阵的特征值和特征向量。这个是主成分分析法的精髓。
dat_eigen=eigen(dat_cor)
dat_var=dat_eigen$values ## 相关系数矩阵的特征值
options(digits=4, scipen=4)
dat_var
## [1] 10.133504 1.104147 0.332902 0.253847 0.084453 0.037286 0.019683
## [8] 0.015415 0.007833 0.005612 0.003258 0.002060
pca_var=dat_var/sum(dat_var)
pca_var
## [1] 0.8444586 0.0920122 0.0277418 0.0211539 0.0070377 0.0031072 0.0016402
## [8] 0.0012846 0.0006528 0.0004676 0.0002715 0.0001717
pca_cvar=cumsum(dat_var)/sum(dat_var)
pca_cvar
## [1] 0.8445 0.9365 0.9642 0.9854 0.9924 0.9955 0.9972 0.9984 0.9991 0.9996
## [11] 0.9998 1.0000
可以看出,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)
p=ggplot(,aes(x=1:12,y=pca_var))
p1=ggplot(,aes(x=1:12,y=pca_cvar))
p+geom_point(pch=2,lwd=3,col=2)+geom_line(col=2,lwd=1.2)
打开APP查看高清大图
img
p1+geom_point(pch=2,lwd=3,col=2)+geom_line(col=2,lwd=1.2)
打开APP查看高清大图
img
崖低碎石图(scree plot)即贡献率图,是希望图形一开始很陡峭,如悬崖一般,而剩下的数值都很小,如崖底的碎石一样。
崖低碎石图和累积贡献率图是对主成分贡献率和累积贡献率的一种直观表示,用以作为选择主成分个数的参考。本例中第一个主成分解释总变异的84.4%,可以只选择第一个主成分,但第二主成分也不小,因此选择前两个主成分。
主成分的个数选择没有一定之规,需按实际情况具体分析,一般要求累积贡献率大于85%或特征值大于1.
但是在实际的生物信息学应用中,通常达不到这个要求。
2.7 step5:主成分载荷
主成分载荷表示各个主成分与原始变量的相关系数。
pca_vect= dat_eigen$vector ## 相关系数矩阵的特征向量
loadings=sweep(pca_vect,2,sqrt(pca_var),"*")
rownames(loadings)=colnames(USJudgeRatings)
options(digits=4, scipen=4)
kable(loadings[,1:2])
CONT 0.0028 0.2830
INTG -0.2652 -0.0552
DMNR -0.2636 -0.0599
DILG -0.2797 0.0110
CFMG -0.2780 0.0511
DECI -0.2774 0.0388
PREP -0.2843 0.0098
FAMI -0.2818 -0.0004
ORAL -0.2874 -0.0011
WRIT -0.2858 -0.0095
PHYS -0.2580 0.0270
RTEN -0.2847 -0.0119
结果表明,CONT指标跟其它指标表现完全不一样,第一个主成分很明显跟除了CONT之外的所有其它指标负相关,而第二个主成分则主要取决于CONT指标。
2.8 step6:主成分得分计算和图示
将中心化的变量dat_scale乘以特征向量矩阵即得到每个观测值的得分。
pca_score=as.matrix(dat_scale)%*%pca_vect
head(pca_score[,1:2])
## [,1][,2]
## AARONSON,L.H. 0.5098 -1.7080
## ALEXANDER,J.M. -2.2676 -0.8508
## ARMENTANO,A.J. -0.2267 -0.2903
## BERDON,R.I.-3.4058 -0.5997
## BRACKEN,J.J.6.5937 0.2478
## BURNS,E.B. -2.3336 -1.3563
将两个主成分以散点图形式展示,看看这些样本被这两个主成分是如何分开的
p=ggplot(,aes(x=pca_score[,1],y=pca_score[,2]))+geom_point(color=USJudgeRatings[,1],pch=USJudgeRatings[,2])
p
打开APP查看高清大图
img
对于主成分分析,不同数据会有不同的分析方法,应具体情况具体分析。
总结一下PCA的算法步骤:
设有m条n维数据。
1)将原始数据按列组成n行m列矩阵X
2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
3)求出协方差矩阵
4)求出协方差矩阵的特征值及对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
6)Y=PX即为降维到k维后的数据
PCA本质上是将方差最大的方向作为主要特征,并且在各个正交方向上将数据“离相关”,也就是让它们在不同正交方向上没有相关性。
PCA也存在一些限制,例如它可以很好的解除线性相关,但是对于高阶相关性就没有办法了,对于存在高阶相关性的数据,可以考虑Kernel PCA,通过Kernel函数将非线性相关转为线性相关,关于这点就不展开讨论了。另外,PCA假设数据各主特征是分布在正交方向上,如果在非正交方向上存在几个方差较大的方向,PCA的效果就大打折扣了。
最后需要说明的是,PCA是一种无参数技术,也就是说面对同样的数据,如果不考虑清洗,谁来做结果都一样,没有主观参数的介入,所以PCA便于通用实现,但是本身无法个性化的优化。