查看: 2366|回复: 4

[R语言] 如何做主成分分析加“置信区间”?

[复制链接]

管理员

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

主题
153
注册时间
2019.7.8
在线时间
243 小时

发表于 2020.5.14 11:52:59 | 显示全部楼层 |阅读模式
使用R语言为PCA散点图加置信区间的方法,我知道的有三种,分别是使用ggplot2、ggord和 ggfortify三个R包去绘制。后面两个R包是基于ggplot2的快捷方法,接下来就以R自带的Iris数据集为例,看下如何绘制的。

使用R自带数据集 iris 的前4列进行主成分分析,主要使用R的prcomp()基础函数。
head(iris)


ord <- prcomp(iris[, 1:4])
summary(ord)



我们看到PC1的方差解释率达92.46%,PC2的方差解释率为5.31%,主成分分析就做完了,是不是非常简单!接下来进行数据可视化。

使用ggplot2从头绘制

#提取不同记录的PC1~PC4数值,即点的横纵坐标值;
dt<-ord$x
head(dt)
#将iris数据集的第5列数据合并进来;
df<-data.frame(dt,iris$Species)
head(df)



#生成坐标轴标题;
summ<-summary(ord)
xlab<-paste0("PC1(",round(summ$importance[2,1]*100,2),"%)")
ylab<-paste0("PC2(",round(summ$importance[2,2]*100,2),"%)")
#载入ggplot2包;
library(ggplot2)

p1<-ggplot(data = df,aes(x=df$PC1,y=df$PC2,color=df$iris.Species))+
stat_ellipse(aes(fill=df$iris.Species),
type = "norm", geom ="polygon",alpha=0.2,color=NA)+
geom_point()+labs(x=xlab,y=ylab,color="")+
guides(fill=F)
p1

初始的绘制效果如下,当然你可以做进一步的个性化调整,这里不做赘述。



使用ggord包绘制

#载入所需R包;
library(ggord)
#绘制散点图;repel避免标签重叠;
p2 <- ggord(ord, iris$Species,coord_fix=F,labcol = 'purple', repel = TRUE)
p2


#改变箭头(特征向量)的scaling(箭头大小), arrow length(箭头长度), line color, size(粗细), type;

p3 <- ggord(ord, iris$Species,coord_fix=F,labcol = 'purple', repel = TRUE,
arrow = 0.25, vec_ext = 2,
veccol = 'blue', veclsz = 0.5, vectyp = 'solid')
p3


#隐藏箭头;
p4 <- ggord(ord, grp_in = iris$Species,coord_fix=F,
arrow=0, vec_ext =0,txt=NULL)
p4


#自定义点的大小和颜色、透明度;
p5 <- ggord(ord, iris$Species,coord_fix=F,
cols = c('purple', 'orange', 'blue'), size=2,alpha=0.7,
arrow=0, vec_ext =0,txt=NULL)
p5



#改变置信椭圆透明度;
p6 <- ggord(ord, iris$Species,coord_fix=F,
cols = c('purple', 'orange', 'blue'), size=2,alpha=0.7,
arrow=0, vec_ext =0,txt=NULL,poly = FALSE)
p6


#自定义置信椭圆描边的样式;
p7 <- ggord(ord, iris$Species,coord_fix=F,
cols = c('purple', 'orange', 'blue'), size=2,alpha=0.7,
arrow=0, vec_ext =0,txt=NULL,poly = FALSE,polylntyp="dashed")
p7


#或者让描边与分组建立映射关系;
p8 <- ggord(ord, iris$Species,coord_fix=F,
cols = c('purple', 'orange', 'blue'), size=2,alpha=0.7,
arrow=0, vec_ext =0,txt=NULL,poly = FALSE,polylntyp=iris$Species)
p8


#添加多边形区域;
p9 <- ggord(ord, iris$Species,coord_fix=F,
cols = c('purple', 'orange', 'blue'), size=2,alpha=0.7,
arrow=0, vec_ext =0,txt=NULL,ellipse = FALSE, hull = TRUE)
p9


#自定义点的样式;
#隐藏网格线;
library(ggplot2)
p10<-p9+scale_shape_manual('Groups', values = c(0, 1, 2))+
theme(panel.grid=element_blank())
p10


关于这个R包的安装需要注意:ggord在GitHub(https://github.com/fawda123/ggord)上,需要换种方式安装。

#所需R包的安装;
#install.packages('devtools')
library(devtools)
#install_github('fawda123/ggord')
library(ggord)


如果以上的方法出错,可尝试本地安装的方法。将R包下载下来后,准备用一种非常诡异的方法进行本地安装。

首先,把安装包复制到R的安装目录中,我这里是(64位):“C:\Program Files\R\R-3.6.2\bin\x64”, 然后在Windows搜索“cmd”,打开命令提示符窗口,cd到“C:\Program Files\R\R-3.6.2\bin\x64”文件中,执行rcmd INSTALL ggord-1.1.4.tar.gz 命令进行本地安装,如下:


使用ggfortify包绘制


#安装ggfortify包;
#install.packages("ggfortify")
#载入ggfortify包;
library(ggfortify)

#快速绘制主成分散点图;
autoplot(ord, data = iris, colour = 'Species')


#添加特征向量;
autoplot(ord, data = iris, colour = 'Species',
loadings = TRUE, loadings.colour = 'blue',
loadings.label = TRUE, loadings.label.size = 3)


#载入cluster包;
#添加K-means聚类结果;给定 frame = TRUE,可以把每个集群圈出来。
library(cluster)
autoplot(fanny(iris[-5], 3), frame = TRUE)


#你也可以通过 frame.type 来选择圈的类型。
#更多选择请参照ggplot2::stat_ellipse里面的frame.type的type关键词。
autoplot(pam(iris[-5], 3), frame = TRUE, frame.type = 'norm')


#添加Fisher局部判别分析聚类;
#lfda包支持一系列的Fisher局部判别分析方法,包括半监督lfda,非线性lfda。
#install.packages("lfda")
library(lfda)
# Fisher局部判别分析 (LFDA)
model <- lfda(iris[-5], iris[, 5], 4, metric="plain")
autoplot(model, data = iris, frame = TRUE, frame.colour = 'Species')


最后,以上绘图效果只是初步结果,大家还可利用ggplot2的theme()函数做进一步的个性化分析。这三个R包个人觉得ggord可能更快捷一些,如果需要进一步做聚类,推荐使用ggfortify 。

参考资料:https://terrytangyuan.github.io/2015/11/24/ggfortify-intro/

                                
本文作者:基迪奥-莫北

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
新的一天加油!
回复

使用道具 举报

帝王蝶

Rank: 4

主题
0
注册时间
2016.5.16
在线时间
129 小时

发表于 2020.5.14 15:29:05 | 显示全部楼层
非常感谢
新的一天加油!
回复

使用道具 举报

中华鲟

Rank: 5Rank: 5

主题
13
注册时间
2018.1.3
在线时间
268 小时

热心会员活跃会员


发表于 2020.5.15 08:57:14 | 显示全部楼层
(๑•̀ㅂ•́)و✧
回复 支持 反对

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
3
注册时间
2017.4.12
在线时间
27 小时

发表于 2020.5.16 17:16:03 | 显示全部楼层
非常好
回复

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
5
注册时间
2020.4.11
在线时间
8 小时

发表于 2020.5.18 14:38:02 | 显示全部楼层
好资源!学习
加油
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表