ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

PCA分析与CANOCO 5.0实战:中心化、标准化、双序图及避坑指南

PCA分析与CANOCO 5.0实战:中心化、标准化、双序图及避坑指南

简介:CANOCO 5.0 面向生态学、植物学与环境科学中需要开展群落排序与梯度分析的学习者和研究者,用于把样方或物种排列在反映生态梯度的排序轴上,解释植被分布与环境因子之间的关系,并弥补分类方法难以呈现群落连续性的不足。压缩包共34个文件、约13.38MB,包含可执行程序与动态库、c5p项目文件、log与txt说明、sol/con/dta等配置或数据文件,以及示例数据表、PDF教程和CHM帮助文档,兼顾软件运行、案例练习与结果查阅。已有1150人学习下载,说明其在PCA排序与群落分析入门中具有一定参考价值。读者可借助示例数据和教程熟悉排序分析流程,理解样方、物种与环境变量的组织方式,并利用项目文件复盘典型分析场景,逐步掌握从数据准备到生态解释的关键思路。

1. 一个 200 行的物种矩阵,真正被算法决定的只有几件事

把一份 60 个样方、200 个物种的群落数据拖进 CANOCO 5.0,在 Analysis type 里选 PCA 分析,点运行,几秒钟后得到一张二维散点图和一行累计解释率。截图、贴报告、写一句"第一轴解释 32.4% 的变异",流程就结束了——几乎没人回头看这几秒钟背后到底发生了什么。

但 PCA 分析真正决定结论的部分,全发生在按下运行之前:数据有没有做转换、要不要标准化、线性模型是不是这批数据的正确假设。软件做的只是把一个中心化矩阵做了一次奇异值分解,剩下的事——把哪部分方差送进第一轴、让哪些物种的箭头被放大到刺眼、哪些物种被压成看不见的小点——在你勾选那几个复选框时就已经定死了。后面几章就沿着这条链路往下拆:先看数学骨架,再看软件里那几个开关改写了什么,最后看结果该怎么读、哪些地方最容易翻车。

2. PCA 的数学骨架:中心化、协方差矩阵与特征分解

PCA 没有黑箱,它是一串可以手算的线性代数。之所以值得把这串东西摊开,是因为后面所有的"选项"和"坑",本质都是在这串运算的某个环节上做了手脚。理解了它在哪一步动手,你就知道结果为什么会变成那样。

记样方×物种矩阵为 $Y$,$n$ 行样方、$p$ 列物种。整个 PCA 只做三件事:把 $Y$ 平移到原点附近,构造一个 $p \times p$ 的对称矩阵,对这个矩阵做正交分解。三步里任何一步被改写,结果都会跟着变。

2.1 中心化不是预处理,是定义的起点

PCA 的第一个动作是减去每个物种的均值,得到 $Y_c = Y - \mathbf{1}\bar{y}^T$。这一步在 CANOCO 里是隐式完成的,界面上没有"是否中心化"的开关——因为它压根不是可选项,它就是 PCA 的定义本身。

为什么不中心化会出事?设想所有样方都有个共同特征:总个体数在 500 上下浮动。此时数据里最大的那个"方向"其实是常量向量 $\mathbf{1}$ 本身,它代表的是群落的平均组成,不是群落之间的差别。不中心化,第一主轴会被这个常量方向整个吸走,解释率看着很高,图上却只反映"每个样方都有很多个体"这种毫无生态含义的结论。

中心化之后,$\mathbf{1}^T Y_c = 0$,均值方向被彻底剔除,剩下的每一分方差都是样方之间的真实差异。这一步还顺带降低了矩阵的秩:$Y_c$ 的秩最多是 $\min(n-1, p)$,60 个样方最多只能撑起 59 个非零轴,这也是 CANOCO 报告里轴数总是不超过"样方数减一"的原因。

提示:中心化只减均值,不除标准差。把这两件事混为一谈,是很多解释率对不上的根源,下一章会专门拆。

2.2 特征值就是方差本身,不是方差的"代表"

中心化之后,构造协方差矩阵 $S = Y_c^T Y_c / (n-1)$,这是一个 $p \times p$ 的实对称矩阵。对 $S$ 做特征分解 $S = V\Lambda V^T$,得到的列向量 $v_k$ 是正交的排序轴方向,对角元 $\lambda_k$ 就是数据在第 $k$ 根轴上的方差。

