You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在海豹丰度散点图上拟合GAM曲线?含建模细节咨询

在散点图上添加GAM模型拟合曲线的方法

嘿,我来帮你搞定在散点图上叠加GAM拟合曲线的事儿!首先先给你吃个定心丸:你的模型里把Tide设为因子变量完全没问题,GAM对因子变量的支持很好,它会自动将因子转化为虚拟变量来拟合不同水平的效应,不用额外担心这个点~

接下来分两步走,不管你用基础R绘图还是ggplot2,都能实现需求:

第一步:生成模型的拟合预测值

因为你的GAM模型里包含了WindspeedTide两个协变量,所以我们需要先构建一个包含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_timeTotal的边际效应,同时控制了其他协变量的干扰,是很合理的做法哦~

内容的提问来源于stack exchange,提问作者Natalie Ward

火山引擎 最新活动