You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:06:37