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

R中树木生长数据GAM自定义函数报错及每日预测优化需求

问题分析与解决方案

原代码核心错误

  • 自定义函数gamfun未根据传入的Year和Tree筛选对应子集,始终用全量数据建模,导致所有预测结果完全重复。
  • 函数中引用了未定义的datosSTD对象,应替换为当前分组的数据集。
  • 生成结果数据框时错误使用原数据的DOY,而非生成的每日序列new_DOY。
  • 使用mapply时直接传入原数据的每一行,导致函数被重复调用20次(对应20行观测),而非按每个Year-Tree组合调用一次。

修正后的高效实现方案

针对大样本(6棵树、10年、4个生长阶段),推荐用dplyr分组嵌套+purrr::map的方式,代码清晰且性能高效:

1. 加载依赖包

library(mgcv)
library(dplyr)
library(purrr)

2. 修正建模函数

gamfun <- function(data_subset) {
  # 针对单个Year-Tree的子集构建GAM模型
  enlarging_model <- gam(Enlarging ~ s(DOY), 
                         data = data_subset, 
                         family = quasipoisson(), 
                         gamma = 1, 
                         min.sp = 1)
  
  # 生成该子集的每日DOY序列(从首次到末次采样日)
  new_DOY <- seq(min(data_subset$DOY), max(data_subset$DOY), 1)
  
  # 预测每日膨大期细胞数量
  enlarging_pred <- predict(enlarging_model, 
                            newdata = data.frame(DOY = new_DOY), 
                            type = "response")
  
  # 返回结构化的预测结果
  return(data.frame(DOY = new_DOY, enlarging_pred = enlarging_pred))
}

3. 按Year-Tree分组执行建模与预测

# 按年份和树编号分组,嵌套每个组的原始数据
df_nested <- df %>%
  group_by(Year, Tree) %>%
  nest()

# 对每个分组应用建模函数,生成每日预测并展开结果
df_predictions <- df_nested %>%
  mutate(predictions = map(data, gamfun)) %>%
  unnest(predictions) %>%
  select(-data) # 移除嵌套的原始数据列(可选)

# 查看结果结构
head(df_predictions)

4. 结果说明

最终的df_predictions包含4列:

  • Year:年份
  • Tree:树木编号
  • DOY:每日积日
  • enlarging_pred:膨大期细胞数量的每日预测值

该方案会自动为每个唯一的Year-Tree组合生成对应区间的每日预测,无重复计算,结果结构清晰,便于后续判断生长阶段起止时间。

多生长阶段适配建议

如果需要同时处理4个生长阶段,可在分组时加入阶段列,调整函数的响应变量参数,即可实现多阶段的批量建模与预测。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:45:20