首页 > 解决方案 > 从 GAM 预测 R 中分组数据帧的值

问题描述

我有一个不同年份不同纬度的年平均温度值数据集。我想用它来预测在给定年份可以找到给定温度的纬度;即,“在 1980 年,年平均温度在 20C 的纬度是多少?”

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

  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

我尝试了各种解决方案purrrsplit-apply-combine但没有弄清楚任何事情。有什么建议么?

标签: rapplypurrrgam

解决方案


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

gam(lat ~ year + s(temp, by = year), data = dat)

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

另一种方法是允许纬度/温度关系逐年平稳变化,如果这种关系随时间逐渐变化,这是一个合理的模型。在这种情况下,您将需要使用张量积 smooth ( te()) 来指示不同尺度(度、年)上的变量之间的双向交互:

gam(lat ~ te(temp, year), data = dat)

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


推荐阅读