这个结论可以直接推:任取单位向量 $v$,把数据中心化矩阵投影到 $v$ 上,投影后各点坐标的方差是 $v^T S v$。PCA 要找的就是让 $v^T S v$ 最大的那个 $v$。用拉格朗日乘子写出来,目标函数是 $v^T S v - \lambda(v^Tv - 1)$,对 $v$ 求导令其为零,直接得到 $Sv = \lambda v$——最大化投影方差的解,恰好就是 $S$ 的特征向量,对应的最大值就是特征值。

所以特征值不是"方差的某种指标",它就是方差,单位和你原始数据一致。所有特征值之和 $\sum_k \lambda_k = \mathrm{tr}(S)$ 等于每个物种方差的总和,这个总量在分解前后一分不多一分不少。所谓"第一轴解释 30%",准确表述是:第一轴这个方向上的方差,占全部物种方差总和的 30%。PCA 是个方差重新分配器,它不创造信息,只把 $p$ 个方向上的方差重新打包到少数几个正交方向上,并且是按贪心顺序打包——第一轴拿走能拿走的最大份额,第二轴在剩余空间里再拿走最大份额,依此类推。

2.3 实际计算走 SVD,不走特征分解

数学上 $S$ 的特征分解和 $Y_c$ 的奇异值分解是等价的:若 $Y_c = UDV^T$,则 $S = Y_c^T Y_c/(n-1) = V(D^2/(n-1))V^T$,所以 $\lambda_k = d_k^2/(n-1)$,右奇异向量就是特征向量。

但工程实现几乎都走 SVD。原因有两个。其一是条件数:构造 $S$ 相当于把矩阵平方,条件数也跟着平方,原本 1e-8 的精度损失会变成 1e-16,小特征值直接失真甚至变负。其二是维度:60 个样方、200 个物种时,$S$ 是 200×200 的矩阵,秩却只有 59,绝大部分计算是浪费在零空间上的;SVD 只需求 $\min(n,p)$ 个奇异值,代价小得多。

下面的 R 代码用三条路径算同一组特征值,可以直接验证这个等价关系,也能看到协方差矩阵路径在 $p \gg n$ 时的精度问题。

set.seed(1) # 60 个样方 x 200 个物种的计数矩阵,模拟群落数据 Y <- matrix(rpois(60 * 200, lambda = 5), nrow = 60, ncol = 200) # 只中心化,不标准化 Yc <- scale(Y, center = TRUE, scale = FALSE) # 路径一:协方差矩阵 + 特征分解(p x p) S <- crossprod(Yc) / (nrow(Yc) - 1) eig <- eigen(S, symmetric = TRUE) # 路径二:直接对中心化矩阵做 SVD sv <- svd(Yc) lambda_svd <- sv$d^2 / (nrow(Yc) - 1) # 路径三:R 内置 prcomp,内部就是 SVD pc <- prcomp(Y, center = TRUE, scale. = FALSE) round(head(eig$values, 5), 3) # 可能出现极小负值,是数值误差 round(head(lambda_svd, 5), 3) # 恒为非负 round(head(pc$sdev^2, 5), 3) # 与 SVD 路径完全一致

eigen()返回的结果在尾部会出现 -1e-15 量级的负特征值,这是平方运算放大舍入误差的典型症状;svd()路径不会有这个问题,因为奇异值天然非负。这也是为什么所有成熟实现都优先选 SVD——不是因为数学上更优雅,而是因为数值上不翻车。

prcomp()的center = TRUE对应 2.1 节的中心化,scale. = FALSE对应"不标准化",这两个参数就是下一章要展开的那两个复选框。

2.4 秩上限决定了你能问多少个问题

还有一个容易被忽略的推论:非零轴的数量上限是 $\min(n-1, p)$。60 个样方、200 个物种,最多只能得到 59 根有意义的轴,第 60 根之后的特征值严格为零。

这在实操里意味着两件事。一是解释率的分母固定为全部方差,样本量越小,总方差越容易被少数几根轴吃掉,累计解释率看起来越"漂亮",但这只是维度低造成的假象,不代表结构更强。二是当物种数远大于样方数时,大量物种的信息被压缩在极少数轴上,那些出现频率极低的物种在分解中几乎没有贡献,却仍在图上报出一个箭头——它们的位置是噪声的线性组合,不该被当成结论。

