该内容已被发布者删除 该内容被自由微信恢复
文章于 2月2日 上午 5:41 被检测为删除。
查看原文
被用户删除
其他

R语言绘图 | 主成分分析(PCA)从入门到精通

小陈的R语言笔记 小陈的R语言笔記 2024-01-27

R包

安装R包:

install.packages(c("FactoMineR""factoextra"))

加载R包:

library("FactoMineR")
library("factoextra")

数据

我们将使用factoextra包中的decathlon2演示数据集:

#使用factoextra包中的decathlon2演示数据集
data(decathlon2)

#查看数据
head(decathlon2) 

对活跃个体和活跃变量进行子集化以进行主成分分析:

#选择行索引为1到23,列索引为1到10的子集
decathlon2.active <- decathlon2[1:23, 1:10]

#选择 decathlon2.active 数据框的第1到第6列,显示前4行
head(decathlon2.active[, 1:6], 4)
       X100m Long.jump Shot.put High.jump X400m X110m.hurdle
SEBRLE  11.04      7.58    14.83      2.07 49.81        14.69
CLAY    10.76      7.40    14.26      1.86 49.37        14.05
BERNARD 11.02      7.23    14.25      1.92 48.93        14.99
YURKOV  11.34      7.09    15.19      2.10 50.42        15.31

计算活跃个体/变量的主成分分析:

#计算活跃个体/变量的主成分分析
res.pca <- PCA(decathlon2.active, graph = FALSE)

#函数PCA ()的输出是一个列表,包括以下部分
print(res.pca)
   name               description                          
1  "$eig"             "eigenvalues"                        
2  "$var"             "results for the variables"          
3  "$var$coord"       "coord. for the variables"           
4  "$var$cor"         "correlations variables - dimensions"
5  "$var$cos2"        "cos2 for the variables"             
6  "$var$contrib"     "contributions of the variables"     
7  "$ind"             "results for the individuals"        
8  "$ind$coord"       "coord. for the individuals"         
9  "$ind$cos2"        "cos2 for the individuals"           
10 "$ind$contrib"     "contributions of the individuals"   
11 "$call"            "summary statistics"                 
12 "$call$centre"     "mean of the variables"              
13 "$call$ecart.type" "standard error of the variables"    
14 "$call$row.w"      "weights for the individuals"        
15 "$call$col.w"      "weights for the variables"          

绘图

函数包括:

get_eigenvalue(res.pca):提取主成分的特征值/方差

fviz_eig(res.pca):可视化特征值

get_pca_ind(res.pca), get_pca_var(res.pca): 分别提取个体和变量的结果。

fviz_pca_ind(res.pca), fviz_pca_var(res.pca): 分别可视化个体和变量的结果。

fviz_pca_biplot(res.pca):制作个体和变量的双图。

特征值/方差

使用函数get_eigenvalue(res.pca)提取主成分 (PC) 保留的特征值和方差比例:

#提取主成分 (PC) 保留的特征值和方差比例(即信息)
eig.val <- get_eigenvalue(res.pca)
eig.val
 eigenvalue variance.percent cumulative.variance.percent
Dim.1   4.1242133        41.242133                    41.24213
Dim.2   1.8385309        18.385309                    59.62744
Dim.3   1.2391403        12.391403                    72.01885
Dim.4   0.8194402         8.194402                    80.21325
Dim.5   0.7015528         7.015528                    87.22878
Dim.6   0.4228828         4.228828                    91.45760
Dim.7   0.3025817         3.025817                    94.48342
Dim.8   0.2744700         2.744700                    97.22812
Dim.9   0.1552169         1.552169                    98.78029
Dim.10  0.1219710         1.219710                   100.00000

使用函数fviz_eig(res.pca)生成碎石图:

#生成碎石图
fviz_eig(res.pca, addlabels = TRUE, ylim = c(0, 50))

相关变量图

使用函数get_pca_var(res.pca)提取变量结果:

#提取变量结果
var <- get_pca_var(res.pca)
var
Principal Component Analysis Results for variables
 ===================================================
  Name       Description                                    
"$coord"   "Coordinates for the variables"                
"$cor"     "Correlations between variables and dimensions"
"$cos2"    "Cos2 for the variables"                       
"$contrib" "contributions of the variables"               

