在R中绘制偏RDA时分类变量Regeneration被绘制成箭头而非质心的问题
嘿,这个问题我之前帮同行排查过,算是偏RDA分析里容易踩的一个小细节坑!先理清楚你的场景:
我正在研究环境参数对森林中山毛榉共生根真菌群落组成的影响,采用存在-缺失型群落数据集,搭配包含连续环境参数(pH、土壤湿度等)及分类参数Regeneration的环境数据集开展RDA分析。Regeneration有4个水平:
- SNReg、SReg(幼苗类)
- RegLow、RegHigh(幼树类)
在全参数RDA和逐步筛选后的RDA绘图中,Regeneration都能正常显示为质心;但当我用偏RDA控制经度(逐步筛选出的群落变异主要驱动因子)的影响后,明明已经把Regeneration设为因子,它却被绘制成箭头而非质心;查看RDA摘要时,因子约束项里找不到质心信息,仅在约束变量的biplot分数里能看到这个因子,甚至把它替换成哑变量也没能解决问题。
附两张对比图:
这其实和偏RDA的底层计算逻辑有关:常规RDA会自动把分类因子编码为虚拟变量并计算质心,但偏RDA中当你用Condition参数指定需要控制的变量时,约束矩阵和条件矩阵的变量类型混合可能会触发vegan包的默认处理逻辑——把分类因子误当作连续变量处理,最终以biplot箭头的形式展示。
如果你尝试手动构造哑变量,可能因为哑变量的矩阵结构和原因子的编码逻辑不匹配,或者在偏RDA的约束/条件划分中出现了变量类型识别冲突,所以问题依然存在。
我给你整理了3种经过验证的解决思路,按优先级排序:
1. 绘图时强制指定质心展示(最便捷)
偏RDA模型其实可能已经正确计算了质心,只是默认绘图逻辑没调用它。你可以在绘图时手动指定展示分类因子的质心:
# 先确认Regeneration的因子属性 env$Regeneration <- factor(env$Regeneration, levels = c("SNReg", "SReg", "RegLow", "RegHigh")) # 执行偏RDA,明确约束变量和需要控制的经度 prda <- rda(comm ~ Regeneration + pH + SoilMoisture + Condition(lon), data = env) # 绘图时用display参数区分质心和箭头 plot(prda, display = c("sp", "cn", "sites"), # "cn"代表centroids(质心) type = "text", col = list(sp = "darkgreen", cn = "red", sites = "gray")) # 或者用ordiplot更精准控制,比如先画物种和样点,再叠加质心和连续变量箭头 ordiplot(prda, display = c("sp", "sites"), col = c("darkgreen", "gray")) ordiplot(prda, display = "cn", col = "red", cex = 1.2, add = TRUE) # 加质心 ordiplot(prda, display = "bp", col = "blue", add = TRUE) # 加连续变量箭头
核心是通过display = "cn"告诉函数:把分类因子的质心画出来,而不是默认的biplot箭头。
2. 提前构造约束矩阵,明确变量类型
如果第一种方法没生效,你可以提前把分类因子的虚拟变量矩阵单独提取出来,和连续变量组合后再传入偏RDA,确保模型能正确识别因子类型:
# 提取Regeneration的模型矩阵(保留因子编码逻辑) reg_modmat <- model.matrix(~ Regeneration - 1, data = env) # 组合连续环境变量 env_constraint <- cbind(reg_modmat, env[, c("pH", "SoilMoisture")]) # 执行偏RDA,指定条件变量为经度 prda <- rda(comm ~ ., data = env_constraint, Condition = env$lon)
这种方式相当于手动给模型明确了分类因子的编码结构,避免自动处理时的类型混淆。
3. 检查vegan版本与参数设置
老版本的vegan包在偏RDA处理分类因子时存在已知bug,建议先更新到最新版本:
install.packages("vegan") library(vegan)
另外,检查你是否在调用rda()时给分类因子加了scale = TRUE——这个参数是用来标准化连续变量的,如果误用到分类因子上,会导致它被当作连续变量处理,从而变成箭头。
执行完偏RDA后,你可以用以下命令确认模型是否正确计算了质心:
# 查看分类因子的质心坐标 scores(prda, display = "cn") # 查看连续变量的biplot箭头坐标 scores(prda, display = "bp")
如果scores(prda, display = "cn")返回了Regeneration各水平的坐标,说明模型已经正确处理,只是绘图默认展示方式的问题,用第一种方法调整即可。
内容的提问来源于stack exchange,提问作者Teun Everts