3. CANOCO 5.0 里的四个前置开关:转换、标准化、权重与模型分岔

第 2 章的骨架是纯粹的数学,输入什么矩阵就算什么结果。CANOCO 5.0 的价值在于它把这套数学包装成几个复选框,而每个复选框都在改写送进分解的那个矩阵 $Y_c$。理解这四个开关,比记住界面上哪个按钮在哪重要得多。

3.1 数据转换:在修正分布的偏斜

群落丰度数据有几个天然毛病:计数型、右偏、大量零、方差随均值增长。原始丰度直接进 PCA,结果会被几个优势种彻底主导——某个物种丰度 800,其他都是个位数,第一轴基本就是这个物种的有无轴。

常见的转换有三种。对数转换 $\log(x+1)$ 压缩量级差异,加一是为了处理零;平方根转换 $\sqrt{x}$ 压缩力度温和一些,适合中等偏斜的数据;Hellinger 转换先算相对丰度再开方,即 $x_{ij}/\sum_j x_{ij}$ 再取平方根。Hellinger 的特殊之处在于,转换后样方向的欧氏距离与原始数据的 Hellinger 距离严格等价,而 Hellinger 距离对"双零"(两个样方都没有某物种)不敏感,这是它比原始欧氏距离更适合群落数据的原因。

CANOCO 5.0 里对应的是数据转换选项。选择依据不是哪个"高级",而是你的数据偏到什么程度:丰度跨度在 1~2 个数量级,平方根够用;跨度到 3~4 个数量级,对数更稳。转换是在中心化之前做的,顺序不能反。

3.2 标准化:相关矩阵和协方差矩阵是两个不同的问题

这是最容易被忽略、后果最严重的一个开关。scale = TRUE时,每个变量先减均值再除标准差,协方差矩阵退化成相关矩阵,所有变量的方差都被拉到 1。

这件事对物种数据的后果是反直觉的:一个出现频率 2%、丰度方差极小的稀有物种,和一个占据 40% 丰度的优势种,在标准化之后权重完全相同。噪声被放大到和信号一样的量级,第一轴可能被几个随机波动的稀有种主导。所以在物种矩阵上做 PCA,标准做法是不标准化——让方差大的优势种承担主要权重,这符合"优势种定义群落结构"的生态学直觉。

反过来,如果你要分析的是环境变量矩阵(pH、有机质、含水量、海拔),量纲完全不同,pH 在 4~8 之间波动,海拔在 200~2000 之间波动,不标准化的话第一轴就是海拔轴。环境变量的 PCA 必须标准化。

我一般这么理解:标准化回答的是"哪个变量变化更剧烈",不标准化回答的是"哪个变量携带的绝对信息更多"。前者适合量纲混杂的环境数据,后者适合同一量纲、同一测法的物种丰度。

3.3 线性还是单峰:DCA 轴长这个判据

PCA 是一个线性方法,它假设物种丰度沿环境梯度的响应是单调的——环境值越高,丰度越高或越低。但真实的群落数据里,物种往往有最适区间,响应是钟形的:太干没有,适中最多,太湿又没了。

梯度短的时候,钟形曲线的一小段可以近似成直线,线性假设还站得住;梯度长的时候,一个物种在两端都接近零、中间高,线性模型强行拟合就会出现经典的弓形效应——样方点在第二轴上排成一条弯曲的弓。这时候用 PCA 得到的第二轴是伪结构,不是真实的第二梯度。

CANOCO 5.0 里判断标准是 DCA 的第一轴梯度长度(gradient length,单位是物种周转的 SD):小于 3 用线性方法(PCA、RDA),大于 4 用单峰方法(CA、CCA、DCA),落在 3~4 之间两者都行,看哪个解释起来更顺。这个判据不是拍脑袋,它对应的是物种响应曲线在观测梯度上的非线性程度——轴长 3 SD 意味着群落组成在梯度上换了三轮,线性近似基本失效。

注意:先跑 DCA 再决定用哪种排序,这个顺序不能省。CANOCO 5.0 把方法选择放在 Analysis type 里让你手动选,看起来多了一步,实际上是在强迫你做这个判断。有些工具默认给你 PCA,反而把这个决策点藏起来了。

3.4 样方权重:被遗忘的第四个开关