访问不同的数据结果:

# Coordinates
head(var$coord)
# Cos2: quality on the factore map
head(var$cos2)
# Contributions to the principal components
head(var$contrib)

var$coord:创建散点图的变量坐标

var$cos2:表示因子图上变量的表示质量。它的计算方式为坐标平方:var.cos2 = var.coord * var.coord。

var$contrib:包含变量对主成分的贡献(以百分比表示)。变量 (var) 对给定主成分的贡献为(以百分比表示):(var.cos2 * 100) /(成分的总 cos2)。

变量PCA相关性圆图:

head(var$coord, 4)
              Dim.1       Dim.2      Dim.3      Dim.4      Dim.5
X100m     -0.8506257 -0.17939806  0.3015564  0.0335732 -0.1944440
Long.jump  0.7941806  0.28085695 -0.1905465 -0.1153896  0.2331567
Shot.put   0.7339127  0.08540412  0.5175978  0.1284684 -0.2488129
High.jump  0.6100840 -0.46521415  0.3300852  0.1445501  0.4027002
#绘制变量
fviz_pca_var(res.pca, col.var = "black")

代表质量(cos2):

head(var$cos2, 4)
 Dim.1       Dim.2      Dim.3      Dim.4      Dim.5
X100m     0.7235641 0.032183664 0.09093628 0.00112716 0.03780845
Long.jump 0.6307229 0.078880629 0.03630798 0.01331475 0.05436203
Shot.put  0.5386279 0.007293864 0.26790749 0.01650412 0.06190783
High.jump 0.3722025 0.216424207 0.10895622 0.02089474 0.16216747
#用 corrplot 包可视化所有维度上变量的 cos2
library("corrplot")
corrplot(var$cos2, is.corr=FALSE)
#使用函数fviz_cos2()创建变量 cos2 的条形图
fviz_cos2(res.pca, choice = "var", axes = 1:2)
#根据变量的 cos2 值对变量进行着色col.var = "cos2"
#使用参数gradient.cols自定义颜色
fviz_pca_var(res.pca, col.var = "cos2",
             gradient.cols = c("#00AFBB""#E7B800""#FC4E07"), 
             repel = TRUE #允许文本标签自动调整位置以避免重叠
)
#根据变量的 cos2 值更改变量的透明度alpha.var = "cos2"
fviz_pca_var(res.pca, alpha.var = "cos2")

变量对 PC轴的贡献

提取变量的贡献:

head(var$contrib, 4)
Dim.1      Dim.2     Dim.3     Dim.4     Dim.5
X100m     17.544293  1.7505098  7.338659 0.1375524  5.389252
Long.jump 15.293168  4.2904162  2.930094 1.6248594  7.748815
Shot.put  13.060137  0.3967224 21.620432 2.0140727  8.824401
High.jump  9.024811 11.7715838  8.792888 2.5498795 23.115504

使用函数corrplot()突出显示每个维度最有贡献的变量:

library("corrplot")
corrplot(var$contrib, is.corr=FALSE)

使用函数fviz_contrib()绘制变量贡献的条形图

# Contributions of variables to PC1
fviz_contrib(res.pca, choice = "var", axes = 1, top = 10)
# Contributions of variables to PC2
fviz_contrib(res.pca, choice = "var", axes = 2, top = 10)

choice = "var"表示我们希望可视化的是变量的贡献度

axes = 1指定了要可视化的主成分的编号,这里是第一主成分(PC1)

top = 10表示显示对该主成分最具影响力的前10个变量

PC1 和 PC2 的总贡献:

#PC1 和 PC2 的总贡献
fviz_contrib(res.pca, choice = "var", axes = 1:2, top = 10)

在相关图上突出显示最重要(或贡献)的变量:

#在相关图上突出显示最重要(或贡献)的变量
fviz_pca_var(res.pca, col.var = "contrib",
             gradient.cols = c("#00AFBB""#E7B800""#FC4E07"))

根据变量的 contrib 值更改变量的透明度:

#根据变量的 contrib 值更改变量的透明度alpha.var = "contrib"             
fviz_pca_var(res.pca, alpha.var = "contrib")

按自定义连续变量着色:

# 创建一个长度为10的随机连续变量
set.seed(123)
my.cont.var <- rnorm(10)

