如何使用terra::predict输出栅格,预测含季节变化的GAM温度模型
解决GAM模型结合terra预测季节温度栅格的问题
你的报错原因很明确:GAM模型包含factor(season)自变量,但预测用的栅格仅提供了elevation,缺少季节变量。不需要单独为每个季节建模,只需为每个季节指定固定的因子值,即可生成对应季节的预测栅格,具体实现如下:
修正后的完整代码
library(terra) library(mgcv) # 加载示例数据 v <- vect(system.file("ex/lux.shp", package="terra")) r <- rast(system.file("ex/elev.tif", package="terra")) # 生成采样点并构造模拟数据 set.seed(50) pnts <- spatSample(v, size = 50) pnts_r <- terra::extract(r, pnts, method = "simple") pnts_r$temp <- sample(0:25, 50, replace = TRUE) # 定义季节列表 seasons <- c('winter', 'spring', 'summer', 'fall') # 为采样点分配季节 pnts_r$season <- seasons[seq_len(nrow(pnts_r)) %% length(seasons) + 1] # 构建包含季节因子的GAM模型 mod_gam <- mgcv::gam(temp ~ elevation + factor(season), data = pnts_r, family = gaussian(), method = "REML") # 为每个季节生成预测栅格 season_preds <- lapply(seasons, function(current_season) { # 使用const参数固定当前季节的因子值,传递给模型 terra::predict(r, mod_gam, const = list(season = current_season), type = "response") }) # 将多个季节的栅格合并为多波段栅格 season_temp_rast <- rast(season_preds) # 设置波段名称为对应季节 names(season_temp_rast) <- seasons # 查看结果 season_temp_rast
关键说明
const参数的作用:通过const可以给预测时的所有栅格单元统一设置常量变量值,这里就是每个季节对应的因子水平,完美解决了非空间因子变量的传递问题。- 多波段栅格输出:最终的
season_temp_rast包含4个波段,分别对应冬、春、夏、秋的温度预测结果,符合你的需求。 - 扩展到年际变化:后续如果加入年际变量(如
factor(year)),只需嵌套循环年份和季节,为每个年份-季节组合设置const = list(season = s, year = y),即可生成对应组合的预测栅格。
内容的提问来源于stack exchange,提问作者R Reid
相关产品推荐
相关产品推荐

