资讯动态

用Python实现方差分解:拆分环境与空间变量的解释率并绘制韦恩图

发布时间:2026/9/3 13:04:10 来源:尧图企业网站定制
模型调完了R² 0.85审稿人却问“这个解释率里环境变量和环境空间结构各占多少它们重叠了多少”如果你只能回答“模型整体拟合不错”这张配图就不太稳。对于生态、地理、环境、遥感这类经常处理空间数据的论文来说把“空间变量”和“环境变量”两组解释源的贡献拆开已经不只是统计学细节而是研究设计的一部分。这篇文章要解决的正是这个高频需求用 Python 做方差分解Variance Partitioning并把结果画成期刊风格的多面板韦恩图。很多人默认这种图只有 R 语言的 vegan 包能做其实 Python 的 pandas、statsmodels、matplotlib 组合完全可以复现并且能顺畅接进机器学习工作流。读完这篇文章你会得到一套可复用的 Python 代码可以从模拟数据切换到自己的论文数据得到环境、空间、共同和未解释四个部分的解释率并批量绘制多张配图。先给一个明确判断这条路径的核心不是绘图库而是“偏解释率”的计算。韦恩图只是视觉出口真正要避开的坑是如何从两个相关性很高的变量集合里拆出各自独立和重叠的贡献。1. 为什么需要方差分解韦恩图在生态学、土壤学、传染病空间分析、城市环境研究等领域研究者经常面对同一类问题响应变量既受环境梯度影响又受地理空间结构影响。因此大家会很自然地把解释变量分为两组环境变量温度、降水、土壤理化性质、土地利用比例等。空间变量经度、纬度、以及由坐标衍生出的空间结构项例如 x²、y²、xy或更高级的距离矩阵特征。如果只做一次全模型回归我们得到的解释率是两组变量共同产生的总解释率。问题是温度和地理位置往往存在相关性比如低纬度通常更温暖地形起伏会影响降水也可能影响采样点是否容易到达。直接比较两个单独模型的 R² 会把同一个解释来源重复计算这就会得出错误结论某变量子集贡献很大而实际上它的作用有很大一部分是通过另一组变量间接发生的。方差分解提供了一个更接近真相的答案。它把模型总解释率拆成四个部分环境的独立贡献即在扣除空间变量之后环境变量仍然能解释的部分。空间的独立贡献即在扣除环境变量之后空间变量仍然能解释的部分。环境与空间共同产生的贡献也就是二者理论上都解释不了的那部分重叠。模型未能解释的部分。这种分解逻辑是很多高分期刊配图的基础。它让读者一眼看出某个响应的解释来源是环境主导、空间主导还是两者密不可分。从机器学习工程的视角看这也是一种基于线性模型的解释性分析你不仅关心预测准不准还关心哪些特征来源真正提供了有效信息。2. 方差分解的数学结构从一个 R² 到四个区块为了不把概念停留在“大致分一分”的层面需要把公式写清楚。设响应变量为 y两组解释矩阵为E环境变量矩阵。S空间变量矩阵。先用普通最小二乘线性回归或等价模型分别计算R²_f全模型 y ~ E S 的决定系数。R²_e仅环境模型 y ~ E 的决定系数。R²_s仅空间模型 y ~ S 的决定系数。然后按以下公式拆解组成部分含义计算公式a环境独立贡献R²_f − R²_sb空间独立贡献R²_f − R²_ec环境与空间共同贡献R²_e R²_s − R²_fd未解释部分1 − R²_f从这个公式最容易理解的一点是环境独立贡献不是“环境模型单独跑出来的 R²”而是全模型扣除空间模型后的增量。它回答的问题是在已经知道空间结构的情况下再引入环境变量还能额外解释多少变异。同理空间独立贡献是全模型扣除环境模型后的增量。两者重合的部分就是环境与空间因为相关性而产生的共同解释率。为什么公式中会写成 R²_e R²_s − R²_f我们做一个简单的文氏图验证单独看环境模型它包含 a c单独看空间模型它包含 b c全模型包含 a b c。于是(a c) (b c) − (a b c) c这样共同贡献就可以还原出来。在变量个数较多时直接使用朴素 R² 会因为自由度问题高估解释率所以实际发表材料中建议使用校正决定系数 adjusted R²。下面代码中的 r2_score 函数会同时支持普通 R² 和 adjusted R²。如果样品量不够大、解释变量数量较多请把 adjusted 参数设为 True。3. 环境准备与依赖安装本文代码使用 Python 3建议在 Python 3.9 及以上环境运行。核心依赖

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价