# 通过连续变量对变量进行着色
fviz_pca_var(res.pca, col.var = my.cont.var,
             gradient.cols = c("blue""yellow""red"),
             legend.title = "Cont.Var")

按组着色:

# 创建3组变量(中心点 = 3)
set.seed(123)
res.km <- kmeans(var$coord, centers = 3, nstart = 25)

# 将结果聚类的组别转换为因子变量
grp <- as.factor(res.km$cluster)

# 通过组别对变量进行着色
fviz_pca_var(res.pca, col.var = grp, 
             palette = c("#0073C2FF""#EFC000FF""#868686FF"),
             legend.title = "Cluster")

尺寸说明:

# 使用dimdesc函数对主成分分析(PCA)结果进行描述
res.desc <- dimdesc(res.pca, axes = c(1,2), proba = 0.05)

# 对第一主成分的描述
res.desc$Dim.1

# 对第二主成分的描述
res.desc$Dim.2
Link between the variable and the continuous variables (R-square)
=================================================================================
             correlation      p.value
Long.jump      0.7941806 6.059893e-06
Discus         0.7432090 4.842563e-05
Shot.put       0.7339127 6.723102e-05
High.jump      0.6100840 1.993677e-03
Javeline       0.4282266 4.149192e-02
X400m         -0.7016034 1.910387e-04
X110m.hurdle  -0.7641252 2.195812e-05
X100m         -0.8506257 2.727129e-07
Link between the variable and the continuous variables (R-square)
=================================================================================
           correlation      p.value
Pole.vault   0.8074511 3.205016e-06
X1500m       0.7844802 9.384747e-06
High.jump   -0.4652142 2.529390e-02

个案图

使用函数get_pca_ind()提取个人的结果:

#使用函数get_pca_ind()提取个人的结果
ind <- get_pca_ind(res.pca)
ind
Principal Component Analysis Results for individuals
 ===================================================
  Name       Description                       
"$coord"   "Coordinates for the individuals" 
"$cos2"    "Cos2 for the individuals"        
"$contrib" "contributions of the individuals"

访问不同的组件:

# Coordinates of individuals
head(ind$coord)
# Quality of individuals
head(ind$cos2)
# Contributions of individuals
head(ind$contrib)

使用fviz_pca_ind()生成个体图:

#使用fviz_pca_ind()生成个体图
fviz_pca_ind(res.pca)

根据 cos2 值对个体进行着色:

#根据 cos2 值对个体进行着色
fviz_pca_ind(res.pca, col.ind = "cos2"
             gradient.cols = c("#00AFBB""#E7B800""#FC4E07"),
             repel = TRUE # 避免文本重叠(如果点很多则速度较慢)
)

根据相应个体的 cos2 来更改点大小:

#根据相应个体的 cos2 来更改点大小
fviz_pca_ind(res.pca, pointsize = "cos2"
             pointshape = 21, fill = "#E7B800",
             repel = TRUE # 避免文本重叠(如果点很多则速度较慢)
)

通过 cos2 更改点大小和颜色:

#通过 cos2 更改点大小和颜色
fviz_pca_ind(res.pca, col.ind = "cos2", pointsize = "cos2",
             gradient.cols = c("#00AFBB""#E7B800""#FC4E07"),
             repel = TRUE # 避免文本重叠(如果点很多则速度较慢)
)

使用 fviz_cos2() 函数创建个体表示质量 (cos2) 的条形图:

#使用fviz_cos2()函数创建个体表示质量 (cos2) 的条形图
fviz_cos2(res.pca, choice = "ind")

可视化个人对前两个主成分的贡献:

#在PC1和PC2上的总体贡献度
fviz_contrib(res.pca, choice = "ind", axes = 1:2)

按自定义连续变量着色:

# 创建一个长度为23的随机连续变量,
# 与PCA中活跃个体的数量相同
set.seed(123)
my.cont.var <- rnorm(23)

# 通过连续变量对个体进行着色
fviz_pca_ind(res.pca, col.ind = my.cont.var,
             gradient.cols = c("blue""yellow""red"),
             legend.title = "Cont.Var")

按组着色:

# 查看数据集的前3行
head(iris, 3)

# 在进行PCA分析之前,移除变量Species(索引为5)
iris.pca <- PCA(iris[,-5], graph = FALSE)

