🌱 非线性关系的挖掘利器——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语言生态建模技巧 🧠🌿