R统计绘图-PCA分析绘图及结果解读(误差线,多边形,双Y轴图、球形检验、KMO和变量筛选等)

article/2025/7/8 23:48:43

虽然PCA和RDA分析及绘图都写过教程,但是对于结果的解释都没有写的很详细,刚好最近有人询问怎样使用FactoMineR factoextra包进行PCA分析。所以使用R统计绘图-环境因子相关性热图中的不同土壤环境因子数据进行PCA绘图和结果解读推文。

一、 数据准备

# 1.1 设置工作路径
#knitr::opts_knit$set(root.dir="D:\\EnvStat\\PCA")# 使用Rmarkdown进行程序运行
Sys.setlocale('LC_ALL','C') # Rmarkdown全局设置
options(stringsAsFactors=F)# R中环境变量设置,防止字符型变量转换为因子
setwd("D:\\EnvStat\\PCA")# 1.2 读入环境因子数据-包含样本和环境因子分类信息
data <- read.table("env.csv", header = T, row.names = 1, sep = ",")
data
dim(data)# 1.3 提取环境因子数据-并将数据转换为数值格式
# apply(data[-1,4:14],2,as.numeric) 表示将数据表按列转换为数值型数据
env = data.frame(data[-1,1:3],apply(data[-1,4:14],2,as.numeric),row.names=rownames(data[-1,]))
###env = data[-1,];env[4:14] = as.numeric(unlist(env[4:14])) # 此代码可以达到上述相同目的
head(env)
dim(env)
## 图2的表可以直接读入
#env=read.csv("env.csv",header = T,row.names = 1,
#sep = ",",comment.char = "",
#stringsAsFactors = F,
#colClasses = c(rep("character",4),rep("numeric",11)))
#head(env) # 查看数据前几行# 1.4 提取环境因子分类信息
type = data.frame(t(data[1,-c(1:3)]))
dim(type)
type # 分类信息只是为了展示,不代表真实分类

图1|data.csv。环境因子分类信息可以另整理一张表。没有环境因子分类信息就整理为图2格式即可。

图2|环境因子及分组信息表,env.csv。行为样品名称,列为环境因子名称和分组信息,共有11个环境变量,3个分组信息。

二、 主成分分析(PCA)