# 对PCA的个体结果进行可视化
fviz_pca_ind(iris.pca,
             geom.ind = "point"# 仅显示点而不显示文本
             col.ind = iris$Species# 按照组别着色
             palette = c("#00AFBB""#E7B800""#FC4E07"),
             addEllipses = TRUE, # 添加浓度椭圆
             legend.title = "Groups"
)
 Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
# 添加置信椭圆
fviz_pca_ind(iris.pca, geom.ind = "point", col.ind = iris$Species
             palette = c("#00AFBB""#E7B800""#FC4E07"),
             addEllipses = TRUE, ellipse.type = "confidence",
             legend.title = "Groups"
)

调色板:

grey表示灰色调色板;

啤酒厂调色板,例如RdBuBlues……;要查看全部内容,请在 R: 中输入以下内容RColorBrewer::display.brewer.all()

自定义调色板,例如c(“blue”,“red”)

科学期刊调色板ggsci R package,例如:npgaaaslancetjcoucscgbuchicagosimpsonsrickandmorty

#使用 jco(临床肿瘤学杂志)调色板
fviz_pca_ind(iris.pca,
             label = "none"# 隐藏个体标签
             habillage = iris$Species# 按组别着色
             addEllipses = TRUE, # 添加浓度椭圆
             palette = "jco"
)

图形自定义

图表定制

轴的维度:

# 在维度2和3上的变量
fviz_pca_var(res.pca, axes = c(2, 3))

# 在维度2和3上的个体
fviz_pca_ind(res.pca, axes = c(2, 3))

绘图元素:点、文本、箭头:

geom.var:指定用于绘制变量的几何图形的文本。允许的值为 c("point", "text","arrow",)的组合。

使用geom.var = "point", 仅显示点;

用于geom.var = "text"仅显示文本标签;

用于geom.var = c("point", "text")显示点和文本标签

用于geom.var = c("arrow", "text")显示箭头和标签(默认)

#显示变量的点和文本标签
fviz_pca_var(res.pca, 
             geom.var = c("point""text"))

geom.ind:指定用于绘制个体的几何图形的文本。允许的值为 c(“point”, “text”) 的组合。

使用geom.ind = "point", 仅显示点;

用于geom.ind = "text"仅显示文本标签;

用于geom.ind = c("point", "text")显示点标签和文本标签(默认)

#仅显示个体的文本标签
fviz_pca_ind(res.pca, 
             geom.ind =  "text")

绘图元素的大小和形状:

labelsize:文本标签的字体大小,例如:labelsize = 4

pointsize:点的大小,例如:pointsize = 1.5

arrowsize:箭头的大小。控制箭头的粗细,例如:arrowsize = 0.5

pointshape:点的形状,例如:pointshape = 21。键入ggpubr::show_point_shapes()以查看可用的点形状。

# 改变箭头和标签的大小
fviz_pca_var(res.pca, arrowsize = 1, labelsize = 5, 
             repel = TRUE)
             
# 改变点的大小、形状和填充颜色,以及标签的大小
fviz_pca_ind(res.pca, 
             pointsize = 3, pointshape = 21, fill = "lightblue",
             labelsize = 5, repel = TRUE)

椭圆:

convex:绘制一组点的凸包。

confidence:将组平均点周围的置信椭圆绘制为函数coord.ellipse()

t:假设多元 t 分布。

norm:假设多元正态分布。

euclid:绘制一个半径等于 level 的圆,表示距圆心的欧氏距离。coord_fixed()除非应用,否则该椭圆可能不会显示为圆形。

ellipse.level:用于改变正态概率中浓度椭圆的大小。例如,指定 ellipse.level = 0.95ellipse.level = 0.66

# 添加置信椭圆
fviz_pca_ind(iris.pca, geom.ind = "point"
             col.ind = iris$Species# 按组别着色
             palette = c("#00AFBB""#E7B800""#FC4E07"),
             addEllipses = TRUE, ellipse.type = "confidence",
             legend.title = "Groups"
)

# 添加凸包
fviz_pca_ind(iris.pca, geom.ind = "point",
             col.ind = iris$Species# 按组别着色
             palette = c("#00AFBB""#E7B800""#FC4E07"),
             addEllipses = TRUE, ellipse.type = "convex",
             legend.title = "Groups"
)