还有一个参数很少有文章提:样方权重。默认情况下 PCA 对每个样方等权重,但样方之间的"信息量"并不相等——一个记录了 80 个物种的样方,和一个只记录了 12 个物种的样方,在总方差里的贡献差了一个量级。

如果采样设计本身不均匀(比如不同生境的采样强度不同),等权重会让采样充分的样方主导排序结果。这时候需要显式调整样方权重,或者在数据整理阶段就做稀疏化处理。这个参数在多数分析里保持默认就行,但当你发现排序图上的样方分布和采样强度高度吻合时,就该怀疑是不是这里出的问题。

4. 排序轴怎么读:特征值、累计解释率与双序图几何

PCA 跑完,CANOCO 5.0 给出的结果面板里有三样东西最常被引用:各轴的特征值、累计解释率百分比、以及那张双序图(biplot)。三样东西各有各的误读方式,而且误读方式还很不一样。

4.1 解释率百分比没有通用及格线

第一轴解释 32%、前两轴累计 51%,在群落数据的 PCA 里是很正常的数字。但很多人看到这个数字会心虚,因为他们在别处见过"第一轴解释 85%"的案例。

那些 85% 的案例多半是环境变量的 PCA,或者样本量小、变量少的场景。群落数据天然嘈杂:大量零值、稀有种随机出现、采样误差,这些都会贡献方差但不贡献结构。变量越多、噪声越大,任何单一轴能解释的比例就越低。经验上,物种数据的 PCA 前两轴累计能到 40%~60% 就已经有可解读的结构了;环境数据因为变量少、共线性强,前两轴到 70%~90% 很常见。

正确的做法不是拿别人的数字当标准,而是做内部对比:换一种数据转换,累计解释率变化不大,说明结构稳定;一换转换就大幅变化,说明结果是被少数几个数据点撑起来的。

4.2 双序图的箭头,本质是余弦相似度

双序图把样方得分(点)和物种得分(箭头)画在同一张图上。读法只有三条规则,但每条都有前提。

箭头方向表示该物种丰度增加的方向:样方点落在箭头指向的那一侧,意味着这个物种在该样方里更丰富。两个箭头之间的夹角,余弦值近似等于这两个物种在排序空间里的相关系数:夹角小于 90° 正相关,接近 90° 无关,大于 90° 负相关。箭头长度表示该物种被这两根轴解释的方差比例,越短说明这个物种的变异主要落在没画出来的轴上,它在这张图上的位置基本没有信息量。

第三条规则最容易被浪费。一张图上箭头长度差异巨大时,短箭头物种的位置不该拿来解读——它们的坐标是噪声在低维空间里的投影,换个转换方式就会跳到完全不同的位置。

4.3 scaling 1 和 scaling 2:同一份结果,两种距离

这是 CANOCO 5.0 结果展示里最该被重视、却最常被忽略的选项。同一份特征分解结果,可以按两种方式分配得分,图上点的位置完全不同。

记中心化矩阵的 SVD 为 $Y_c = UDV^T$,$\Lambda = D^2/(n-1)$。

Scaling 1(样方距离优先):样方得分 $F = UD$,物种得分 $G = V$。此时 $FF^T = UD^2U^T$,正好正比于样方间的欧氏距离矩阵——图上两个样方点的距离,可以当真距离读。代价是物种箭头长度被压在 1 以内,箭头之间的夹角也不严格对应相关。

Scaling 2(物种相关优先):样方得分 $F = \sqrt{n-1},U$,物种得分 $G = V\Lambda^{1/2}$。此时 $GG^T = V\Lambda V^T = S$,物种得分的内积严格等于物种间的协方差矩阵,箭头长度等于该物种被两轴解释的方差比例,夹角余弦严格对应相关。代价是样方点之间的距离不再有距离含义。

两种缩放都满足 $FG^T = Y_c$,也就是说它们对原始数据的重构是等价的,差别只在于误差怎么分配。下面的代码验证这两条性质。

