如何在海豹丰度散点图上拟合GAM曲线?含建模细节咨询
在散点图上添加GAM模型拟合曲线的方法
嘿,我来帮你搞定在散点图上叠加GAM拟合曲线的事儿!首先先给你吃个定心丸:你的模型里把Tide设为因子变量完全没问题,GAM对因子变量的支持很好,它会自动将因子转化为虚拟变量来拟合不同水平的效应,不用额外担心这个点~
接下来分两步走,不管你用基础R绘图还是ggplot2,都能实现需求:
第一步:生成模型的拟合预测值
因为你的GAM模型里包含了Windspeed和Tide两个协变量,所以我们需要先构建一个包含Obsv_time全范围、同时固定其他协变量到典型值的新数据集,再用模型生成对应预测值。
# 1. 构建用于预测的新数据集 # 覆盖Obsv_time的全范围,Windspeed取均值,包含所有Tide水平 new_data <- expand.grid( Obsv_time = seq(min(R_Count$Obsv_time), max(R_Count$Obsv_time), length.out = 100), Windspeed = mean(R_Count$Windspeed, na.rm = TRUE), # 固定风速为均值 Tide = unique(R_Count$Tide) # 包含所有潮汐因子水平 ) # 2. 用GAM模型生成原始尺度的预测值(泊松模型要加type="response") new_data$fit <- predict(gam.tot, newdata = new_data, type = "response")
第二步:把拟合曲线加到散点图上
方法1:基础R绘图
先画出原始散点,再按Tide的不同水平叠加拟合曲线:
# 绘制基础散点图 plot(Total ~ Obsv_time, data = R_Count, pch = 16, col = "gray", main = "海豹总丰度 vs 观测时段", xlab = "观测时段", ylab = "总丰度") # 循环叠加不同潮汐水平的拟合曲线 for (tide_level in unique(new_data$Tide)) { subset <- new_data[new_data$Tide == tide_level, ] lines(subset$Obsv_time, subset$fit, col = which(unique(new_data$Tide) == tide_level), lwd = 2) } # 添加图例区分不同潮汐水平 legend("topright", legend = unique(new_data$Tide), col = 1:length(unique(new_data$Tide)), lwd = 2, title = "潮汐类型")
方法2:ggplot2(更简洁美观)
如果你习惯用tidyverse的绘图系统,代码会更直观:
library(ggplot2) ggplot(R_Count, aes(x = Obsv_time, y = Total)) + geom_point(color = "gray", alpha = 0.6) + # 原始散点,加透明度避免重叠 geom_line(data = new_data, aes(y = fit, color = Tide), linewidth = 1) + # 叠加拟合曲线 labs(title = "海豹总丰度 vs 观测时段", x = "观测时段", y = "总丰度") + theme_minimal()
小提示
这里的拟合曲线是在固定风速为均值的条件下,展示不同潮汐水平下总丰度随观测时段的变化趋势——这样的展示能帮你清晰看到Obsv_time对Total的边际效应,同时控制了其他协变量的干扰,是很合理的做法哦~
内容的提问来源于stack exchange,提问作者Natalie Ward




