You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化mgcv中GAM模型雌性鸟类时间拟合曲线的波动度

优化mgcv GAM中雌性鸟类取食领域时间拟合曲线的方法

问题背景

使用R的mgcv包构建GAM模型分析10只标记鸟类(4雌6雄)的取食领域(kde)时间序列数据:

  • 初步ggplot可视化显示雌雄个体的kde均呈现年中增大、年初年末缩小的年度趋势;
  • 无性别效应的模型gam1能拟合出全局年度趋势,但加入sex与TIME交互项的gam2仅能正确拟合雄性趋势,雌性曲线在第二年出现异常峰值;
  • 尝试调整平滑参数k/m、更换平滑器、设置fx=TRUE均未改善雌性拟合;
  • 改用循环样条(bs='cc')的gam4可呈现雌性季节趋势,将BandNumber嵌套于YEAR作为随机效应的gam5能让雌雄均呈现预期波动,但仍需进一步优化雌性拟合曲线。

可行优化方案

1. 为雌雄个体设置独立的时间平滑项

避免单一交互项的约束限制,给雌性的时间平滑项分配更灵活的参数:

gam6 <- gam(kde ~ sex + s(TIME, by = sex, k = 20, bs = 'cc') + s(BandNumber, bs = 're', by = YEAR),
            data = your_data, method = 'REML')
  • 针对雌性单独调大k值(根据数据时间跨度调整,示例设为20),循环样条bs='cc'保证年度趋势的周期性;
  • 保留个体嵌套年份的随机效应,捕捉个体间的差异。

2. 引入性别-季节-年份的因子平滑交互

若雌性的年度趋势存在年际差异(如不同年份峰值时间/幅度不同),用fs平滑项实现分组的时间-年份交互:

gam7 <- gam(kde ~ sex + s(TIME, YEAR, by = sex, bs = 'fs', k = c(10, 3)) + s(BandNumber, bs = 're'),
            data = your_data, method = 'REML')
  • bs='fs'允许不同年份的时间曲线独立变化,同时按性别区分;
  • k=c(10,3)分别控制时间和年份的平滑复杂度,年份的k值不宜过大(避免样本不足导致过拟合)。

3. 为雌性平滑项降低惩罚权重

针对雌性样本量较少的情况,降低其平滑项的惩罚强度,让曲线更贴合数据:

# 构建权重向量:雌性权重设为0.5(惩罚更弱),雄性设为1
weights <- ifelse(your_data$sex == 'female', 0.5, 1)
gam8 <- gam(kde ~ sex + s(TIME, by = sex, bs = 'cc', k = 15) + s(BandNumber, YEAR, bs = 're'),
            data = your_data, method = 'REML', weights = weights)
  • 权重需适度调整,避免过低导致曲线过度拟合噪声;
  • 用gam.check(gam8)查看诊断图(Q-Q图、残差分布)验证拟合合理性。

4. 拆分时间变量为季节+年份分层建模

将TIME拆分为年内日序(day_of_year)和年份两个变量,聚焦季节趋势同时捕捉年际变化:

# 新增年内日序变量
your_data$day_of_year <- lubridate::yday(your_data$TIME)
gam9 <- gam(kde ~ sex + s(day_of_year, by = sex, bs = 'cc', k = 12) + s(YEAR, by = sex, k = 3) + s(BandNumber, bs = 're'),
            data = your_data, method = 'REML')
  • day_of_year用循环样条保证季节周期性,YEAR平滑项捕捉不同性别在年份间的趋势差异;
  • 个体随机效应控制个体间的固有差异。

5. 模型拟合验证步骤

每次调整后需通过以下步骤验证效果:

  • 用plot(gam_model, pages = 1)查看平滑项拟合曲线,对比雌性曲线与原始数据趋势;
  • 用gam.check(gam_model)检查自由度充足性(edf接近k值说明需调大k,edf远小于k说明过度约束);
  • 绘制残差时序图验证残差无明显趋势或异方差:
ggplot(your_data, aes(x = TIME, y = residuals(gam_model))) + 
  geom_point(alpha = 0.3) + geom_smooth()

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:17:43