简介:CANOCO 5.0 是一套面向生态学、植物群落与环境关系研究的排序分析软件资源,适合需要运用主成分分析等方法揭示样方与植物种沿生态梯度连续分布的学习者和科研人员。压缩包共 34 个文件,约 13.38MB,主体为 9 个 c5p 项目文件,并含可执行程序、动态链接库、txt/log 说明及运行记录、sol/con/dta 等数据表,以及 pdf/chm 教程和 xls/xlsx 示例数据,兼顾软件安装、案例练习、结果查阅与图表输出。已有 1150 人学习下载,说明其在群落排序与 PCA 入门场景中具有较好的参考价值与使用热度。读者可借助 DuneData、birds 等示例数据熟悉排序流程,结合教程与帮助文档理解生态梯度解释、项目组织、数据准备、图表判读与常见报错排查,从而更直观地把握植被连续性分析的基本思路,为群落生态学中的排序实践提供入门参照。
1. 从一张三十行样点的群落表说起
拿到的群落调查数据通常长这样:30 个样点、120 个物种、8 个环境因子,Excel 里三张 sheet,行列还得自己对齐。很多人第一反应是打开 R 敲两行,结果一晚上卡在数据对齐和出图上,连第一条排序轴都没看清。CANOCO 5.0 就是为这种场面准备的桌面工具:PCA 分析、CA/DCA、RDA/CCA、前向选择、蒙特卡洛置换检验、变差分解和成图全在一个图形界面里,不需要先写脚本,也不需要先学会 R 生态包。它替代不了统计判断,但能把从原始表格到一张能进图版的双序图压缩到半小时。适合做植被-环境关系、微生物群落排序的从业者,也适合刚接手排序分析、需要先把结果跑出来再谈原理的新手。
2. 数据进得去才算开始:矩阵整理、项目建立与格式约定
排序分析翻车的案例里,一大半不是统计方法选错,而是表格进软件那一刻就已经错了:行序不一致、样点名重复、物种列里混进了合计行、缺失值写成“—”。这些问题在 CANOCO 5.0 里不会立刻报错,它会照常跑完并给你一张看起来正常的图,等你写到讨论部分才发现物种箭头指向离谱。所以这一章不急着点分析菜单,先把数据契约钉死。
2.1 物种矩阵与环境因子表的行列约定
CANOCO 5.0 吃的是两张表,一张响应变量表(物种矩阵),一张解释变量表(环境因子),两者的行必须一一对应。行是样点,列是变量,这是铁律:物种矩阵的第一行通常是表头,A 列放样点名称,B 列往后每个物种一列;环境表同理,A 列样点名,后面每个环境因子一列。软件不会按名字帮你匹配行,它默认两张表按行号对齐,第 5 行是哪个样点,它就用第 5 行去配。所以整理数据时最稳妥的做法是先把样点名做成唯一键,再在两边用同一套键排序,不要指望“我记得当时顺序是对的”。
| 要素 | 物种矩阵 | 环境因子表 |
|---|---|---|
| 行 | 样点,顺序必须一致 | 样点,顺序必须一致 |
| 首列 | 样点名(唯一、无空格) | 样点名(同一套字符串) |
| 数据列 | 物种名或物种编号 | 环境变量名(pH、含水量、氮含量等) |
| 数据类型 | 多度、盖度、丰度、生物量,非负整数或小数 | 连续或分类变量,分类变量需转成哑变量 |
| 缺失值 | 不允许空格或横线,缺失按 0 或剔除样点 | 不允许留空,缺失需插补或整列删除 |
样点名建议用英文加下划线或数字编号,不要用中文、空格、括号和特殊符号。软件本身能显示中文,但导出的图和后续与外部工具对接时会频繁出问题,我一般直接把“样地一号”写成 P01,把“三月采样”写成 M03,成本很低,省下的麻烦很多。物种列也建议保留一个 6 到 8 字符的缩写列,长拉丁名进了图里会互相压字,缩写在软件里可以单独指定“显示标签”,原始全名留在表格里备查。
还有两个细节容易忽略。一是合计行和合计列必须删掉,很多人习惯在 Excel 底部加一行“总计”,导入后它会被当成一个样点参与排序,直接污染第一轴。二是物种矩阵里全零的样点行必须剔除,一条没有任何物种记录的样点在排序里没有位置,软件会给出警告或把它甩到图的角落,看着像离群点,其实是空行。环境表里全常数的列也要删,方差为 0 的变量无法参与相关计算,留着只会让前向选择报错。
2.2 新建项目与数据导入的操作路径
CANOCO 5.0 的项目以工程文件形式保存,一个工程里可以容纳多组数据和多份分析结果,方便回头改参数重跑。我习惯的流程是:先建工程,再导物种表,再导环境表,最后核对样点名,四步做完才动分析菜单。数据导入入口在文件菜单下的导入项里,分响应数据(物种)和解释数据(环境)两条独立通道,都是一次导一张表。
操作步骤按这个顺序走:
- 新建工程,工程名带上日期和数据集标识,例如
plot_2024_spring.can,避免几周后分不清哪份是最终版。 - 导入物种矩阵,在向导里指定首列为样点名称,从第二列开始为物种数据,确认行列数后完成。
- 导入环境因子表,同样指定样点名称列,软件会把两张表的行做对应,此时务必看一遍样点预览列表。
- 在数据视图中检查样点数量是否与原始表一致,物种数、环境变量数是否对得上。
- 打开环境变量的属性面板,把分类变量标记为分类类型,避免它被当成连续数值参与回归。
- 保存工程,再另存一个副本用于试参数,原始工程不要动。
这套流程里第 3 步和第 4 步是保命环节。软件在导入环境表时会尝试按行匹配,如果你的物种表按采样时间排、环境表按样地编号排,两边行数一样,导入是成功的,但每一行都是错配的。表现是排序图上环境箭头指向与常识完全相反,比如“有机质含量”箭头指向贫瘠样点。碰到这种情况不要怀疑方法,先回去查行序。
数据量大的时候,手工在 Excel 里排序容易出错,我一般用一段脚本先把两张表按同一样点键对齐再导出,导出的文件直接喂给软件。
# 按样点键对齐物种表与环境表,输出 CANOCO 可直接导入的制表符分隔文件 setwd("D:/work/ordination") # 工作目录,换成你自己的路径 sp <- read.delim("species_raw.txt", row.names = 1, check.names = FALSE) env <- read.delim("env_raw.txt", row.names = 1, check.names = FALSE) # 关键一步:取交集并按同一顺序重排,避免凭行号硬对齐 common <- intersect(rownames(sp), rownames(env)) sp2 <- sp[common, , drop = FALSE] env2 <- env[common, , drop = FALSE] # 剔除全零样点行和零方差物种列,这两类都会让排序结果失真 sp2 <- sp2[rowSums(sp2) > 0, , drop = FALSE] sp2 <- sp2[, apply(sp2, 2, function(x) sd(x) > 0), drop = FALSE] env2 <- env2[rownames(sp2), , drop = FALSE] env2 <- env2[, apply(env2, 2, function(x) sd(x, na.rm = TRUE) > 0), drop = FALSE] write.table(sp2, "species_ready.txt", sep = "\t", quote = FALSE, col.names = NA) write.table(env2, "env_ready.txt", sep = "\t", quote = FALSE, col.names = NA) cat("样点数:", nrow(sp2), " 物种数:", ncol(sp2), " 环境变量数:", ncol(env2), "\n")这段脚本的四个动作对应四个失败点。intersect取交集并按共同顺序重排,解决行序错配,同时自动丢弃只在一边出现的样点,比手工核对可靠;rowSums(sp2) > 0删掉全零样点,避免空行被当成离群样本;apply(sp2, 2, sd) > 0删掉零方差物种列,比如只在某一个样点出现的稀有种,它在排序里几乎不贡献信息却会拉长物种箭头;sd(x, na.rm = TRUE) > 0对环境变量做同样处理,顺带把整列缺失的变量剔掉。参数上,row.names = 1表示首列作为行名读入,check.names = FALSE防止 R 自动把中文或特殊字符列名改写,quote = FALSE保证输出文件里不带引号——CANOCO 对带引号的首列识别会出问题,这一条是我踩过坑之后固定加上的。输出用制表符分隔的.txt,比.xlsx稳定,中间不经过格式转换层。
2.3 三道数据体检:零和行、共线性、量纲
数据对齐之后不要立刻跑 PCA,先做三道体检,每道对应一类会在结果里“装得像正常”的错误。
第一道是零和行与稀有物种。全零样点在上一节已经处理,剩下的问题是物种列的稀疏程度:120 个物种里有 60 个只在 1 到 2 个样点出现,这类数据直接做 PCA,前两轴会被少数几个高丰度广布种主导,稀有物种的箭头要么挤在原点,要么指向离谱。常见做法是先做一次稀疏性统计,把出现频次低于总样点数 5% 的物种合并成“其他”或者直接剔除,并在方法里写明筛选阈值。这一步没有统一标准,但必须写下你用了什么阈值,审稿和复核时这是必问项。
第二道是环境因子的共线性。两个环境变量相关系数绝对值超过 0.8,在约束排序里会互相抢解释量,前向选择可能只留下其中一个,另一个的独立贡献被低估,写结论时容易误判“这个因子不重要”。体检办法是跑一张相关矩阵,把高度相关的变量对列出来,按生态学意义保留一个、剔除一个,或者把两个合成一个综合指标。软件里也提供方差膨胀因子(VIF)作为共线性诊断,经验阈值是大于 10 提示中度共线、大于 20 视为严重,超过就该处理了。我一般把相关矩阵和 VIF 两张表都存下来,附在分析记录里。
第三道是量纲。pH 在 4 到 8 之间,海拔在 500 到 3000 之间,有机质在 1 到 80 之间,直接放进基于欧氏距离的线性方法(PCA、RDA),高数值变量会天然占据更大方差。线性方法对环境变量的量纲敏感,通常要做标准化;基于卡方距离的单峰方法(CA、CCA)对量纲不敏感,这也是选方法时的一条隐含约束。软件在分析设置里有中心化和标准化的选项,具体到不同分析类型选法不同,下一章展开。
提示:三道体检的结果建议单独存成一个文本文件,和数据、工程文件放在同一个目录。半年后回头改图,能省掉重新推导的整段时间。
3. PCA 分析怎么跑:先判型、再选标准化、最后才看图
PCA 在 CANOCO 5.0 里操作很简单,但“能不能用 PCA”这个前置判断经常被跳过。PCA 是线性方法,它假设物种沿环境梯度的响应是单调的,也就是某个物种随着某个环境因子升高而稳定增加或减少。真实群落里更常见的是单峰响应:物种在梯度中段最丰富,两头都少。数据如果是单峰结构却硬上 PCA,第一轴会把两端的样点压到一起,形成一个马蹄形,解释率虚高但生态学含义错位。所以跑 PCA 之前先跑一次 DCA(去趋势对应分析),用它的轴长来定方向,这一步在软件里只要点几下,但能决定后面所有结果是否成立。
3.1 先跑 DCA 定方向:轴长 3 和 4 是两条分界线
DCA 的作用是估计群落数据的梯度长度,也就是样点在物种组成上的更替幅度。判断规则在生态学界比较统一:第一轴长度小于 3,说明梯度短、物种响应接近线性,用 PCA 或 RDA;大于 4,说明梯度长、响应明显单峰,用 CA 或 CCA;落在 3 到 4 之间属于过渡区,两种都能用,但要各自跑一遍对比解释效果,选生态学解释更通顺的那个。
在软件里的操作是新建一个非约束分析,选 DCA,用默认设置跑完,结果页会直接给出各轴的长度值。这里有个细节:DCA 的轴长受稀有物种影响很大,如果物种表里保留了大量只在单样点出现的稀有种,轴长容易被拉长,导致你误判为“应该用单峰方法”。我一般的做法是先按 2.3 的阈值做一遍稀有种处理,再跑 DCA,然后用处理后的数据继续后续分析,保证判型和建模用的是同一份数据。
还有一条血泪经验:DCA 本身只用来判型,不要用它出图、不要在论文里报它的解释率。它的去趋势算法会扭曲样点间的距离关系,图上看着漂亮的弧形排列往往是算法产物,不是真实的生态格局。软件的分析结果里,DCA 的特征值和解释率也不该和 PCA、CA 的解释率并列比较,两者尺度不同。
判型结论确定之后,再回到非约束分析菜单选择 PCA。注意不要在同一次分析里既跑 DCA 又跑 PCA 然后混着看结果,每次分析独立建一个分析项,命名清楚,比如PCA_log_transformed、DCA_raw,后面翻记录时一目了然。
3.2 PCA 的三种中心化与标准化选法
PCA 的核心是把样点投影到少数几个综合轴上,轴的方向由方差最大方向决定。但“方差”怎么算,取决于你对数据做了什么处理,软件里对应三个选项,选错会让结果彻底变形。
第一种是只做中心化,等价于基于协方差矩阵做 PCA。它保留变量的绝对量纲,丰度高的物种权重大。适用场景是物种多度本身有可比意义、且已经做过某种统一转换(比如都换算成盖度百分比),你想让高丰度物种主导排序。绝大多数群落数据不适合直接这么干,因为个别优势种会吃掉第一轴。
第二种是按物种标准化,等价于基于相关矩阵做 PCA。它对每个物种做中心化和除以标准差,所有物种权重拉平。这是物种数量多、丰度跨几个数量级时最常用的选法,代价是低丰度物种的权重被抬高,噪声也被放大。配合前面对稀有种的筛选使用,效果比较稳。
第三种是按样点标准化,这种会削弱样点之间的真实差异,一般只在样品上机量差异极大、需要先消除技术性偏差时用,群落排序里极少用。选错这个选项的典型表现是所有样点在图上挤成一团,解释率低,看不出任何格局。
转换和标准化是两件事,不要混。转换(对数、平方根、Hellinger、卡方距离等)是在算距离之前改造原始值,主要目的是压缩优势种的量级、稳定方差;中心化/标准化是在转换之后调整变量权重。常见的组合是:先做log(x+1)或 Hellinger 转换,再按物种标准化,然后跑 PCA。软件在数据预处理对话框里提供这些转换选项,转换要写在方法部分,因为它会实质性改变结果。
注意:
log(x+1)里的 +1 不能省。群落数据里有大量 0,直接取对数会得到负无穷,软件会报错或者悄悄把 0 替换掉,后者更危险,你根本不知道它替换成了什么。
3.3 结果页怎么读:特征值、累计解释率与被动投影的环境箭头
PCA 跑完后,结果页有几个数字必须读懂,其余可以暂时忽略。
特征值(eigenvalue)是每个轴承载的方差量,轴 1 的特征值除以总方差就是该轴的解释比例。软件会给出前四轴的单独解释率和累计解释率。群落数据的累计解释率通常不高,前两轴加起来 30% 到 50% 是常态,低于 20% 就要回头检查数据转换和稀有种处理是不是出了问题,而不是急着换方法。前两轴解释率过低时,图的可靠性有限,讨论里也不该过度解读轴的含义。
轴的含义靠两样东西支撑:物种得分和环境因子相关。物种得分告诉你哪些物种在该轴上贡献大,环境因子的被动投影告诉你该轴与哪些环境变量相关。被动投影的意思是环境因子不参与排序计算,只是在排序空间里按相关关系画成箭头,箭头方向和长度表示该变量与各轴的相关方向和强度。这个功能很实用,因为它让你在纯物种数据的 PCA 上看到环境线索,而不必一开始就做约束排序。
读箭头有两条经验。一是只看跑得够长的箭头,短箭头意味着该变量与前两轴几乎没有线性关系,解读它等于过度拟合;软件里可以设置箭头显示阈值,把拟合度低的变量隐藏。二是不要在 PCA 图上直接宣称因果关系,PCA 的轴是方差轴不是环境轴,环境箭头只是相关,方向相反的两个箭头不能推出“此消彼长”的生态过程。
分类环境变量(比如土地利用类型、处理组)不能直接作为连续变量投影,正确做法是转成哑变量(0/1)再放进去,或者在作图时用不同颜色标记样点分组,让它以分组而不是箭头的方式呈现。软件支持按分类变量给样点上色,这个功能在双序图上非常好用,能让读者一眼看出组间分离。
3.4 出图与导出:scaling 1 还是 scaling 2
排序图有一个容易被忽略的参数:缩放方式(scaling)。它决定图上样点之间的距离和物种之间的距离哪个是“保真”的,两者不可兼得。scaling 1 侧重样点间距离,适合解读“哪些样点相似、分组是否分开”;scaling 2 侧重物种间距离,适合解读“哪些物种共现、物种组合关系”。软件在绘图设置里可以切换,图上样点与物种箭头的相对长度会明显变化。
选择原则很简单:你的科学问题如果是样点分组和群落差异,用 scaling 1;如果是物种关联和指示种识别,用 scaling 2。一篇文章里如果两类问题都有,就出两张图,不要指望一张图兼顾,那只会两头都不清楚。
导出的分辨率问题后面避坑章会专门讲,这里只提一条:优先导出矢量格式(EMF、WMF、PDF 之类),不要用屏幕截图。矢量图在排版软件里可以继续改字号和线宽,位图截图放大后箭头边缘全是锯齿,图版质量直接掉一档。物种箭头太多时,在导出前先设置显示阈值,只保留拟合度靠前的若干个,并在图注里写明“仅显示拟合度前 N 的物种”。
4. 约束排序 RDA/CCA:把环境因子放进模型而不是贴在图上
PCA 回答的是“样点之间怎么不一样”,约束排序回答的是“这些不一样能被哪些环境因子解释、各解释多少”。两者的关系不是替代而是递进:先用非约束排序看整体格局,再用约束排序量化环境变量的贡献。很多人跳过第一步直接做 RDA,结果解释率算出来了却不知道整体格局长什么样,讨论部分写得很虚。
4.1 响应变量与解释变量的边界
约束排序里,物种矩阵是响应变量,环境因子是解释变量,模型在做的是用环境因子去拟合物种矩阵的加权线性(RDA)或加权平均(CCA)组合。RDA 对应线性响应,CCA 对应单峰响应,选哪个还是看 3.1 的 DCA 轴长。轴长小于 3 用 RDA,大于 4 用 CCA,落在中间两个都跑,比解释率和生态学合理性。
在软件里建立约束分析时,要显式指定哪张表是响应数据、哪张是解释数据,还要选择是否包含截距、是否对样点加权。样点加权这一项在样点物种数差异极大时有用,它避免物种特别丰富的样点过度影响模型,但也会改变解释率的绝对值,所以用了就要在方法里写清楚。默认不加权,除非有明确理由。
另一个边界问题是解释变量的个数上限。经验规则是解释变量个数不超过样点数的三分之一,样点 30 个、环境因子 8 个属于比较健康的比例;样点 20 个、环境因子 15 个这种配置,模型必然过拟合,前向选择会选出一堆显著变量,但每个的独立贡献都不可信。碰到这种情况,正确做法是先按生态学假设筛一轮,只保留有明确机制的变量,再做统计筛选,而不是让算法从 15 个里挑。样本量不足时,调整后的解释率(adjusted R²)比原始解释率更值得报告,前者对变量个数做了惩罚。
4.2 前向选择与蒙特卡洛置换检验的参数怎么设
约束排序跑完,你会得到“全部环境因子”的解释量,但这个总和没有太多信息量,真正要看的是每个因子的独立贡献和显著性。前向选择就是干这个的:一步步把解释力最强的变量纳入模型,每纳入一个就做一次置换检验,直到剩下的变量都不显著为止。
软件提供手动选择和自动选择两种模式。手动模式每一步都会停下来让你看当前变量的 F 值和 p 值,决定是否纳入下一个,适合变量不多、你对生态学机制有预期的情况;自动模式一次跑完,适合探索性分析。我一般先用手动模式走一遍,看清每一步的边际贡献,再用自动模式验证结论是否一致,两者不一致往往说明变量间共线性在作祟。
置换检验的参数有两个要设对。一是置换次数,常用 499 次做探索、999 次做最终结果,次数越多 p 值越稳定,但计算时间线性增长。二是置换方式,这是最容易设错的地方:完全随机置换(unrestricted)假设所有样点可以自由交换;分层置换(restricted)用于样点有明显分组结构的情况,比如分季节采样、分处理组采样,置换只在组内进行。如果你的采样设计是分块的,却用了完全随机置换,p 值会系统性偏小,也就是说你会把不显著的变量判成显著。这个错误不会报错,图也照常出,只有回头核对采样设计才能发现。
前向选择还有一个配套操作:显著性校正。一次检验几十个变量,按 0.05 的阈值必然出现假阳性,常见做法是加 Bonferroni 校正或者用错误发现率控制。软件里可以设置校正方式,校正之后显著性门槛提高,通过的变量变少,但结论更硬。我在变量数超过 8 个时一定开校正,代价是可能漏掉一些边缘显著的因子,但换来的是讨论部分不用给每个入选变量找理由。
4.3 VIF 与偏分析:把共线性和干扰因素摘出去
进模型之前,先看每个环境变量的 VIF。软件的变量列表里可以显示这一列,阈值前面说过,大于 10 要警惕、大于 20 必须处理。处理方式有三种:一是按生态学意义二选一剔除,比如“全氮”和“有机质”高度相关,留哪个取决于你的假设更关心哪个;二是把两个变量做主成分分析合成一个综合指标,代价是解释变难;三是保留两个但只用其中一个做前向选择,另一个作为协变量放进偏分析。
偏分析(partial ordination)是 CANOCO 5.0 里价值很高但用得不够多的功能。它的作用是先把某组变量的影响“扣掉”,再看剩下的变量还能解释多少。典型用法有两种:一是把空间位置(经纬度、空间坐标的多项式)作为协变量扣掉,看环境因子在扣除空间结构后的纯解释量,这在判断“环境驱动还是空间扩散驱动”时几乎是必做项;二是把某个已知强干扰因子扣掉,比如不同采样批次、不同土层深度,避免它污染主结论。
软件里的操作是在建立约束分析时指定协变量表,分析类型会自动变成偏 RDA 或偏 CCA。结果页会给出条件解释量(协变量解释的部分)和约束解释量(目标变量解释的部分),两个数字分开报告。注意偏分析的解释率不能和普通约束排序的解释率直接比大小,分母不同,直接比较会得出错误结论。
提示:协变量不要放太多。协变量每多一个就多消耗一个自由度,样点本来就不多的时候,扣得太狠会把真实信号也一起扣掉。
5. 避坑与排查:五处最容易翻车的地方
这一章记录的是我在实际项目里反复遇到、并且每次都要花时间定位的问题。共同特征是:软件不报错,结果能出图,但结论是错的。
5.1 样点行序错配:图能出,箭头全反
现象:排序图正常生成,解释率也在合理区间,但环境箭头的方向和野外常识完全相反,比如“土壤含水量”箭头指向明显干燥的样点。
原因:物种表和环境表分别来自不同人的整理,一个按采样日期排、一个按样地编号排,行数恰好相同,导入时软件按行号硬对齐,每一行都错位了。
解决:导入后立刻核对样点预览列表,把两边样点名打印出来逐行比对;数据量大时用本章 2.2 的脚本先按样点键对齐再导入。已经跑完的分析不要试图事后修正,行序错了所有得分都不可信,必须从数据层重来。
5.2 第一轴被单一优势种吃掉:解释率很高,信息量很低
现象:PCA 前两轴累计解释率看着不错,但物种图上只有一个物种的箭头极长,其余全挤在原点附近,样点沿第一轴排成一条与任何环境因子都不相关的直线。
原因:物种矩阵没有做任何转换,某个样点的优势种多度是其他物种的几十倍,方差被它一个物种垄断,第一轴实际上就是这个物种的丰度轴。
解决:先做log(x+1)或 Hellinger 转换,再按物种标准化,然后重跑;同时用频次阈值筛掉只在个别样点出现的稀有种。转换方式要写进方法,不同转换得到的解释率不可直接比较。
5.3 变量比样点还多:前向选择选出一堆“显著”因子
现象:20 个样点、15 个环境因子,前向选择跑出 8 个显著变量,每个 p 值都小于 0.05,但换成另一批同类数据后选出的变量完全不同。
原因:自由度不足导致的过拟合。解释变量个数接近样点数时,模型几乎可以完美拟合任何数据,置换检验也失去区分能力。
解决:把解释变量数控制在样点数的三分之一以内,先按生态学假设做一轮人工筛选,报告调整后的解释率而非原始解释率,变量多时开启显著性校正。样本量确实不够时,老老实实把分析降级为探索性结论,不要写成确定性结论。
5.4 置换方式选错:p 值系统性偏小
现象:明明组间差异不明显,约束排序的置换检验却给出极显著的 p 值,换一种数据就复现不出来。
原因:采样设计是分季节或分处理组分块进行的,样点之间存在天然的组内相关,但置换检验用了完全随机置换,把本不可交换的样点当成可自由交换,零分布被压窄。
解决:在分析设置里改用分层置换,把分组变量指定为置换块;如果设计更复杂(比如重复测量),考虑用循环置换。这一项设错不会有任何提示,只能靠回头核对采样设计发现。
5.5 导出图形分辨率不足:排版时才发现的返工
现象:屏幕上看着清晰的排序图,插进排版文件后箭头和标签全部发虚,放大后锯齿明显。
原因:直接用截图或低分辨率位图导出,位图在缩放时不可逆地损失信息。
解决:导出时选矢量格式(EMF、WMF、PDF 之类),需要位图时按 300 dpi 以上导出;物种箭头过多时先在软件里设置显示阈值,只保留拟合度靠前的若干个,再导出。这一步在分析阶段就定好,不要等到排版前才改。
6. 进阶:变差分解把解释率拆开,再用外部工具自证
当环境变量能分成几组(比如气候组、土壤组、空间组),普通约束排序只能告诉你“这些变量合起来解释了多少”,说不清各组各自贡献多少、重叠多少。变差分解(variation partitioning)解决的就是这个问题:它把总解释量拆成各组独立贡献和共享贡献,输出各分区的解释比例,并对每个独立分区做置换检验。
在软件里的操作路径是先建立变差分解分析,然后把环境变量按组分配到不同的变量集里,运行后得到各分区占比和对应 p 值。要点有三个。第一,分组要基于先验假设,不能跑完看结果再调整分组,那就是数据挖掘。第二,组数不要超过三组,超过之后分区数量呈指数增长,解释和作图都会失控。第三,共享部分(各组重叠解释的量)不能简单归给某一组,写结论时要说“无法区分”,不要强行分配。
变差分解的结果出来后,我习惯用外部工具做一次独立复算,确认软件里的数字没有因为某个设置选项而偏移。以 R 的 vegan 包为例,同样可以做 PCA 和约束排序,把关键数字对一遍:
library(vegan) sp <- read.delim("species_ready.txt", row.names = 1, check.names = FALSE) env <- read.delim("env_ready.txt", row.names = 1, check.names = FALSE) # 与软件端保持同一套预处理:对数转换 + 按物种标准化 sp_log <- log1p(sp) sp_std <- decostand(sp_log, method = "standardize", MARGIN = 2) # 非约束排序:核对前两轴特征值与解释率 pca <- rda(sp_std) pca$CA$eig[1:4] / sum(pca$CA$eig) # 各轴解释比例 summary(pca)$cont$importance[3, 1:2] # 前两轴累计解释率 # 约束排序:核对全模型解释率与置换检验 p 值 rda_full <- rda(sp_std ~ ., data = env) RsquareAdj(rda_full) # 调整后解释率,比原始值更该报告 anova(rda_full, permutations = 999) # 全模型置换检验这段代码的用途是对账,不是替代软件。decostand的MARGIN = 2表示按列(物种)标准化,必须和软件里选的是同一维度,否则解释率对不上;rda(sp_std ~ ., data = env)用全部环境变量建全模型,RsquareAdj给出调整后解释率,这个数字和软件里的对应项应当在小数点后一位内一致,差太多说明两边的转换或标准化没对齐;anova里permutations = 999要和软件端设置一致,置换次数不同 p 值会有细微差别,属于正常波动。如果两边解释率差出好几个百分点,八成是某一边漏了转换或者标准化维度选错,这时候以原始数据重新走一遍预处理流程,别在结果页上猜。
从那以后我每次跑完变差分解,都强制走一遍这套对账流程:先核对前两轴解释率,再核对全模型调整解释率,最后核对置换检验的 p 值量级,三步都对上才敢往下写。多花的这二十分钟,比事后被问“你这个解释率怎么算出来的”时翻半天记录要划算得多。希望帮到你。
本文还有配套的精品资源,点击获取