PCA,即主成分分析(Principal Component Analysis),是一种考察多个变量间相关性的降维统计方法,其原理是设法将原来变量重新组合成一组新的互相无关的几个综合变量,同时根据实际需要从中可以取出几个较少的综合变量尽可能多地反映原来变量的信息的统计方法(摘自百度百科)。
通俗来说,就是将数据从高维映射到低维以达到降低特征维度的目的。计算时,主要通过对协方差矩阵进行特征分解而得到数据的特征向量(即主成分)与其权值(特征值)。
加载包
1)设置工作目录
rm(list=ls())#clear Global Environment
setwd('D:\\桌面\\PCA')#设置工作路径
2)安装、加载包
#安装所需R包
# install.packages("ggplot2")
# install.packages("ggpubr")
# install.packages("ggsignif")
#加载包
library(ggplot2)#绘图包
library(ggpubr)
library(ggsignif)
读取数据
#读取数据(以之前做PCoA分析的OTU表为例)
otu_raw <- read.table(file="otu.txt",sep="\t",header=T,check.names=FALSE ,row.names=1)
#由于排序分析函数所需数据格式原因,需要对数据进行转置
otu <- t(otu_raw)
PCA分析
#pca分析(此处使用R内置函数prcomp()函数进行分析)
df_PCA <- prcomp(otu,scal=TRUE)
#预览pca分析结果
df_PCA_sum <- summary(df_PCA)
#提取出PC1及PC2的坐标
PC12 <- df_PCA$x[,1:2]
#计算各主成分解释度
pc <- df_PCA_sum$importance[2,]*100
加入分组信息
#PCl2原来是matrix,转化为data.frame
PC12 <- as.data.frame(PC12)
#给PC12添加samp1es变量
PC12$samples <- row.names(PC12)
# 添加分组信息
group <- read.table("group.txt", sep='\t', header=T)
#修改列名
colnames(group) <- c("samples","group")
#将绘图数据和分组合并
df <- merge(PC12,group,by="samples")
head(df)
绘制PCA散点图
color=c("#1597A5","#FFC24B","#FEB3AE")#颜色变量
p1<-ggplot(data=df,aes(x=PC1,y=PC2,
color=group,shape=group))+#指定数据、X轴、Y轴,颜色
theme_bw()+#主题设置
geom_point(size=1.8)+#绘制点图并设定大小
theme(panel.grid = element_blank())+
geom_vline(xintercept = 0,lty="dashed")+
geom_hline(yintercept = 0,lty="dashed")+#图中虚线
#geom_text(aes(label=samples, y=V2+0.03,x=V1+0.03, vjust=0),size=3.5)+#添加数据点的标签
# guides(color=guide_legend(title=NULL))+#去除图例标题
labs(x=paste0("PC1 (",pc[1],"%)"),
y=paste0("PC2 (",pc[2],"%)"))+#将x、y轴标题改为贡献度
stat_ellipse(data=df,
geom = "polygon",level=0.95,
linetype = 2,size=0.5,
aes(fill=group),
alpha=0.2,
show.legend = T)+
scale_color_manual(values = color) +#点的颜色设置
scale_fill_manual(values = c("#1597A5","#FFC24B","#FEB3AE"))+
theme(axis.title.x=element_text(size=12),#修改X轴标题文本
axis.title.y=element_text(size=12,angle=90),#修改y轴标题文本
axis.text.y=element_text(size=10),#修改x轴刻度标签文本
axis.text.x=element_text(size=10),#修改y轴刻度标签文本
panel.grid=element_blank())#隐藏网格线
p1