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
相关产品推荐
相关产品推荐

