R语言实现:广义加性模型GAM

🌱 非线性关系的挖掘利器——GAM模型

在生态与土地利用研究中,变量之间往往存在复杂的非线性关系。传统线性模型可能无法捕捉这些细节,而广义加性模型(Generalized Additive Model, GAM)提供了更灵活的建模框架。它通过对自变量应用平滑函数,揭示变量对响应变量的“逐点作用”,非常适合探讨环境因子如何共同影响如生态系统服务、生境质量等复杂结果变量。

它的优势在于:

  • 不强假设变量线性关系;

  • 利用平滑函数 s() 自动拟合曲线;

  • 可解释性好,适用于生态、气候等非线性数据场景。

📦 第一步:加载必要R包与多期数据整合

library(mgcv)       library(openxlsx)   library(ggplot2)    library(tidyr)      library(gridExtra)  data_2000 <- read.xlsx("D:/data_sjzl/A_SEM/2000.xlsx", sheet = 1)data_2010 <- read.xlsx("D:/data_sjzl/A_SEM/2010.xlsx", sheet = 1)data_2020 <- read.xlsx("D:/data_sjzl/A_SEM/2020.xlsx", sheet = 1)data_combined <- rbind(data_2000, data_2010, data_2020)

📈 第二步:构建广义加性模型(GAM)

gam_model <- gam(sjzl ~ s(tem) + s(rain) + s(dem) + s(slope) +                 s(intention) + s(ndvi) + s(pop) + s(nl) +                  s(gdp) + s(railway), data = data_combined)

这一步构建了以生境质量指标 sjzl 为响应变量的GAM模型,涉及的解释变量包括自然因素(如温度、降水、地形起伏)和人类干扰因素(如人口密度、夜间灯光、GDP等)。

核心优势

  • s(x) 表示对变量 x 使用平滑样条(spline)建模;

  • GAM自动选择最佳平滑程度,揭示非线性趋势;

  • 可同时分析多个变量的边际效应。

🔍 第三步:提取变量的边际影响

for (variable in c("tem", "rain", "dem", "slope", "intention",                    "ndvi", "pop", "nl", "gdp", "railway")) {  data_combined[[paste0(variable, "_pred")]] <- predict(    gam_model, newdata = data_combined, type = "terms")[, paste0("s(", variable, ")")]}

这段代码提取了每个变量对生境质量的单独贡献值,即边际效应(Partial Effect)。这些值将用于后续绘图,帮助我们理解每个因子如何“影响”响应变量的波动。

📌 Tips

  • type = "terms":返回每个变量的平滑函数估计值;

  • 类似“成分图”,在环境模型分析中常用于解释变量的“作用路径”。

🔁 第四步:数据整形为长格式(方便绘图)

​​​​​​​

data_long <- data_combined %>%  gather(key = "Variable", value = "Predicted", tem_pred:railway_pred)

使用 gather() 函数将宽格式转换为长格式,便于使用 ggplot2 进行多个变量图的统一绘制。

📌 长格式优势

  • 统一图形模板;

  • 易于循环绘图;

  • 可视化过程更自动化。

🎨 第五步:定义美化风格和颜色分组

​​​​​​​

group_colors <- c("tem" = "#009ef6", "rain" = "#009ef6",                   "dem" = "#9486f4", "slope" = "#9486f4",                   "intention" = "#a5c436", "ndvi" = "#a5c436",                   "pop" = "#fc7dde", "nl" = "#fc7dde",                   "gdp" = "#ffc406", "railway" = "#ffc406")

📊 第六步:批量绘制 GAM 散点+拟合图

​​​​​​​

for (variable in c(...)) {  plot <- ggplot(...) +    geom_point(...) +    geom_smooth(method = "gam", formula = y ~ s(x), ...)  plot_list[[variable]] <- plot}png("D:/.../gam_scatter_plots_final10.png", width = 3200, height = 2400, res = 300)do.call("grid.arrange", c(plot_list, ncol = 4, nrow = 3))dev.off()

结果展示

📌 总结

✅ GAM模型适合用于探索生态因子与环境响应间的复杂关系,不强依赖线性假设,结果也更贴近实际。

📚 本案例结合多个年份数据,构建稳定模型,并用 ggplot2 做出高质量图表,适合生态学、地理、遥感等方向研究者借鉴!

📥 有需要代码或图样板的朋友欢迎评论区互动!欢迎关注我了解更多R语言生态建模技巧 🧠🌿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值