简介:面源污染SWAT模型讲义面向刚接触分布式水文模型与非点源污染模拟的学习者,用一节课的篇幅梳理SWAT的核心框架与落地案例。内容先交代模型定位——土壤和水评估工具,按水循环环节模块化拆分,并说明命令代码控制子流域与河网演进的运行方式;随后分气候、陆地水文、水面水文三部分展开,涵盖日降水与气温、冠层蓄水、下渗、蒸散发、SCS曲线数地表径流、主河道与水库汇流等环节。泾河流域实例部分给出数据来源、92个子流域划分,以及不同植被和坡度下水土流失量的对比结论,便于理解参数设置与结果解读。包内为1个PPT文件,约564KB,适合课堂汇报或自学速览。已有986人学习,可作为面源污染建模入门的第一份框架性材料。
1. 面源污染最难算的从来不是排放量,而是“哪块地、哪场雨、冲走了多少”
面源污染也叫非点源污染,它和工业点源完全是两套逻辑:点源有一根管子,站在管子口测流量和浓度就能把账算清;面源没有管子,氮磷和泥沙是一场降雨在坡面上慢慢“泡”出来、再顺着沟道汇进河道的,雨没下之前,谁也不知道它要排多少。SWAT 模型(Soil and Water Assessment Tool,土壤和水评估工具)要干的事,就是把这件“事前说不清”的事变成“按天、按地块可以复算”的过程:把流域切成子流域,再把子流域切成同质地块,每个地块独立算产流产沙,最后沿河网汇到出口断面。搞懂它的价值不在于会点软件按钮,而在于你能判断一份面源污染模拟结果什么时候可信、什么时候是用参数硬凑出来的。
2. 空间离散与模块化:SWAT 为什么先把流域切成 92 块再拼回去
2.1 从子流域到 HRU:同一场雨为什么要分几种身份去算
一份日降水落在流域上,并不是均匀地变成径流。林地拦一部分、麦田渗一部分、村庄路面几乎全变径流。SWAT 的第一层离散是子流域:按地形和河网把流域划成若干块,每块有自己的出口和河道,讲义里的应用案例划出了 92 个子流域。第二层离散更关键,子流域内部再按“土地利用 × 土壤类型 × 坡度等级”的组合切成水文响应单元,也就是 HRU。
HRU 是产流的最小计算单元,它有三个特点值得记住:一是同一 HRU 内被认为完全同质,参数只有一套;二是 HRU 之间不发生水分交换,各自算完再把结果按面积加权汇总到子流域出口;三是 HRU 不出现在河网拓扑里,它只是子流域的一个“成分”。这套设计的动机很朴素:日尺度模型拿不到坡面汇流路径的高程细节,与其编一个假的路径,不如干脆承认“这一块地的产流直接进河道”。
代价也在这里。真实坡面上,上坡位的径流会流经下坡位,泥沙沿途沉积、氮磷沿途被吸附或解吸,HRU 之间不交互就把这段“沿程效应”抹掉了。常见的补救办法是把子流域划细一点,或者事后用输移损失参数去补,但两种办法都只能减小误差,消不掉。所以看到一份 SWAT 结果里子流域数量从 92 改成 300,泥沙总量变了,别急着怀疑模型坏了,这是离散尺度变化带来的必然结果。
2.2 一个环节一个模块:模块化到底解决了什么问题
SWAT 采用模块化设计,水循环的每一个环节对应一个模块:冠层截留是一个、下渗是一个、蒸散发是一个、壤中流是一个、地表径流是一个、河道汇流又是一个。这个“一个环节一个模块”不是软件工程上的洁癖,它解决的是三个很实际的问题。
第一是可替换。蒸散发可以选不同的潜在蒸散算法,融雪可以整套关掉,灌溉可以从农业管理模块里挂进来。你研究的是黄土丘陵沟壑区的水土流失,雪模块开着只是白算,关掉不影响结论。
第二是可裁剪。模块之间靠状态变量耦合,而不是靠一条写死的函数调用链:土壤分层含水量、冠层蓄水量、浅层含水层储量,这些状态量是模块之间的公共接口。上一时段蒸散发拿走了多少水,下一时段壤中流就少了多少水可拿,顺序由主控流程固定,模块内部怎么算互不干涉。
第三是可做情景对比。要回答“退耕还草之后流失量降多少”,本质上就是把土地利用这个输入换一套,其余模块一行不改,重跑一遍。讲义里“不同植被水土流失量的比较”,做的就是这件事。
我一般会这么理解这套设计:SWAT 不是在模拟一个物理世界,它是在维护一本按天结算的水量账本和泥沙账本,模块就是账本上的科目,科目可以增删,记账顺序不能乱。
2.3 命令驱动的汇流演进:为什么加一座水库只是改几行配置
讲义里有一句容易被扫过去的话:运行上采取命令代码控制方式,用来控制水流在子流域间和河网中的演进过程,使得添加水库的调蓄作用变得异常简单。这句话点到了 SWAT 架构里最实用的一块。
SWAT 的输入是一组按后缀分工的文本文件,每个文件负责一类对象,改动通过改文件完成,而不是改程序。
| 文件类型 | 承载内容 | 改动它会牵动什么 |
|---|---|---|
| 流域配置文件 | 子流域数量、河网连接关系、汇流顺序 | 整个演进序列,动它等于重排拓扑 |
| 子流域文件 | 子流域到河道的连接、气象输入索引 | 子流域归谁管、用哪套气象 |
| HRU 文件 | 土地利用、土壤、坡度、面积占比 | 产流产沙的源头参数 |
| 河道文件 | 河道物理参数、演算方法 | 水流在河道里的传播与损失 |
| 水库文件 | 入流、出流、降雨、蒸发、渗流相关参数 | 节点处的蓄泄行为 |
汇流是按天推进的时序:当天所有 HRU 算完产流产沙,按面积加权汇总到子流域出口,进入河道演算,再流向下游子流域,与那里的出流叠加,继续往下走,直到流域出口。水库就是插在这条时序上的一个节点:在流域配置里给某个子流域挂上水库编号,配一套水库参数,演进到它时先蓄、再按出流关系放,下游收到的水量和泥沙就自然变了。
这就是“添加水库异常简单”的技术含义:水库不是特例代码,它是演进链上的一个标准节点。你不需要理解程序怎么调度,只需要理解拓扑怎么描述。反过来说,拓扑描述一旦写错,比如某个子流域的上游编号指错了,模型照样能跑完、照样出结果,只是水流走了另一条路,这是后面避坑章节要专门讲的一类翻车。
3. 陆地水循环:一场降雨在坡面上被拆成几条路径
3.1 冠层蓄水与下渗:SCS 曲线数凭什么能顶替下渗物理过程
降雨落到地面之前先过冠层。SWAT 给每个 HRU 一个冠层最大蓄水容量,降水先填这个坑,填满了才落到地面,冠层里的水随后按潜在蒸散速率蒸发。落到地面之后,第一道分流是下渗,渗不下去的那部分才可能变成地表径流。
按物理过程推,下渗应该用 Richards 方程或者 Green-Ampt 类模型算,但那需要分钟级的雨强过程。讲义这个案例用的是 1996 到 2000 年的日降水、日最高最低温,一天一个数,雨强信息根本不存在。物理下渗模型没有驱动力,只能退回到经验方法,也就是 SCS 曲线数法(CN 法)。
它的核心是把“这场雨能产多少流”压缩成一个无量纲数 CN:
def scs_runoff(P, CN, lam=0.2): # P: 日降水量(mm) # CN: 曲线数, 由土地利用 + 土壤水文组 + 前期湿度决定, 范围约 30~100 # lam: 初损系数, 常用 0.2, 表示产流前先扣掉 20% 的潜在滞蓄 S = 25400.0 / CN - 254.0 # 潜在最大滞蓄量(mm) Ia = lam * S # 初损(mm), 被植物截留、填洼、初期下渗吃掉 if P <= Ia: return 0.0 # 雨还没填满初损, 不产流 Q = (P - Ia) ** 2 / (P - Ia + S) # 剩余雨量在滞蓄与径流之间分配 return min(Q, P) # 产流不会超过降水拿 CN = 75 试一下:S 约 84.7 毫米,初损约 16.9 毫米。一场 50 毫米的雨,产流约 9.3 毫米,产流系数不到 0.19;同样 CN 下换成 100 毫米的雨,产流约 41.2 毫米,系数跳到 0.41。这种非线性正是面源污染的节律来源:小雨年份坡面几乎不出流,污染物待在土里;暴雨年份产流系数翻倍,泥沙和吸附态磷一起被冲走。
参数怎么改也就清楚了:CN 不是自由旋钮。它由土地利用(麦田、草地、林地、裸地各不同)、土壤水文组(按下渗能力分 A 到 D 四组,D 组最黏最不渗)、前期土壤湿度共同决定,值域有物理边界。把它当标定参数随便拉,率定期能对上,验证期必崩。
3.2 蒸散发、壤中流与地下水:水分再分配的三条出口
渗进土壤的水不是存着不动,SWAT 把土壤按深度分层,每层维护自己的含水量,然后开三个出口。
第一个出口是蒸散发。潜在蒸散由气象驱动算出上限,实际蒸散再被土壤含水量打折:表层先蒸,植物根系按根深分布从各层吸水,上层干了就只能往下层要。土壤蒸发和植物蒸腾在模型里是分开算的,因为它们的限制条件不同,蒸腾受气孔和根系分布控制,蒸发只受表层含水量控制。
第二个出口是壤中流。当某层含水量超过田间持水量、又还没到饱和,多余的水会侧向流出,进入子流域河道。讲义里把它列为独立环节是对的,在山坡地带壤中流往往是河道基流的重要来源,也是溶解态氮输移的主要通道之一。常见的实现思路是用存储—出流关系描述:把该层超出田间持水量的部分当作一个线性水库,按一个衰减系数逐日放水。
第三个出口是地下径流。下层渗漏补给浅层含水层,浅层含水层再以基流形式补给河道。这一支的水量决定了枯水期河道里有没有水,也决定了溶解态污染物在非降雨期还能不能持续进河。
这三条出口的关系值得琢磨:同一个 HRU,如果壤中流系数调大,地表径流就少、泥沙就少、但溶解态氮可能更多;如果蒸散系数调大,产流整体下降,泥沙和污染负荷一起降。所谓“率定”,很多时候是在这几个出口之间做取舍,而不是把某一条路径单独修准。
3.3 植被:一个植物生长模型怎么统一接管所有植被类型
讲义里有一句容易被低估的描述:用单一的植物生长模型模拟所有类型的植被盖度。这句话既是 SWAT 的强项,也是它的软肋。
强项在于,它让“植被”从一张静态的土地利用图变成了一个动态变量。单一模型维护叶面积指数、生物量累积、根系深度这些状态量,随温度和水分条件逐日生长,覆盖度会变、根会变深、蒸腾需求会变。回到面源污染的场景,这意味着同一块地春天和秋天不是一回事:春季作物覆盖低,坡面裸露,同样的雨能冲走更多泥沙;到了生长旺季盖度上来,流失量就降下去。用静态土地利用图是模拟不出这个季节动态的,而讲义在“进一步工作”里恰好提出要模拟和分析月尺度的土壤流失、探索不同植被下水土流失规律的季节动态,说明作者也很清楚这套静态输入的天花板在哪里。
软肋在于,用一个模型统一所有植被,参数上就必然要做粗暴的等价。灌木和乔木在模型眼里主要是叶面积指数曲线、最大根深、最大冠层高度这几个参数的差别,树种结构、枯落物层厚度、林下灌草层次这些真正影响坡面侵蚀的东西,被压缩掉了。所以当你看到模拟结果说乔木的流失量高于高覆盖草地,不要立刻觉得反直觉就一定是模型错了,先想想它眼里的“乔木”到底是什么样子。
4. 水面汇流:泥沙和氮磷是怎么从坡面被搬到出口断面的
4.1 主河道汇流:水、泥沙、营养物、有机化学物质为什么必须同步演进
到了河道里,SWAT 同时搬运四类东西:水、泥沙、营养物、有机化学物质。讲义把主河道汇流单列成水面部分的第一块,是因为这四类物质的输移逻辑完全不同,但又必须在一个时间步内按顺序更新。
水的演进决定了其他三者的载体。河道演算常用的思路是把河道分成调蓄段,按变量存储系数或马斯京根类方法算传播和衰减,输出当日出流过程。
泥沙的演进分两段:坡面产沙和河道输移。坡面产沙常见的实现思路是修正通用土壤流失方程一类的经验式,把降雨径流能量、土壤可蚀性、植被覆盖与耕作管理、坡长坡度几个因子乘起来,得到一个坡面产沙量。这个量进入河道后,还要看河道有没有能力把它带走:水流挟沙能力大于来沙就冲刷河床,小于来沙就淤积。所以子流域出口的泥沙量,往往不是坡面产沙量,而是坡面产沙经过河道一路沉积、冲刷之后的净结果。
营养物分两态:溶解态跟着水走,吸附态挂在泥沙颗粒上走。这一步的先后顺序极其关键,必须先更新泥沙、再更新吸附态污染物,否则泥沙沉了而挂在它上面的磷还留在水里,物质不守恒。有机化学物质同理,靠分配系数在水相和泥沙相之间分配。
这套顺序说明了一个容易被忽略的机制:面源污染的输移不是“污染物随水流动”这么简单,而是“污染物在水和沙两相之间反复换乘”。河道里泥沙沉降,吸附态磷跟着沉到河底;下一次洪水冲刷,它又回到水里。这就解释了为什么有些流域的磷负荷表现出强烈的滞后性:当年的施肥量下降,河口的磷浓度要好几年才降下来,因为河道和水库底泥里存着历史账。
4.2 水库汇流:五个口子怎么改变下游的污染节律
讲义把水库汇流概括成五个口子:入流、出流、降雨、蒸发、渗流。看着简单,但它在面源污染模拟里的作用被严重低估。
水库首先是个沉降池。入流带着泥沙进来,流速骤降,粗颗粒先沉,吸附态氮磷跟着一起沉。出库的水相对清澈,挟沙能力反而变强,会把下游河道的床沙冲起来。这就是常说的“清水下泄”,它让下游断面的泥沙和吸附态磷可能出现不降反升的情形。
其次它是节律改写器。天然河道里污染物浓度跟着降雨走,雨大浓度高;水库把入流拦蓄、按出流规则慢慢放,下游看到的浓度峰值被削平、时间被推后。你如果拿水库下游的实测水质去率定上游坡面的产污参数,很可能怎么调都对不上,因为中间隔着一个改写节律的节点。
这也回到第 2 章讲的架构:水库是汇流时序上的标准节点,加它只需要在拓扑里挂一个编号、配一套参数。讲义说“使得添加水库的调蓄作用变得异常简单”,说的就是这个机制层面的解耦:蓄泄行为被封装成一个节点对象,不用去动水流演进的调度逻辑。
4.3 案例一:92 个子流域上的植被情景,1 : 0.683 : 0.446 : 0.219 : 0.168 怎么读
讲义的应用案例,研究目的是通过模拟看不同植被对水土流失的影响。输入是 1996 到 2000 年流域内一个气象站的日降水与最高最低温,2000 年的土地利用,以及 1:400 万的土壤图,模拟把流域划成 92 个子流域,然后把不同植被类型下的流失量折算成相对比值,以冬小麦为 1:
| 覆被类型 | 相对流失量 | 相对冬小麦的削减幅度 |
|---|---|---|
| 冬小麦 | 1.000 | — |
| 带覆盖草地 | 0.683 | 约 32% |
| 乔木 | 0.446 | 约 55% |
| 高覆盖草地 | 0.219 | 约 78% |
| 灌木 | 0.168 | 约 83% |
这组数字最值得学的不是排序,而是它的表达方式:用相对比值而不是绝对值。绝对流失量对参数、对土壤可蚀性因子极其敏感,换个土壤图能差出一个数量级,跨情景比较就没有意义了。相对比值把系统性偏差约掉了,剩下的差异主要来自覆被变化本身,这才是情景实验该关心的量。
排序本身也讲得通:冬小麦一年里有大段时间地表裸露,翻耕又破坏团粒结构,坡面几乎不设防;带覆盖草地有连续的地表覆盖,但覆盖度中等;乔木冠层截留大,但林下地表往往裸露,枯落物分解快、根系深层导水还会增加壤中流,坡面保护并不如想象中强,所以 0.446 高于高覆盖草地;高覆盖草地贴着地面连续覆盖,直接削减雨滴击溅和坡面流速,0.219 是合理的;灌木 0.168 最低,因为它的覆盖贴近地表又相对持久。
这里有个容易被讲错的地方:高覆盖草地优于乔木,不等于“种草比种树好”。模型里的乔木是参数化的乔木,林下没有灌草层,现实中的复层林结构完全不是这样。把结论往外推的时候,必须把“模型里怎么表达这种覆被”和“现实中这种覆被长什么样”分开看,这一步是血泪经验。
4.4 案例二:坡度实验里 R² 忽高忽低,暴露了什么
讲义的第二个实验是坡度与土壤流失量的关系,给了好几张散点拟合图。这些图最有价值的地方,恰恰是它们互相矛盾。
同一批数据,按不同坡段、不同河流等级分组之后,拟合结果五花八门:有的分组斜率明显为正、R² 能到 0.79 甚至 0.84,看着相当漂亮;有的分组斜率是负的,R² 只有 0.0049、0.0887、0.1035 这种量级,几乎等于说“这条线什么都解释不了”。一段被标注为 25 度以下的图,R² 只有 0.0049;换到 25 度以上、30 度以上重新分组,斜率和 R² 立刻换一张脸。
这不是数据脏,而是机制在提示你:坡度只是一个代理变量。真正驱动坡面侵蚀的是坡长、坡形、坡面覆盖、土壤可蚀性、以及侵蚀类型本身。缓坡上以面蚀和细沟侵蚀为主,流失量随坡度增长平缓;陡坡上重力侵蚀、崩塌、切沟开始介入,规律完全换了一套;再往上,坡面已经留不住土,流失量反而受限于“有没有土可流失”,增长就钝化了。把这几套机制混在一个回归里,自然得到一个什么都解释不了的 R²。
还有一个更隐蔽的原因:模型输出的流失量是子流域尺度的面平均值,不是坡面尺度的点值。子流域划得越大,内部坡度差异被平均得越狠,坡度与流失量的相关性就越弱。92 个子流域意味着平均每个子流域覆盖了相当一片面积,坡度信息在这一步已经被磨掉一层。所以那些 R² 很低的图,未必说明“坡度不重要”,更可能说明“在这个空间尺度上,用子流域平均坡度去解释子流域平均流失量,本来就解释不了多少”。
讲义在“进一步工作”里提出,要在年数据基础上做月尺度的土壤流失模拟、探索季节动态,以及研究流失对植被覆盖度变化的响应,方向正是对的:把时间尺度收细、把驱动因子从单一坡度扩到覆盖度动态,才有可能把那些 R² 只有 0.00x 的分组救回来。
5. 避坑与排查:跑 SWAT 最容易翻车的几个地方
5.1 输入侧:年份错位和比例尺不够,会让后面所有努力作废
现象:率定期水量对得挺好,一换验证期整体偏高或偏低,调参数怎么调都按不住。
原因:输入的时间基准不一致。讲义案例里气象是 1996 到 2000 年,土地利用是 2000 年一张图。土地利用是状态量,用末年的一张图去代表整个五年,等于假设这五年地表没变过。如果这五年里确实有大面积退耕或开垦,产流和产沙的系统性偏差就固定在输入里了,参数再灵活也补不回来。
解决:把时间基准对齐当成第一步强制检查。做不到逐年土地利用,就把结论限定成“在 2000 年下垫面条件下的模拟”,别拿它去解释跨年的趋势;或者把覆被变化改写成情景对比,而不是塞进历史率定。
现象:某个子流域怎么调参数都没反应,敏感性分析出来一堆零。
原因:土壤图比例尺太粗。1:400 万的土壤图落到子流域尺度上,几个相邻子流域可能被赋予完全相同的土壤参数,HRU 划分退化,参数敏感性自然消失。
解决:先做一次输入分辨率与子流域平均面积的量级比对。土壤图的最小图斑远大于子流域面积时,就别指望土壤参数能靠率定“调出来”,老老实实做敏感性分析、给出区间,比硬凑一个最优值诚实得多。
5.2 参数侧:CN、蒸散系数这些旋钮的物理边界在哪
现象:率定期 Nash 系数很漂亮,验证期直接崩盘。
原因:把 CN 当成自由参数拉到物理范围之外。CN 由土地利用、土壤水文组、前期湿度决定,值域大致在 30 到 100 之间,麦田、草地、林地各有合理区间。为了拟合某几年的实测径流把它拉到 95 以上,等于宣称这块地几乎不渗水,物理上就站不住,换年份必崩。
解决:给每个参数设硬边界,并且优先调那些不确定性本来就大的参数,比如土壤蒸发补偿系数、基流消退系数这类没有直接观测、只能靠率定确定的量。CN 只在小范围内微调,超出边界就说明是输入数据的问题,不是参数的问题。
现象:水量对得很好,泥沙差一个数量级,氮磷更是没法看。
原因:分步率定的顺序错了。产流、产沙、营养物是三套参数在管:产流看 CN 和下渗相关参数,产沙看土壤可蚀性、覆盖管理因子、水土保持措施因子,营养物看初始浓度和入河系数。一上来就把三者一起调,等于让三套参数互相掩盖误差。
解决:严格分步,先水后沙再养分,前一步不达标不进下一步。这一步顺序反过来,后面的工作全是白做。
5.3 结果侧:R² 好看、水量对得上,不代表泥沙和氮磷可信
现象:某段坡度的拟合 R² 到了 0.8 以上,就据此下结论说“坡度是主导因子”。
原因:R² 高只说明这组样本内线性关系强,不说明机制成立。讲义里同一批数据换个分组方式,斜率和 R² 就完全变了样,有的分组甚至是负斜率。分组方式本身是人选的,选到哪一组 R² 高就报哪一组,这是典型的选择性呈现。
解决:把所有分组结果一起摆出来,包括那些 R² 只有 0.00x 的组。低 R² 不是失败,它是“这个尺度上这个因子解释不了”的有效信息,往往比高 R² 更能说明问题出在尺度或因子选择上。
现象:换了子流域划分方案(比如从 92 个改成 200 个),所有结果都变了,不知道哪版可信。
原因:离散尺度变了,HRU 组合方式、河道汇流路径、参数汇总的面积权重全变了,结果不可比是必然的。
解决:情景对比实验一旦定下划分方案就锁死,中途不改。要评估划分敏感性,就单独做一组“同一情景、不同划分”的对照,用它给出结果的不确定区间,而不是混在情景对比里。
6. 取舍:SWAT 把物理过程压成参数,换来的是“缺资料也能跑”
把这份讲义从头到尾串一遍,会发现 SWAT 的每一个设计选择都在做同一件事:用可控的经验性,换可运行性。
半分布式是第一层取舍。HRU 之间不交互,坡面沿程的泥沙沉积和污染物换乘被抹掉,换来的是每个 HRU 只需要一套土地利用、土壤、坡度参数,而这些参数恰好是能从公开图件上拿到的。全分布式网格模型能表达沿程过程,但它需要每个网格一套参数,在 1:400 万土壤图这种资料条件下根本撑不起来。
经验公式是第二层取舍。CN 法替代物理下渗、经验产沙式替代泥沙输移方程,是因为日尺度气象输入里没有雨强,物理模型没有驱动力。这不是偷懒,是在输入信息量给定的前提下,选一个不会给出虚假精度的方案。
日步长是第三层取舍。日步长抹平了洪峰,暴雨期泥沙和污染负荷会被低估,但日步长让 1996 到 2000 年这种长度的序列可以跑完,也让气象数据的要求降到“有日降水和最高最低温”就行。
| 取舍点 | 放弃了什么 | 换来了什么 | 什么时候会失效 |
|---|---|---|---|
| HRU 不交互 | 坡面沿程沉积与吸附解吸 | 参数可从图件获取、计算量可控 | 子流域划得过大、坡长效应显著时 |
| 经验产流产沙公式 | 雨强驱动的物理过程 | 日尺度数据即可运行 | 暴雨、强对流、短历时洪水 |
| 日步长 | 洪峰过程与峰值浓度 | 长序列可跑、数据门槛低 | 研究峰值污染负荷或突发泄漏时 |
| 单一植物生长模型 | 群落结构与林下层次 | 覆盖度可动态演化 | 涉及树种配置、演替长期响应时 |
所以判断一份 SWAT 结果能不能用,问的不是“准不准”,而是“你要回答的问题,是不是正好在它没放弃的那一侧”。问年度产沙的相对排序,它在;问一场暴雨的峰值浓度,它不在。
从那以后,我每次拿到一份模型结果,都强制走一遍三步:先把所有输入的时间基准和空间分辨率摊开对一遍,再检查关键参数的物理边界有没有被突破,最后把分组拟合结果全部摆出来看低 R² 的那几组在说什么。三步走完,往往不用看最终报告,就知道这份结论能推到哪一步。希望帮到你。
本文还有配套的精品资源,点击获取