从GAM预测R中分组数据帧的值

AFH*_*AFH 6 r apply gam purrr

我有一个不同年份不同纬度的年平均温度值的数据集。我想用它来预测在一年中可以找到给定温度的纬度;也就是说,“在1980年,在什么纬度下,年平均气温为20摄氏度?”

我需要为此使用特定年份的模型,因为纬度和温度之间的关系随时间而改变(尽管下面的示例数据中并未随机生成)。这将涉及:

  1. 将GAM拟合到按年份分组/拆分的数据集。
  2. 对于每个不同的GAM(即每年),用于predict.gam计算温度列表中每个元素的预测值。
  3. 重新组合这些数据,以得到一个数据框,其中的列分别代表yearnewdata_value (用于预测的温度值)和predicted_value(将其馈newdata_value入特定年份的GAM中的纬度)。

这是一个玩具数据集:

years <- seq(1968, 2018, 1)
lat <- seq(34.5, 44.5, 1)
dat <- expand.grid(years, lat)
names(dat) <- c("years","lat")
dat$temp <- runif(dim(dat)[1], 5, 20) # add random temperature data points 
newdata_values <- seq(2, 16, 2) # temperature values to use for prediction
Run Code Online (Sandbox Code Playgroud)

我已经试过各种purrrsplit-apply-combine解决方案,也没有想通什么了。有什么建议么?

Noa*_*oss 5

另一种选择是拟合允许纬度/温度关系随年份变化的模型。有几种选择。以下是每年都有独立关系的模型:

gam(lat ~ year + s(temp, by = year), data = dat)
Run Code Online (Sandbox Code Playgroud)

注意,对于此公式,year应将其编码为一个因子。

一种替代方法是允许纬度/温度关系逐年平滑变化,如果这种关系随时间逐渐变化,则可以采用合理的模型。在这种情况下,您将需要使用张量积smoothte())来表示不同尺度(度,年)的变量之间的双向交互作用:

gam(lat ~ te(temp, year), data = dat)
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,您都可以使用进行预测predict.gam(model, newdata = new_dat),其中同时new_dat具有yeartemp列。