1. 简介
PCA(Principal Components Analysis)即主成分分析,也称主分量分析或主成分回归分析法,是一种无监督的数据降维方法。首先利用线性变换,将数据变换到一个新的坐标系统中;然后再利用降维的思想,使得任何数据投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上。这种降维的思想首先减少数据集的维数,同时还保持数据集的对方差贡献最大的特征,最终使数据直观呈现在二维坐标系。
R语言中可以进行PCA分析的主要有rda(){vegan}、prcomp(){stats}、princomp(){stats} 、PCA(){FactoMineR} 、dudi.pca() {ade4} 、epPCA() {ExPosition};对于分析结果可视化,factoextra包封装了包括分析结果提取和基于ggplot2的数据可视化的函数。
2. 目标
-
找到数据中的隐藏模式
-
通过减少数据中的噪声和冗余进行降维
-
找到相关变量
3. 实战解析
- 确认数据是否需要标准化,函数是否封装了标准化程序。
- Supplementary variables and individuals:不用于判断主成分,在结果显示中,他们的坐标轴由参与主成分分析的参数预测得出。
PCA(X, ind.sup = NULL, quanti.sup = NULL, quali.sup = NULL, graph = TRUE)
X :数据集,每一行是一个样例,列代表观测值。
ind.sup : 指定Supplementary individuals所在的列
quanti.sup, quali.sup : 指定定性和定量观测值所在的列
- PCA模型构建
decathlon2.active <- decathlon2[1:23, 1:10]
res.pca <- prcomp(decathlon2.active, scale.unit = TRUE)
4. 结果分析
-
结合str()和summary()函数,可以找到PCA分析结果中的Proportion of Variance 和Cumulative Proportion,然后以dim编号为横坐标,前面的值为纵坐标,可以分别作崖低碎石图和累积贡献率图,直观的表示主成分贡献率和累积贡献率,用以作为选择主成分个数的参考。
-
提取得分矩阵(一般是res.pca$x)做散点图。
-
提取各变量在不同dim上的占比,做箭头图。(如:dim1 = 0.41, dim 2 = 0.11,那么就以(0,0)为起点,(0.41, 0.11)为终点做带箭头线段。在这里,箭头朝向没有特殊意义,箭头长度表示PC占比。)
-
适当的时候可以加上多边形或者椭圆外框。、
-
进阶:如果想知道PCA能解释的方差比例计算方式,则需要了解:
- 特征向量:res.pca$rotation
- 每个主成分得分的标准差:res.pca$sdev
# the standard deviations of the principal components
res.pca$sdev_cal <- apply(pca$x, 2, sd)
# percent
round(res.pca$sdev^2/sum(res.pca$sdev^2), 3)
可以看到计算结果和summary结果时完全一致的。
factoextra包 - 提取并模式化PCA分析结果可视化
总的来说,fviz_可视化,get_结果提取。
-
get_eigenvalue:提取特征值,第1列是维度代号,第2列是特征值,第3列是可解释变异的比例,即该特征值能解释的观测值变化的比例。第4列是累计可解释变异的比例 ,数值由依次加上前面的可解释变异的比例得出。从向量空间的角度来看,因为不同特征值对应的特征向量线性无关,把每个特征向量看做是一个坐标轴,特征值是对应坐标轴(即特征向量)上的坐标值。简单来说,就是可以用特征值(坐标)与特征向量(坐标轴)来表示原矩阵。
1.png
主成分的特征值可以帮助确定保留主成分个数,Kaiser-Harris准则建议保留特征值大于1的主成分;或者用p值校正进行选择。
-
fviz_eig (or fviz_eigenvalue):特征值可视化
variable(观测值)可视化
- get_pca_var
-
coord :变量(观测值)的坐标,默认用corrplot 可视化,也可以调用提取数据后散点图或热图表示。
Rplot01.jpeg
-
cor:观测值(variables)和维度间的相关性,与传统的相关性分析结果不同。
-
cos2:
- 所有主成分上的cos2的和为1
- 可用于估计质量,越高代表性越强。
- 在PCA结果图上,箭头越靠近外面表示在factor map 上的代表性越好,也表示对解释该变组分越重要。
-
contrib:contribution
# cor - 相关矩阵可视化
corrplot(var$cos2, is.corr=FALSE)
# cos2 - 柱状图
# choice - 选择变量"var" or "ind"
fviz_cos2(res.pca, choice = "var", axes = 1:2)
# contrib - 柱状图
# 注意axes的选择,这里表示各个variable 在第1、2维度上的贡献率。
# factoextra包会自动给一个期望的平均贡献率,用红色线表示。
# chioce 同上
fviz_contrib(res.pca, choice = "var", axes = 1:2, top = 10)
# 总体展示PCA-variable结果
# 变量向量(箭头)的排序坐标(顶点坐标)可以进行同比例缩放
fviz_pca_var(res.pca, col.var = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE # Avoid text overlapping
)
- tips:
- col.var - variable color:可以用来展示cos2,contrib等PCA分析中的结果,也可以先对数据进行聚类等外部处理,然后在PCA图上表现出来。分组变量用palette 指定颜色,连续变量用 gradient.cols。
-
可以用dimdesc(){FactoMineR} 提取 dim 相关信息,提取各主成分坐标然后结合单个观测值坐标进行分析。
1.jpg
来源:Sunagawa, S., Coelho, L. P., Chaffron, S., Kultima, J.R., Labadie, K., Salazar, G., … & Bork, P. (2015). Structure and function of theglobal ocean microbiome. Science, 348(6237), 1261359-1261359.
代码示例:
library("FactoMineR")
library("factoextra")
decathlon2.active <- decathlon2[1:23, 1:10]
res.pca <- PCA(decathlon2.active, scale.unit = TRUE,
graph = FALSE)
summary(res.pca)
data <- dimdesc(res.pca)
plot_data<- data$call$X
ggplot(data = plot_data)+geom_point(aes(x = Dim.1, y = X400m))+
geom_smooth(method = "lm",aes(x = Dim.1, y = X400m)) +
geom_text(aes(x = 0, y = 47, label = "R-squared = 0.4922"))
individuals(个体,样品,等样例)可视化
-
coord :同上
-
cos2:同上;col.ind - 用颜色指示值;pointsize - 用点大小指示值。
Practical Guide to PCA.jpg -
contrib :同上
Rplot.jpeg -
fviz_pca_ind 的参数也是大同小异
Practical Guide to PCA.jpg
其他参数
-
fviz_pca_var(ind):可以用axis参数选择不同主成分维度
`.jpeg -
调整是否要点标签
- geom.ind = "point", 只显示点
- geom.ind = "text" ,只显示标签
- geom.ind = c("point", "text")
- 调整点、线和箭头
- labelsize:
- pointsize:
- arrowsize
- pointshape
- addEllipses 添加椭圆,ellipse.type参数如下:
-
"convex": 多边形区间
1.jpeg -
"confidence": 用coord.ellipse(){FactoMineR}绘制置信椭圆
-
"t": assumes a multivariate t-distribution
-
"norm": assumes a multivariate normal distribution.
-
"euclid": draws a circle with the radius equal to level, representing the euclidean distance from the center. This ellipse probably won't appear circular unless coord_fixed() is applied.
1.jpeg
- mean.point : 当参数group.var/ind存在时,控制是否添加各组均值点(barycenters,重心)- 默认添加。
- select.ind, select.var: 对作图数据进行筛选。
- Axis lines:axes.linetype
- 其他图形参数继承自ggplot2
Biplot
将 individuals and variables同一张图片上展示
主成分分析包检索
定量数据
psych包
ropls: PCA, PLS(-DA) and OPLS(-DA) for multivariate analysis and feature selection of omics data
rda(){vegan}:PCA分析或冗余度分析
prcomp(){stats}
princomp(){stats}
PCA(){FactoMineR}
dudi.pca() {ade4}
epPCA() {ExPosition}
定性数据
Correspondence Analysis (CA):两组定性、分类数据
cca(){vegan}
CA()[FactoMineR]
ca() [ca]
dudi.coa() [ade4]
corresp() [MASS]
and epCA() [ExPosition]
Multiple Correspondence Analysis (MCA):多组数据
MCA() [FactoMineR]
dudi.acm[ade4]
epMCA() [ExPosition]
混合型数据
Factor Analysis of Mixed Data (FAMD)
遇到定量数据就类似PCA分析功能,遇到定性数据就类似CA分析。
PCAmix()[ PCAmixdata]
Multiple Factor Analysis (MFA):混合、分组数据
mfa ()[ade4]
MFAmix()[ PCAmixdata]
结果分析
分析结果探索和可视化:ggplot2,plot,factoextra,vegan
HCPC (Hierarchical Clustering on Principal Component):对结果进行层次聚类
HCPC() [FactoMineR]
tips: 生物狗先学vegan,神包!!
参考资料: Practical Guide to Principal Component Methods in R
网友评论