Yc <- scale(Y, center = TRUE, scale = FALSE) sv <- svd(Yc) U <- sv$u; d <- sv$d; V <- sv$v n <- nrow(Yc) # Scaling 1:样方得分 F1 = U %*% D,物种得分 G1 = V F1 <- U %*% diag(d) G1 <- V # Scaling 2:样方得分 F2 = sqrt(n-1) * U,物种得分 G2 = V %*% diag(d) / sqrt(n-1) F2 <- sqrt(n - 1) * U G2 <- V %*% diag(d / sqrt(n - 1)) # 验证一:两种缩放都能重构中心化矩阵 max(abs(F1 %*% t(G1) - Yc)) # 接近 0 max(abs(F2 %*% t(G2) - Yc)) # 接近 0 # 验证二:scaling 1 保样方欧氏距离 max(abs(as.matrix(dist(F1)) - as.matrix(dist(Yc)))) # 验证三:scaling 2 保物种协方差 max(abs(crossprod(G2) - crossprod(Yc) / (n - 1)))

三段验证分别对应三条性质。第一段说明两种缩放在信息量上完全等价,不存在哪个"更准";第二段说明 scaling 1 下样方点距离可以直接量;第三段说明 scaling 2 下物种箭头内积等于协方差。选哪个,取决于你的结论要落在"样方之间有多不同"还是"物种之间怎么协同变化"上——这两件事没法在一张图上同时严格成立,这是双序图固有的取舍。

4.4 PCA 没有可交换的零模型

这是 PCA 相对约束排序最实在的一个短板。RDA、CCA 这类约束排序可以跑置换检验:把环境变量在样方之间随机打乱,看解释率在零模型下的分布,从而给出一个 p 值。PCA 没有解释变量,没有可以打乱的东西,也就没有这个检验。

判断 PCA 的某根轴是否"值得解读",只能靠事后准则。常用的是 broken-stick 模型:把总方差按随机断棍的方式分配给各轴,实际特征值超过断棍期望的轴才算显著。这个方法在文献里争议不小,但比"看累计解释率到 50% 就停"要靠谱得多。交叉验证是另一条路,留出一部分样方,看投影误差随轴数的变化,误差不再下降的位置就是该停的地方。

CANOCO 5.0 的置换检验主要服务于约束排序,PCA 结果里的重点是特征值和解释率,别指望它给你一个显著性数字。搞清楚这一点,就不会在报告里写"PCA 第一轴显著"这种站不住的句子。

5. 避坑与排查:PCA 结果看着不对的五种情况

排序图跑出来,有时候一眼就知道不对:点挤成一坨、箭头长得离谱、解释率高得不像话。下面五条是按发生频率排的踩坑记录,每条都按现象、原因、解决三步写,可以直接对照排查。

5.1 第一轴解释率冲到 80% 以上

现象:物种数据跑 PCA,第一轴解释率 80% 甚至 90%,但图上的样方分布和采样设计完全对不上。

原因:九成是没做转换,原始丰度里有个绝对优势种或几个数量级差。一个物种丰度 5000、其余都是个位数时,这个物种的方差就是总方差的主体,第一轴退化成它的有无轴。另一种可能是把物种矩阵和环境变量矩阵拼在一起跑了,pH 的方差和丰度的方差根本不在一个量级。

解决:先看原始数据的最大值和最小值差几个数量级,超过 2 个就做对数或平方根转换。物种矩阵和环境矩阵分开跑,各自的标准化策略不同,混在一起两边都做不对。

5.2 第二轴上样方排成一道弯弓

现象:第一轴上的分布还正常,第二轴上的样方点排成一条明显的弧形或 U 形,两端上翘。

原因:这是弓形效应,PCA 拿线性模型去拟合单峰响应的经典失真。物种沿长梯度有最适区间,线性投影无法表达"中间高两端低",误差被挤到第二轴上,形成伪结构。梯度越长,弓形越明显。

解决:回到 DCA 看第一轴梯度长度。超过 4 就改用单峰方法(CA、CCA、DCA),不要硬用 PCA。如果必须用 PCA(比如要和 RDA 结果对比),至少要做去趋势处理,或者把数据按梯度分段分析。把弓形当成"第二梯度"写进结论,是排序分析里最常见的错误之一。

5.3 所有样方挤成一坨,外面挂着两三个离群点

现象:图上 90% 的点重叠在原点附近,剩下两三个点孤零零地在角落,整条轴被这几个点拉得很长。

原因:PCA 用的是平方欧氏距离,一个偏离中心 10 个单位的样方,对总方差的贡献是偏离 1 个单位的样方的 100 倍。少数离群样方会把轴的方向整个拽过去,主体样方之间的差异被压缩到看不见。