组平均点:

mean.point = FALSE:删除均值点

# 对PCA的个体结果进行可视化,仅显示点而不显示文本,按组别着色
fviz_pca_ind(iris.pca,
             geom.ind = "point"# 仅显示点而不显示文本
             group.ind = iris$Species# 按组别着色
             legend.title = "Groups",
             mean.point = FALSE) # 不显示均值点

轴线:

axes.linetype:可用于指定轴的线类型。默认为“虚线”。允许的值包括“空白”、“实心”、“点线”等。要查看所有可能的值,请ggpubr::show_line_types()在 R 中键入。

axes.linetype =“blank”:删除轴线

fviz_pca_var(res.pca, axes.linetype = "blank")

图形参数:

可以使用 ggpar() 更改的图形参数包括:

1、主标题、轴标签和图例标题

2、图例位置。可能的值:“顶部”、“底部”、“左”、“右”、“无”。

3、调色板。

4、主题。允许的值包括:theme_gray()、theme_bw()、theme_minimal()、theme_classic()、theme_void()

# 对PCA的个体结果进行可视化,仅显示点,按组别着色
ind.p <- fviz_pca_ind(iris.pca, 
                      geom = "point"#仅显示点
                      col.ind = iris$Species#按照物种进行分组着色

# 使用ggpubr包中的ggpar函数对图形进行定制
ggpubr::ggpar(ind.p,
              title = "Principal Component Analysis",#设置图形的标题
              subtitle = "Iris data set",#设置图形的副标题
              caption = "Source: factoextra",#设置图形的注释信息
              xlab = "PC1", ylab = "PC2",#设置X轴和Y轴的标签
              legend.title = "Species", legend.position = "top",#设置图例的标题为"Species",并将图例放置在图的顶部
              ggtheme = theme_gray(), palette = "jco"#使用"jco"调色板
)

双标图

制作个案和变量的简单双图:

# 对PCA的双标图进行可视化,使用repel避免标签重叠
# col.var = "#2E9FDF":设置变量的颜色为蓝色
# col.ind = "#696969":设置个体的颜色为灰色
fviz_pca_biplot(res.pca, repel = TRUE,
                col.var = "#2E9FDF"# 变量颜色
                col.ind = "#696969"  # 个体颜色
)

使用iris.pca输出:

1、制作个体和变量的双图

2、按组更改个体的颜色:col.ind = iris$Species

3、仅显示变量的标签:label = "var"或使用geom.ind = "point"

# 对PCA的双标图进行可视化,着色个体,添加椭圆,标记变量,调整颜色和标签位置
fviz_pca_biplot(iris.pca, 
                col.ind = iris$Species, palette = "jco"
                addEllipses = TRUE, label = "var",
                col.var = "black", repel = TRUE,
                legend.title = "Species")

自定义个体和可变颜色:

# 对PCA的双标图进行可视化
fviz_pca_biplot(iris.pca, 
                # 个体填充颜色按组别
                geom.ind = "point",
                pointshape = 21,
                pointsize = 2.5,
                fill.ind = iris$Species,
                col.ind = "black",
                # 变量颜色按组别
                col.var = factor(c("sepal""sepal""petal""petal")),
                # 图例标题
                legend.title = list(fill = "Species", color = "Clusters"),
                # 避免标签重叠
                repel = TRUE
) +
  ggpubr::fill_palette("jco") +      # 个体填充颜色
  ggpubr::color_palette("npg")      # 变量颜色
# 对PCA的双标图进行可视化
fviz_pca_biplot(iris.pca, 
                # 个体
                geom.ind = "point",
                fill.ind = iris$Species, col.ind = "black",
                pointshape = 21, pointsize = 2,
                palette = "jco",
                addEllipses = TRUE, 
                # 变量
                alpha.var = "contrib", col.var = "contrib",
                gradient.cols = "RdYlBu",
                # 图例标题
                legend.title = list(fill = "Species", color = "Contrib",
                                    alpha = "Contrib")
)

参考资料:

《Practical Guide to Principal Component Methods in R》


大家有兴趣可以加群,可以在群里讨论,学习,共同进步!





继续滑动看下一个

R语言绘图 | 主成分分析(PCA)从入门到精通

小陈的R语言笔记 小陈的R语言笔記
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存