数据都准备好后,使用FactoMineR中的PCA()函数进行PCA分析,factoextra包可用于提取PCA分析结果信息和绘图(用ggplot2绘图也可)。配套的FactoInvestigate包(http://factominer.free.fr/reporting/index.html)可以自动输出FactoMineR中PCA,MCA和CA分析的结果解释。

# 2.1 调用R包
#install.packages("FactoInvestigate")
#install.packages("htmltools",version="0.5.2")
library(FactoMineR)
library(factoextra) # 用于提取PCA分析结果信息,其实不用也可以。
library(FactoInvestigate)
#browseVignettes("FactoMineR") # 查看帮助文档# 2.2 PCA分析
#res.pca <- PCA(env[4:14], graph = TRUE,axes = c(1,2)) 
##graph = TRUE会默认绘制前两个轴的样本与响应变量PCA图(两张图)。
#page(PCA) # 查看函数代码## 具有附加定性变量的PCA分析:附加样本、定性和定量变量对主成分分析没有贡献,
###坐标来自于基于PCA分析结果的预测值。
res.pca <- PCA(env[2:14], scale.unit = TRUE,# 默认对数据进行scale标准化,最后响应变量间的均值为0,sd=1。##相同尺度的标准化避免了一些变量仅仅因为其较大的度量单位而成为主导变量。使变量具有可比性。ncp = 11, # 结果中默认保留5,nrow(env[-ind.sup,])-1(样本数)和ncol(env[2:14][-c(quanti.sup,quali.sup)])(响应变量数)中的最小值个主成分#ind.sup = 1, # 附加样本,1表示数据表的第一行,不是必须的数据,默认为NULL。附加样本的坐标将根据PCA分析结果进行预测。quanti.sup = NULL, # 附加的定量响应变量数据,不是必须的,默认为NULL。基于PCA分析结果预测坐标。quali.sup = 1:2, # 附加定性变量,分类信息最好不要用数字表示,在行数区间的数字,运行会报错。##1:2表示定性变量在env[2:14]中的列数。不是必须的,默认为NULL。基于PCA分析结果预测坐标,可用于对样本进行分组着色。row.w = NULL, col.w = NULL, # 分别给样本和响应变量设定权重,默认所有样本或所有响应变量的权重都是一样的。默认相当于对变量数据进行了中心化,变量均值接近0。可以设置为1个数字,也可以设置为分别与行数或列数相等的矢量。graph = FALSE)

注::PCA是基于线性模型的排序方法,因此会涉及数据的中心化和标准化。数据中心化是将原数据减去其均值,中心化后数据的均值为0。样方的中心化是让每个样方的平均值为0,响应变量中心化是让每个响应变量的平均值为0。如果响应变量的量纲不同,响应变量数据就需要标准化。数据的标准化(归一化)是指将数据按照比例缩放,使之所有变量具有相同的尺度,比如常用的Z-score标准化(先对变量进行零中心化,再除以数据标准误差),或者离差标准化(数据减去最小值,再除以最大值与最小值的差值)后数据尺度为[0,1],而MaxAbsScaler绝对值最大标准化(数据除以最大绝对值,不移动中心点。不会将稀疏矩阵变得稠密)后数据尺度为[-1,1]。数据转换方法的选择,需要考虑研究在意的是数据的数值大小变化还是数据变化程度的变化,在意数值本身的变化可以使用原始数据或log转换,在意数据变化程度,则可进行标准化。当数据集中含有离群点,即异常值时,可以用z-score进行标准化,但是标准化后的数据并不理想,因为异常点的特征往往在标准化之后容易失去离群特征。此时可以用RobustScaler方法针对离群点做标准化处理。

FactoInvestigate包的Investigate()可以自动输出FactoMineR包PCA分析的结果解释,输出文件可以是word,html和PDF。默认输出离群值,主成分对样本方差的解释度检测,维度描述,样本聚类及对每个cluster贡献高的变量等信息。

# 2.3 FactoInvestigate包的Investigate()输出结果报告
#?Investigate # 查看函数帮助信息
Investigate(res.pca,file = "Investigate.Rmd",openFile = FALSE,document = c("word_document"))

注:输出的结果包括Investigate.docx或Workspace.RData和Investigate.Rmd。Investigate.docx是word版PCA分析结果报告与结果解读,写的很详细。如果因为某种原因输出报告文件报错(常见htmltools包版本或LaTeX报错),就会输出Workspace.RData和Investigate.Rmd,包含分析代码和绘图结果,两者放在在同一目录,运行Investigate.Rmd,可以复现PCA分析结果。图不是太好看,可以输出数据自己画。

# 2.4 PCA分析结果的输出数据介绍
str(res.pca)# 输出一个list数据集
summary(res.pca,ncp=2,nbelements=Inf) # nbelements=Inf,输出所有结果## 2.4.1 主成分(PC)特征值
## eigenvalue:特征值可以用来确定在PCA之后要保留的主成分的数量
get_eigenvalue(res.pca) # 11个主成分累计代表的样本方差为100%。
sum(res.pca$eig[,1]) # 所有主成分所表示的总方差为11(11个原始变量)。
res.pca$eig # 包含3列数据,每个主成分的特征值,方差百分比和累积方差百分比。

图3|主成分特征值,res.pca$eig。特征值表示每个主成分保留的原始变量的变化量。特征值从高到低排序,PC1表示变量变化最大的方向。选择代表方差>1(特征值>1表示PC比标准化数据中的一个原始变量解释的方差更大。数据未标准化或变量权重不同,不能这样进行选择),此处累计方差解释量~65%(>80%更好)的PC1和PC2进行可视化和后续分析(也可以选择累计方差解释率超过一定阈值的PC用作后续分析)。

## 2.4.2 样本PCA输出数据
res.pca$ind # 包含所有样本的输出结果的矩阵列表
#get_pca_ind(res.pca) # 可以使用factoextra包的函数提取样本输出数据。res.pca$ind$coord # 样本在PC的坐标=左奇异值/sqrt(eig)
res.pca$ind$cos2 # 样本坐标的平方/样本Euclid(L2)范数的平方(标准化数据)。
## 未标准化数据,样本1的cos2=ind1.coord^2/每个个体与PCA重心之间的平方距离(d2)。d2=([(Var1-Var1.mean)/Var1.sd]^2+...+[(Varn-Varn.mean)/Varn.sd]^2)
res.pca$ind$contrib # 所有样本对主成分的贡献度(%)=(res.pca$ind$coord^2)*100/eig^2/样本数
res.pca$ind$dist # 变量标准化之后,样本L2范数(Euclid范数),即每个样本包含变量的(值平方*变量权重)的和的平方根
##可反应样本间距离。dist值差异越大,样本相似性越小。

注:L2范数指向量中所有数据平方和的平方根。范数介绍:https://blog.csdn.net/a493823882/article/details/80569888

## 2.4.3 响应变量PCA输出数据
res.pca$var # 包含所有响应变量相关结果的矩阵列表
#get_pca_var(res.pca) # 可以使用factoextra包的函数提取响应变量输出数据。res.pca$var$coord # 所有响应变量(这里是环境因子)的坐标,等于右奇异值*特征根的平方根=载荷值(主成分能代表的响应变量的方差)*特征根(主成分的标准误差)。res.pca$var$cor # 样本权重一样时,每个响应变量与轴的相关性=响应变量坐标/(变量值的平方和/样本数的平方根)。绝对值越大,表明相关性越强,正负表示方向。res.pca$var$cos2 # 所有响应变量与轴相关性的平方,等于res.pca$var$cor^2。res.pca$var$contrib # 响应变量对每个主成分的方差贡献值=(var$cos2*100)/apply(res.pca$var$cos2,2,sum)

注:PCA()也计算了响应变量的dist,计算方式为dist2.var <- as.vector(crossprod(rep(1, nrow(X)), as.matrix(X^2 * row.w)))。X为标准化后的数据矩阵,row.w=样本权重/(样本权重之和),crossprod()内积运算。

# 2.4.4 附加变量预测输出结果:附加样本、定性和定量变量对主成分没有任何贡献。
res.pca$quali.sup # 附加定性变量中每个分类的输出结果。最后输出的报告里会基于Wilks test分析那些定性变量能更好的解释样本之间的差异。
res.pca$quali.sup$coord # 定性变量中每个分类的坐标
res.pca$quali.sup$cos2 # 定性变量中每个分类被主成分代表的部分
res.pca$quali.sup$v.test # 定性变量中每个分类Normal distribution准则
res.pca$quali.sup$eta2 # 定性变量与每个主成分的相关性系数的平方
res.pca$quali.sup$dist # 可用于比较分类变量个水平间的距离。

图4|附加变量预测输出结果。

# 2.4.5 其它输出数据
library(rstatix)
#env[4:11] %>% get_summary_stats(type="mean_sd")
res.pca$call$centre # 响应变量的均值
res.pca$call$ecart.type # 响应变量的标准误差
res.pca$call$row.w.init # 样本权重
res.pca$call$col.w # 响应变量权重
res.pca$call$ncp # 主成分维度
#env[4:11] %>% group_by(env$tillage) %>% get_summary_stats(type="mean")
res.pca$call$quali.sup # 附加定性变量统计值
res.pca$call$X # 原始数据
res.pca$call$call # 运行代码

三、PCA分析结果绘图

factoextra包中的绘图函数fviz_pca_biplot()可以用于绘制PCA双序图。fviz()是ggpubr包中ggscatter()函数的包装器,可以与ggpubr的函数联用。也可用提取的数据使用ggplot2绘图。这里先使用ggplot2绘图,下篇文章介绍factoextra包中的绘图函数。

3.1 提取绘图数据

FactoInvestigate包的Investigate()默认输出的图很多,但是信息没有整合,而且很多细节还需要调整。这里提取数据,自己使用ggplot2进行绘图。

# 3.1.1 提取样本坐标
# get_pca_ind(res.pca) # factoextra提取分析结果,可以很方便的提取prcomp()和princomp()函数的样本PCA分析结果。
sam=data.frame(res.pca$ind$coord)
sam
sam=data.frame(sam[1:2],env[1:3]) # 添加样本分组信息
sam# 3.1.2 提取特征值-每个主成分对样本方差的解释度。
fviz_eig(res.pca,addlabels = TRUE) # 对每个主成分对方差的解释度绘制柱形图。
#fviz_screeplot(res.pca)# 对每个主成分对方差的解释度绘制柱形图。
eig.val <- get_eigenvalue(res.pca) # get_eig(res.pca)效果一样,提出的是res.pca$eig矩阵中数据。
eig.val
## 提取前两个主成分是特征值,并保留两位小数点。
PC1=round(eig.val[1,2],2)
PC2=round(eig.val[2,2],2)
PC1
PC2# 3.1.3 提取响应变量坐标值
var <- get_pca_var(res.pca) # 提取响应变量结果矩阵列表。
res=data.frame(var$coord) # res=data.frame(res$var$coord),效果一样。
res
type
res$type = type[match(rownames(type),rownames(res)),1] # 添加环境因子分类信息
res# 3.1.4 提取附加定性变量的坐标值
quali = data.frame(res.pca$quali.sup$coord)
quali

图5|样本坐标信息表,sam。

factoextra包中提取样本、变量和特征根PCA分析结果的函数,常用于prcomp()和princomp()分析结果提取。

# 3.1.5 prcomp()和princomp()主成分分析
prcmp = prcomp(env[4:14], scale =TRUE)
princmp= princomp(env[4:14], cor = TRUE, scores = TRUE) # cor = TRUE表示对数据进行标准化,scores=TRUE表示输出所有PC结果。
prcmp$sdev # 特征根=princmp$sdev
prcmp$rotation # 变量载荷矩阵(列就为PC的特征向量)=princmp$loadings,可用于预测附加样本坐标。
## 载荷值*特征根得出变量在每个主成分的坐标
prcmp$center# 变量均值=princmp$center
prcmp$scale # 变量的standard deviations=princmp$scale
prcmp$x # 样本观察值(坐标)=princmp$scoresget_pca_ind(prcmp) # 提取样本坐标和代表性等信息。
get_pca_var(prcmp) # 提取变量坐标和代表性等信息。
get_eigenvalue(prcmp) # 提取主成分特征值、解释度和累积解释度。

注:prcomp()和princomp()提取的结果与PCA()有些微差别,分析是对数据的处理有些微差异,prcomp()和princomp()标准误差计算用的是n(样本数)-1,而PCA()使用的n。推荐使用prcomp()和princomp()分析后,使用factoextra包函数提取坐标等信息。PCA()不会输出变量载荷矩阵。

3.2 绘图

这里将以不同颜色(tillage)的形状(


http://chatgpt.dhexx.cn/article/c4ttxHuQ.shtml

相关文章

使用 QTLtools 进行 PCA 分析

3 使用 QTLtools 进行 PCA 分析 QTLtools 工具可以进行基因型的PCA分析&#xff0c;也可以进行表型的PCA分析&#xff0c;以下教程分别针对基因型和表型的PCA进行介绍&#xff1a; 3.1 对基因型进行PCA分析&#xff1b; 命令如下所示&#xff1a; QTLtools pca --vcf genot…

R语言中如何进行PCA分析?利用ggplot和prcomp绘制基因表达量分析图

学习笔记的主要内容是在R语言中利用ggplot2进行PCA分析和绘图&#xff0c;包括简单分析与操作流程&#xff0c;对比不同方式得到的结果差异&#xff0c;提供脚本代码供练习. PCA分析的原理 在处理基因差异表达数据时&#xff0c;有时候需要分析其中因素的影响最大&#xff0c;…

r语言dataellipse_R语言 PCA分析

PCA数据分析 PCA结果分析及可视化首推factoextra包&#xff0c;能处理各种R函数计算PCA的结果&#xff0c;有&#xff1a; stats::prcomp() FactoMiner::PCA() ade4::dudi.pca() ExPosition::epPCA() 如果我们想判断PCA中需要多少个主成分比较好&#xff0c;那么可以从主成分的…

样本数据PCA分析

PCA分析及画图 library(ggpubr) library(ggplot2) library(ggthemes) data1<-read.table(./100klist.txt,header 1)[,1:4] head(data1)BCD_rep1 BCD_rep2 CK_rep1 CK_rep2 1 0.1987 0.2036 0.1807 0.2062 2 0.2133 0.2169 0.2040 0.2140 3 0.1943 0.1965 …

转录组-PCA分析

PCA分析步骤&#xff1a; 第一步&#xff0c;对所有样本进行中心化 第二步&#xff0c;求特征协方差矩阵 第三步&#xff0c;求协方差矩阵的特征值和特征向量 第四步&#xff0c;将特征值按照从大到小的顺序排序&#xff0c;选择其中最大的k个&#xff0c;然后将其对应的k个特征…

PCA分析及CNS级别作图

从这节开始&#xff0c;就逐渐涉及转录组的基本可视化了&#xff0c;我们的可视化要做到CNS级别的图&#xff0c;争取做好分析&#xff0c;一步到位&#xff0c;让您有真正的收获&#xff01; PCA&#xff08;主成分分析&#xff09;&#xff0c;具体的原理就不说了&#xff0…

R语言PCA分析

常用R包&#xff1a;princomp&#xff0c;prcomp及rda R中输入数据类型有两类&#xff0c;R mode和Q mode。一般来说数据每一列为一个变量&#xff08;variable&#xff09;&#xff0c;每一行为一个数据&#xff08;observation&#xff09;。其中R mode的数据行数大于列数&a…

CSS3 媒体查询

1. 什么是媒体查询 CSS3媒体查询&#xff08;Media Query&#xff09;语法的特性&#xff1a; ①使用 media 查询&#xff0c;可以针对不同的媒体类型定义不同的样式&#xff1b; ②media 可以针对不同的屏幕尺寸设置不同的样式&#xff1b; ③当你重置浏览器大小的过程中&am…

mysql以逗号分隔的字段作为查询条件怎么查——find_in_set()函数

文章目录 写在前面作为查询条件 多条件查询用于mybatis 聚合查询count总数查询distinct的列表find_in_set()函数走索引吗 写在前面 使用mysql时&#xff0c;有可能一个字段代表一个集合&#xff0c;如果将这个集合单独抽成一张表又不值当的&#xff0c;这个时候我们存储时&a…

PageHelper实现分页查询

文章目录 前言一、PageHelper实现分页查询二、PageHelper的基本使用1. 先编写持久层2.编写业务逻辑层3..编写控制层4.使用JsonPage返回结果 总结 前言 分页查询的优点 所谓分页,就是查询结果数据较多时,采用按页显示的方法,而不是一次性全部显示 分页的优点: 服务器:一次性…

降低数据库压力的方法

1.合理增加索引 表索引可以加快对表中数据的检索速度&#xff0c;但是会降低表中数据的更新速度&#xff0c;所以增加表的索引一定控制在合理范围内&#xff0c;过多的索引不但不会降低数据库的压力&#xff0c;反而可能增大数据库的压力&#xff0c;表索引的建立一般要从具体业…

MyBatis—利用MyBatis查询(查询所有,查询一行,条件查询)

文章目录 1、查询所有2、查询详情&#xff08;通过特定属性查询&#xff09;3、多条件查询&#xff08;1&#xff09;接口参数列表三种表达方式&#xff08;2&#xff09;多条件查询&#xff08;3&#xff09;动态Sql&#xff08;4&#xff09;多条件动态查询&#xff08;5&…

Redis实现分页和多条件模糊查询方案

导言 Redis是一个高效的内存数据库&#xff0c;它支持包括String、List、Set、SortedSet和Hash等数据类型的存储&#xff0c;在Redis中通常根据数据的key查询其value值&#xff0c;Redis没有模糊条件查询&#xff0c;在面对一些需要分页、排序以及条件查询的场景时(如评论&…

python操作es条件查询定制body

参考连接&#xff1a; python操作elasticsearch - 无量python - 博客园 1、切片查询 from elasticsearch import Elasticsearch# 建立连接 es Elasticsearch( hosts{192.168.0.120, 192.168.0.153}, # 地址timeout3600 # 超时时间 )# body指定查询条件 body {from: 0, #…

Oracle clob怎么存储超过4000长度的数据,你了解吗

目录 方式一、使用存储过程&#xff1a; 方式二、使用to_clob函数 方式三、mybatis中的方法 附&#xff1a; oracle将把varchar2字段&#xff08;长度4000&#xff09;改为clob类型 参考资料&#xff1a; 题记&#xff1a;我们知道Oracle存储的字段长度是有限制&#xff0…

oracle中clob和blob,Oracle中的BLOB和CLOB

非洲小白脸 阅读(364) 评论(0) 编辑 收藏 所属分类: oracle Oracle中的BLOB和CLOB 一、区别和定义 LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多一个LONG列 LONG RAW: 可变长二进制数据,最长2G CLOB: 字符大对象Clob 用来存储单…

mysql clob blob_Oracle中 CLOB, BLOB和NLOB

SQL 类型 CLOB 在 Java TM 编程语言中的映射关系。SQL CLOB 是内置类型&#xff0c;它将 Character Large Object 存储为数据库表的某一行中的一个列。默认情况下&#xff0c;驱动程序使用 SQL locator(CLOB) 实现 Clob 对象&#xff0c;这意味着 CLOB 对象包含一个指向 SQL CL…

java clob 操作_Java Clob 操作

java操作数据库clob字段的简单例子&#xff1a; package com.test.db.clob; import java.io.BufferedReader; import java.io.IOException; import java.io.Writer; import java.sql.Clob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepar…

ORACLE中CLOB介绍及使用

一、Oracle中的varchar2类型 我们在Oracle数据库存储的字符数据一般是用VARCHAR2。VARCHAR2既分PL/SQL Data Types中的变量类型&#xff0c;也分Oracle Database中的字段类型&#xff0c;不同场景的最大长度不同。 在Oracle Database中&#xff0c;VARCHAR2 字段类型&#xf…

clob类型(数据库clob类型)

如何获取clob类型的字节长度 blob和clob最大是多少&#xff1f;还是没有最大限制&#xff1f;它们的最大上限就是4G&#xff0c;Clob可以存储单字节字符数据&#xff0c;Blob可以存储无结构的二进制数据 Oracle中Clob类型如何处理&#xff1f; string id Guid。NewGuid()。ToS…