使用组数据进行主成分分析

机器算法验证 主成分分析 群体差异 生态
2022-03-21 16:31:04

在我的实验中,我使用了一个物种的 30 种不同的种质。一组是挑战干旱,另一组是控制。我收集了 6 个不同参数的数据。我想知道哪个种质更宽容或更容易受到影响,哪个种质受哪个变量(参数)的影响更大,哪个变量最关键等。我可以使用主成分分析吗?我应该在 PCA 分析期间合并数据还是从对照组中减去治疗数据?或者我如何对两组数据进行 PCR?

1个回答

一般来说,我看不出为什么你不能做一个PCA来可视化和解释你的多变量数据集的问题(但是由于你没有提供数据,我不能肯定地说)。至于你的第二个问题,我会保留两组(drought, control)而不是将它们相减。这样,您将能够查看组件分数(在图中显示为点)是否会聚类以及组件负载(在图中显示为向量)与它们之间的关系。

这里有一个例子来说明我的意思(也是你的第三个问题):

生成示例数据集(根据您的描述):

set.seed(13)
d <- data.frame(
  treatment = rep(c("drought", "control"), each = 15),
  y1 = rnorm(30, 3, 1),
  y2 = rnorm(30, 6, 3),
  y3 = rnorm(30, 4, 2),
  y4 = rnorm(30, 9, 4),
  y5 = rnorm(30, 5, 2),
  y6 = rnorm(30, 12, 5)
)

使用不同的包可以通过许多不同的方式(也可能更好、更有效)来实现以下步骤R但这里通常对我有用:

使用FactoMineR 的PCA :

require(FactoMineR)
my.pca = PCA(d[, c(2:7)], scale.unit = T, graph = F)

# EXTRACTING VALUES FROM my.pca FOR PLOT BELOW
PC1.ind <- my.pca$ind$coord[,1]
PC2.ind <- my.pca$ind$coord[,2]
PC1.var <- my.pca$var$coord[,1]
PC2.var <- my.pca$var$coord[,2]
PC1.expl <- round(my.pca$eig[1,2],2)
PC2.expl <- round(my.pca$eig[2,2],2)
Treatment <- factor(d$treatment,levels=c('drought', 'control'))
labs.var<- rownames(my.pca$var$coord)

使用包构建绘图ggplot2

require(ggplot2)
require(grid)
ggplot() +
  geom_point(aes(x = PC1.ind, y = PC2.ind, fill = Treatment), colour='black', pch = 21,size = 2.2) + 
  scale_fill_manual(values = c("red", "blue")) +   
  coord_fixed(ratio = 1) +
  geom_segment(aes(x = 0, y = 0, xend = PC1.var*2.8, yend = PC2.var*2.8), arrow = arrow(length = unit(1/2, 'picas')), color = "grey30") + 
  geom_text(aes(x = PC1.var*3.2, y = PC2.var*3.2),label = labs.var, size = 3) + 
  xlab(paste('PC1 (',PC1.expl,'%',')', sep ='')) + 
  ylab(paste('PC2 (',PC2.expl,'%',')', sep ='')) +
  ggtitle("Some title")

在此处输入图像描述

向量表示成分载荷,即主成分与原始变量的相关性。相关性的强度由向量长度表示,方向表示哪些种质对原始变量具有高值。

另外,我建议您在这里查看有关如何解释一般 PCA 的更多信息(如果需要的话)。

drought此外,由于您有预先确定的组,control您可能还会查看线性判别分析(LDA)。PCA 和 LDA 都是基于旋转的技术。虽然 PCA 试图最大化数据集中解释的总方差,但 LDA 最大化组之间的分离(或区分)。有关更多信息,您可以查看包中的candisc函数candisc,或者例如包中的lda()函数MASS(都在 中R)。