解决:先查这几个离群样方的原始记录——是真有特殊性(比如采到了完全不同的生境),还是记录错误(单位写错、物种误鉴定)。真特殊就单独讨论,别让它参与主体排序;有疑问就先做转换(对数转换对离群点的抑制很明显),再看图。另外,剔除低出现频率物种(比如出现样方数少于 5%)也能减少这类噪声。

5.4 物种箭头长度差异极大,短的几乎看不见

现象:图上几个箭头长到框外,其余几十个物种缩成一小团点,完全没法比较。

原因:箭头长度对应该物种被前两轴解释的方差比例,而这个比例和该物种的方差绝对值正相关。优势种方差大、被解释得多、箭头就长;稀有种方差小、大部分变异是随机波动,箭头自然短。这本身不是问题,但把短箭头也拿来解读就是问题。

解决:调整图的显示范围,或者按物种丰度分组着色。更重要的是改变解读方式——短箭头物种的位置不要写进结论,它们在这张图上的坐标换个转换就会变。如果确实关心稀有种,单独对它们做一次分析,或者用出现频率而不是丰度做输入。

5.5 换一种转换,结论全变了

现象:平方根转换下 A 物种和 B 物种正相关,换成对数转换就变成负相关,样方的分组也换了。

原因:这说明数据结构本身很弱,或者被少数几个高丰度样方撑着。不同的转换对高值的压缩力度不同,如果结果的稳定性依赖某个特定转换,那这个结论就不该对外报。

解决:把两三种合理的转换都跑一遍,比较前两轴的样方排序(用 Procrustes 或秩相关都可以)。排序一致,结论可信;不一致,说明数据里没有稳健的主导结构,该报告的是"没有明确结构"而不是挑一个好看的转换。血泪经验:挑转换方式挑到满意为止,本质是在做数据挖掘,得出的模式没法复现。

6. 设计取舍:为什么应该先跑 PCA,再做约束排序

聊完机制,回到一个更根本的问题:既然有 RDA、CCA 这些能直接把环境变量拉进来、还能给显著性检验的方法,为什么还要先跑一遍 PCA?

因为这两类方法回答的不是同一个问题。PCA 是无约束的,它只描述"数据里最大的变异在哪几个方向上",不解释这些变异为什么产生。RDA 是有约束的,它把环境变量作为解释矩阵,回答"这些变异有多少能被这几个因子解释"。前者是探索,后者是验证。跳过探索直接做验证,你连该放几个环境因子、该不该做某种转换都没有依据——RDA 跑出来解释率 18%,你不知道这 18% 是数据本身嘈杂,还是模型设定错了。

更实际的一点是,PCA 相当于一个零假设模型。它假设样方的变异完全由物种之间的协同变化决定,没有外部驱动因素。RDA 的解释率,本质上是"引入环境因子后,比这个零假设多解释了多少"。不先跑 PCA 拿到基线,约束排序的解释率就失去了参照系。

CANOCO 5.0 在这一点上的设计取向很清楚:Analysis type 里让你手动选 PCA、RDA、CA、CCA、DCA,而不是默认给一个方法。这个多出来的一步,实际是在逼你先做判断——先跑 DCA 看梯度长度决定线性还是单峰,先跑 PCA 看无约束结构有多大,再决定要不要引入环境变量、引入哪几个。工具没法替你做这个判断,但它至少没把这个判断藏起来。

反过来看,PCA 的短板也很明确:没有置换检验、没有可交换的零模型、对单峰响应无能为力、对离群点敏感。这些都是线性方法固有的代价,不是实现缺陷。选择 PCA 就意味着接受这些限制,用它来探路而不是用它来下结论。

我的习惯是每次拿到新数据,都强制走一遍这个顺序:先看数据分布决定转换,再跑 DCA 看梯度长度,长度允许就上 PCA 拿无约束结构和累计解释率,最后才考虑要不要上约束排序、放哪些环境因子。这套顺序走过一遍,后面每一步的取舍都有依据,报告里写的每个数字也知道它从哪来。忽略这一步直接上约束排序,翻车的方式往往很难回头查——你不知道解释率低是因为因子选错了,还是因为一开始的转换就把结构抹掉了。

希望帮到你。如果想在自己的数据上把上面这几条判据跑一遍,资源里的操作示例和示例矩阵可以直接拿来对照着走。

本文还有配套的精品资源,点击获取

返回列表