含分类变量的PCoA物种得分提取方法咨询
解决方案:PCoA混合变量的得分计算
你的思路完全正确:连续变量通过与PCoA位点得分的皮尔逊相关性计算得分,分类变量通过计算每个类别在PCoA轴上的**质心(均值)**来反映其与轴的关联,这是处理混合类型变量PCoA得分的标准方案。
修正原代码的笔误
首先修正你代码里的变量名拼写混用问题:
library(gawdis) library(vegan) library(tidyverse) # 用于更简洁的数据整理 # 加载并预处理数据 data <- na.omit(tussock$trait[,c(1:7, 10, 12, 14:15)]) # 构建加权Gower距离矩阵 dm <- gawdis(data, groups.weight=T, groups = c(1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8)) # 执行PCoA pcoa1 <- wcmdscale(dm, eig=TRUE, add = TRUE) # 计算轴解释度 ev <- eigenvals(pcoa1) per <- ev/sum(ev) # 提取位点得分 points1 <- as.data.frame(scores(pcoa1, display = "site", scaling=3))
分离连续与分类变量
先识别并拆分不同类型的变量:
# 分离连续变量(numeric)和分类变量(factor) cont_vars <- data %>% select(where(is.numeric)) cat_vars <- data %>% select(where(is.factor))
计算连续变量得分
直接用相关性反映连续变量与PCoA轴的关联:
cont_scores <- as.data.frame(cor(cont_vars, points1)) %>% rownames_to_column("Variable") %>% mutate(Type = "Continuous")
计算分类变量质心得分
对每个分类变量,计算其类别在PCoA轴上的均值(质心):
# 合并位点得分与分类变量,方便计算质心 cat_points <- bind_cols(points1, cat_vars) # 批量计算每个分类变量的类别质心 cat_scores <- map_dfr(names(cat_vars), function(var) { cat_points %>% group_by(!!sym(var)) %>% summarise(across(starts_with("PC"), mean, na.rm=TRUE)) %>% rename(Variable = !!sym(var)) %>% mutate(Type = "Categorical") })
合并两类变量得分
整理成统一格式的最终结果:
all_vars_scores <- bind_rows(cont_scores, cat_scores) %>% select(Variable, Type, everything())
结果说明
- 连续变量得分:相关性绝对值越大,说明该变量对对应PCoA轴的解释力越强,正负号反映变量与轴的方向一致性。
- 分类变量质心:每个类别在PCoA轴上的代表性位置,可直接用于PCoA图的类别标注,直观展示分类变量与轴的关联。
内容的提问来源于stack exchange,提问作者DoctorSpruce
相关产品推荐
相关产品推荐

