我有在人群中相互作用的不同变量。基本上,我一直在盘点千足虫,并测量其他一些地形值,例如:
- 标本的种类和数量
- 动物所在的不同环境
- pH值
- 有机物百分比
- 磷,钾,镁,钙,锰,铁,锌,铜的含量
- Ca + Mg / K关系
基本上,我想使用PCA来确定哪些变量驱动样本的可变性并使森林(环境)有所不同。我应该为“变量”使用哪些变量,为“个人”使用哪些变量?
我有在人群中相互作用的不同变量。基本上,我一直在盘点千足虫,并测量其他一些地形值,例如:
基本上,我想使用PCA来确定哪些变量驱动样本的可变性并使森林(环境)有所不同。我应该为“变量”使用哪些变量,为“个人”使用哪些变量?
Answers:
正如@amoeba在评论中提到的那样,PCA仅查看一组数据,它将向您显示这些变量的主要(线性)变化模式,这些变量之间的相关性或协方差以及样本之间的关系(各行) )。
通常使用物种数据集和一组潜在的解释变量来进行约束排序。在PCA中,主要成分,即PCA双线图上的轴,是所有变量的最佳线性组合。如果您在具有pH变量(总碳)的土壤化学数据集上运行此方法,则可能会发现第一个成分是
第二部分
这些分量可以从测量的变量中自由选择,选择的是那些依次解释数据集中最大变化量的分量,并且每个线性组合彼此正交(不相关)。
在受约束的排序中,我们有两个数据集,但我们不能随意选择所需的第一个数据集(上面的土壤化学数据)的任何线性组合。相反,我们必须在第二个数据集中选择变量的线性组合,以最好地解释第一个数据的变化。同样,在PCA的情况下,一个数据集是响应矩阵,并且没有预测变量(您可以将响应视为预测自身)。在受限情况下,我们有一个响应数据集,我们希望使用一组解释变量来进行解释。
尽管您没有解释哪个变量是响应,但是通常人们希望使用环境解释变量来解释那些物种的丰度或组成(即响应)的变化。
受限制的PCA版本在生态界被称为冗余分析(RDA)。假设该物种具有基本的线性响应模型,该模型要么不合适,要么仅当物种响应的梯度短时才适用。
PCA的替代方法是称为对应分析(CA)的事物。这是不受限制的,但它确实具有潜在的单峰响应模型,就物种如何沿较长的梯度响应而言,该模型更为现实。还要注意,CA建模相对丰度或组成,PCA建模原始丰度。
有一个受约束的CA版本,称为受约束或规范对应分析(CCA)-不要与称为规范相关分析的更正式的统计模型相混淆。
在RDA和CCA中,目的都是将物种丰度或组成的变化建模为解释变量的一系列线性组合。
从描述中听起来,您的妻子似乎想根据其他测量变量来解释千足虫物种组成(或丰度)的变化。
一些警告的话;RDA和CCA只是多元回归;CCA只是加权多元回归。您所学到的有关回归的任何知识都适用,并且还有其他一些陷阱:
所以我的建议与回归相同。提前考虑一下您的假设,并考虑反映这些假设的变量。不要只是将所有解释性变量混入其中。
我将展示一个示例,该示例使用适用于R 的素食主义者软件包比较PCA,CA和CCA,该软件包旨在帮助满足以下排序方法:
library("vegan") # load the package
data(varespec) # load example data
## PCA
pcfit <- rda(varespec)
## could add `scale = TRUE` if variables in different units
pcfit
> pcfit
Call: rda(X = varespec)
Inertia Rank
Total 1826
Unconstrained 1826 23
Inertia is variance
Eigenvalues for unconstrained axes:
PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8
983.0 464.3 132.3 73.9 48.4 37.0 25.7 19.7
(Showed only 8 of all 23 unconstrained eigenvalues)
素食主义者没有像Canoco一样标准化惯性,所以总方差是1826,特征值以相同的单位累加到1826
> cumsum(eigenvals(pcfit))
PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8
982.9788 1447.2829 1579.5334 1653.4670 1701.8853 1738.8947 1764.6209 1784.3265
PC9 PC10 PC11 PC12 PC13 PC14 PC15 PC16
1796.6007 1807.0361 1816.3869 1819.1853 1821.5128 1822.9045 1824.1103 1824.9250
PC17 PC18 PC19 PC20 PC21 PC22 PC23
1825.2563 1825.4429 1825.5495 1825.6131 1825.6383 1825.6548 1825.6594
我们还看到,第一个特征值大约是方差的一半,对于前两个轴,我们已经解释了约80%的总方差
> head(cumsum(eigenvals(pcfit)) / pcfit$tot.chi)
PC1 PC2 PC3 PC4 PC5 PC6
0.5384240 0.7927453 0.8651851 0.9056821 0.9322031 0.9524749
可以从前两个主成分的样本和物种的分数得出双图
> plot(pcfit)
这里有两个问题
由于单峰响应模型,CA可以更好地处理长梯度,并且可以模拟物种的相对组成而不是原始丰度,因此可以在这两个方面提供帮助。
的纯素/ R代码做,这是类似于上面使用的PCA代码
cafit <- cca(varespec)
cafit
> cafit <- cca(varespec)
> cafit
Call: cca(X = varespec)
Inertia Rank
Total 2.083
Unconstrained 2.083 23
Inertia is mean squared contingency coefficient
Eigenvalues for unconstrained axes:
CA1 CA2 CA3 CA4 CA5 CA6 CA7 CA8
0.5249 0.3568 0.2344 0.1955 0.1776 0.1216 0.1155 0.0889
(Showed only 8 of all 23 unconstrained eigenvalues)
在这里,我们解释了站点相对组成之间约40%的变化
> head(cumsum(eigenvals(cafit)) / cafit$tot.chi)
CA1 CA2 CA3 CA4 CA5 CA6
0.2519837 0.4232578 0.5357951 0.6296236 0.7148866 0.7732393
物种和地点得分的联合图现在较少地由少数物种主导
> plot(cafit)
选择哪个PCA或CA应该由您希望对数据提出的问题来决定。通常,根据物种数据,我们通常会对物种套件的差异感兴趣,因此CA是一种流行的选择。如果我们有一组环境变量的数据,例如水或土壤化学,我们就不会期望这些变量沿梯度以单峰方式响应,因此CA不合适,而PCA(在相关矩阵中,scale = TRUE
在rda()
调用中使用)将是适当的。更合适。
现在,如果我们要使用第二组数据来解释第一物种数据集中的模式,则必须使用约束排序。通常,这里的选择是CCA,但是RDA是替代方法,数据转换后的RDA也是如此,以使其能够更好地处理物种数据。
data(varechem) # load explanatory example data
我们重新使用该cca()
函数,但我们提供了两个数据框(X
用于物种以及Y
解释性/预测变量)或一个模型公式,其中列出了我们希望拟合的模型的形式。
要包含所有变量,我们可以将其varechem ~ ., data = varechem
用作包含所有变量的公式-但正如我上面所说,这通常不是一个好主意
ccafit <- cca(varespec ~ ., data = varechem)
> ccafit
Call: cca(formula = varespec ~ N + P + K + Ca + Mg + S + Al + Fe + Mn +
Zn + Mo + Baresoil + Humdepth + pH, data = varechem)
Inertia Proportion Rank
Total 2.0832 1.0000
Constrained 1.4415 0.6920 14
Unconstrained 0.6417 0.3080 9
Inertia is mean squared contingency coefficient
Eigenvalues for constrained axes:
CCA1 CCA2 CCA3 CCA4 CCA5 CCA6 CCA7 CCA8 CCA9 CCA10 CCA11
0.4389 0.2918 0.1628 0.1421 0.1180 0.0890 0.0703 0.0584 0.0311 0.0133 0.0084
CCA12 CCA13 CCA14
0.0065 0.0062 0.0047
Eigenvalues for unconstrained axes:
CA1 CA2 CA3 CA4 CA5 CA6 CA7 CA8 CA9
0.19776 0.14193 0.10117 0.07079 0.05330 0.03330 0.01887 0.01510 0.00949
使用以下plot()
方法生成上述排序的三重奏
> plot(ccafit)
当然,现在的任务是弄清楚哪些变量实际上很重要。还要注意,我们仅使用13个变量就解释了物种差异的2/3。在此排序中使用所有变量的问题之一是,我们在样本和物种得分中创建了一个拱形配置,这纯粹是使用太多相关变量的人工产物。
如果您想了解更多信息,请查阅素食文档或一本有关多元生态数据分析的好书。
最简单地说明与RDA的链接,但CCA相同,只是所有内容都涉及行和列双向表边际和作为权重。
从本质上讲,RDA等效于将PCA应用于拟合值矩阵,该矩阵来自拟合每个物种(响应)值(例如丰度)的多元线性回归,其解释变量由解释变量矩阵给出。
在R中,我们可以这样做
## centre the responses
spp <- scale(data.matrix(varespec), center = TRUE, scale = FALSE)
## ...and the predictors
env <- as.data.frame(scale(varechem, center = TRUE, scale = FALSE))
## fit a linear model to each column (species) in spp.
## Suppress intercept as we've centred everything
fit <- lm(spp ~ . - 1, data = env)
## Collect fitted values for each species and do a PCA of that
## matrix
pclmfit <- prcomp(fitted(fit))
这两种方法的特征值相等:
> (eig1 <- unclass(unname(eigenvals(pclmfit)[1:14])))
[1] 820.1042107 399.2847431 102.5616781 47.6316940 26.8382218 24.0480875
[7] 19.0643756 10.1669954 4.4287860 2.2720357 1.5353257 0.9255277
[13] 0.7155102 0.3118612
> (eig2 <- unclass(unname(eigenvals(rdafit, constrained = TRUE))))
[1] 820.1042107 399.2847431 102.5616781 47.6316940 26.8382218 24.0480875
[7] 19.0643756 10.1669954 4.4287860 2.2720357 1.5353257 0.9255277
[13] 0.7155102 0.3118612
> all.equal(eig1, eig2)
[1] TRUE
出于某种原因,我无法获得匹配的轴分数(负载),但总是会缩放(或不缩放)这些分数,因此我需要在这里准确地研究它们的工作方式。
我们没有rda()
像我用lm()
etc所示那样通过RDA进行处理,但是我们对线性模型部分使用QR分解,对PCA部分使用SVD。但是基本步骤是相同的。
fitted()