
在复杂的水文与环境数据分析中,变量之间的关系往往并非简单的线性规律。降雨、径流或水质指标,可能呈现偏态分布、极端波动,甚至是非线性的变化趋势。如何在这样的背景下揭示潜在的规律?广义线性模型(GLM)提供了一种统一而灵活的统计框架。它不仅突破了传统回归对正态分布的限制,还能通过不同的连接函数刻画多样化的变量关系。
本期推文,小编将带大家一起了解GLM的基本原理、常见公式及应用案例,并展示它在水文研究中的优势,帮助大家更好地应对非线性与非正态数据的挑战。
01
顶刊案例
如下图展示了(a)三个水源和(b)两个水源的联合概率分布。颜色越黄表示该组合发生的联合概率越高。可以看出,三个水源同时处于高流量(黄色区域)的概率较高,而一个或多个水源处于低流量时,联合概率(蓝色区域)则较低,这直观地展示了丰枯遭遇的复杂性。

Zhong, H., Wu, S., Yan, M., & Fang, G. (2025). Derivation of optimal scheduling strategies for large-scale inter-basin water transfer projects considering streamflow wet-dry encounter uncertainty of multiple reservoirs. Journal of Hydrology, 662, 133784.
下图展示GAMLSS模型对螺山站径流的良好拟合。

Zhang, X., Bai, L., Xu, Z., Jiang, C., Chen, H., Ye, C., Ma, X., & Huang, Y. (2025). Impacts of large reservoirs on downstream lake hydrological regimes in complex river–lake systems: A case study of the Three Gorges Reservoir and Dongting Lake. Journal of Hydrology, 661, 133694.
下图展示GAMLSS 进行非平稳建模。

Wang, Y., Peng, T., He, Y., Singh, V. P., Lin, Q., Dong, X., Fan, T., Liu, J., Guo, J., & Wang, G. (2023). Attribution analysis of non-stationary hydrological drought using the GAMLSS framework and an improved SWAT model. Journal of Hydrology, 627, 130420.
02
方法介绍
广义线性模型(Generalized Linear Model, GLM)是线性回归模型的推广,它通过连接函数(link function)将响应变量的期望值与线性预测变量关联起来。GLM的数学表达式为:
E(Y) = μ = g -1(Xβ)
其中:
·Y 是响应变量
·X 是预测变量矩阵
·β 是参数向量
·g() 是连接函数
·μ 是响应变量的期望值
在本示例中,以水文中的径流预测为例,我们使用高斯分布和恒等连接函数(identity link),模型形式为:
runoff_sum = β0 + β1 · temperature_2m + β2 · snowfall_sum + ··· + ε
使用的数据包含1950-2023年的月尺度水文气象数据,主要变量包括(来自黄河流域):
·气象变量:2米气温、降雪量、蒸发量、降水量、地表潜热通量等
·水文变量:径流量、地表压力、风速分量等
·环境变量:叶面积指数、海表温度异常等
03
代码实现
代码1:模型构建与性能评估
#数据读取与预处理
data_path <- file.path("data", "geo.csv")
geo_raw <- read_csv(data_path, show_col_types =FALSE)
model_data <-drop_na(geo_raw)
#GLM模型构建
predictors <-setdiff(names(model_data), "runoff_sum")
glm_formula<-as.formula(paste("runoff_sum~",paste(predictors, collapse = " + ")))
glm_model <- glm(glm_formula, data = model_data, family = gaussian(link = "identity"))
#预测与评估
model_data<-mutate(model_data,predicted_runoff = predict(glm_model, newdata = model_data))
observed <- model_data$runoff_sum
predicted <- model_data$predicted_runoff绘图1:观测值与预测值散点图

该图展示了GLM模型对径流量的预测性能。图中对角线表示完美预测线,散点分布越接近对角线,模型预测精度越高。结果显示RMSE为0.00439,NSE为0.659,表明模型具有良好的预测能力。
代码2:变量贡献度分析
#变量标准化贡献度计算
response_sd <- sd(observed)
predictor_sd_vec <- model_data |> select(all_of(predictors)) |>
summarise(across(everything(), ~ sd(.x, na.rm = TRUE))) |> unlist()
coef_tbl <- tidy(glm_model) |> filter(term != "(Intercept)") |>
mutate(predictor_sd = predictor_sd_vec[term],
std_coefficient = estimate * predictor_sd / response_sd,
absolute_contribution = abs(std_coefficient))绘图2:变量贡献度条形图

该图显示了各预测变量对径流变化的相对贡献度。分析表明:
·总蒸发量和地表潜热通量是影响径流的最主要因素(合计贡献约90%)
·总降水量的直接贡献约为5.45%
·其他变量如时间趋势、叶面积指数等贡献相对较小
代码3:时间序列预测可视化
#时间序列数据处理
timeseries_tbl < model_data |>
mutate(time = ym(sprintf("%06d", as.integer(round(time))))) |>
filter(time >= ym("2000-01")) |>
arrange(time) |>
select(time, observed_runoff = runoff_sum, predicted_runoff)
#长格式转换与绘图
forecast_long <- timeseries_tbl |>
pivot_longer(cols = c(observed_runoff, predicted_runoff),
names_to = "series", values_to = "runoff")绘图3:径流时间序列对比图

该图展示了2000年以来观测径流与GLM预测径流的时间序列对比。图中可以观察到:
·模型能够较好地捕捉径流的季节变化特征
·在极端降雨事件期间,模型预测存在一定偏差
·长期趋势变化得到了合理的模拟
一图胜千言!水文图绘改版后致力于分享水文相关的精美图表,为读者提供作图思路和经验,帮助大家制作更漂亮丰富的图表。同时欢迎留言咨询绘图难点,我们会针对性地分享相关绘制经验。另外也期待读者踊跃来稿,分享更好的构图思维和技巧。

编辑:王龙浩 刘骁 | 校稿:hydro90 编委团

END
声明:欢迎转载、转发。气象学家公众号转载信息旨在传播交流,其内容由作者负责,不代表本号观点。文中部分图片来源于网络,如涉及内容、版权和其他问题,请联系小编处理。