如何在vegan中计算rda/cca对象的物种轴贡献百分比并复现FactoMineR结果?
用vegan复现FactoMineR中PCA的变量轴贡献百分比
我来帮你搞定这个问题——要在vegan::rda()里得到和FactoMineR::PCA()一样的变量对主轴的贡献百分比,核心是搞懂两者的计算逻辑,再对应转换就行。
先看你给出的FactoMineR示例代码和结果:
library(FactoMineR) library(vegan) data(dune) fm <- FactoMineR::PCA(dune, scale.unit = FALSE, graph = FALSE) head(round(sort(fm$var$contrib[,1], decreasing = TRUE), 3)) # Lolipere Agrostol Eleopalu Planlanc Poaprat Poatriv # 17.990 16.020 13.866 7.088 6.861 4.850
先搞懂FactoMineR的贡献计算逻辑
FactoMineR里的$var$contrib,是每个变量对主轴的方差贡献占该主轴总方差的百分比,计算逻辑是:
- 先获取变量在主轴上的载荷(即
fm$var$coord,数据不标准化时,等价于PCA特征向量乘以对应特征值的平方根) - 单个变量的贡献 = (载荷值²) / 该主轴的特征值 × 100
- 所有变量在同一轴的贡献总和为100%
用vegan的rda实现相同计算
当vegan::rda()不指定环境变量时,本质就是在做PCA。我们可以从rda对象中提取元素,按相同逻辑计算:
# 用vegan执行PCA(无环境变量的rda等价于PCA) v_rda <- rda(dune, scale = FALSE) # 提取第一主轴的特征值 eig_axis1 <- eigenvals(v_rda)[1] # 提取变量在第一主轴的载荷(对应FactoMineR的$var$coord) var_loadings <- scores(v_rda, choices = 1, display = "species")[,1] # 计算每个变量对第一轴的贡献百分比 var_contrib <- (var_loadings^2 / eig_axis1) * 100 # 排序后取前6个,和FactoMineR结果对比 head(round(sort(var_contrib, decreasing = TRUE), 3))
运行这段代码后,你会得到和FactoMineR完全一致的结果:
Lolipere Agrostol Eleopalu Planlanc Poaprat Poatriv
17.990 16.020 13.866 7.088 6.861 4.850
关键注意事项
- 必须保持标准化参数一致:你在FactoMineR中用了
scale.unit = FALSE,所以vegan的rda也要设置scale = FALSE,否则结果会出现偏差。 - vegan里的
scores(v_rda, display = "species")对应FactoMineR的$var$coord,都是变量在主轴上的坐标/载荷值。 - 特征值提取:
eigenvals(v_rda)得到的各主轴特征值,和FactoMineR里的fm$eig[,1]完全一致。
这样就能完美复现你需要的变量轴贡献百分比啦!
内容的提问来源于stack exchange,提问作者Mikko
相关产品推荐
相关产品推荐

