GAMM 的季节性数据

机器算法验证 广义加法模型
2022-03-20 08:55:06

我有兴趣对几年内的温度数据时间序列进行建模。数据是每小时观察的水平,所以我有年、月、日和时间的变量。

我发现了 Gavin Simpson 的一个很好的例子(在这里找到)。该博客仅考虑一年内的相关性,而我必须处理一年内和一天内的相关性。

我怎样才能最好地解释与 gamm 的这种相关性?加文使用以下代码

modar2 <- gamm(apparentTemperature ~ s(month, bs = "cc", k = 12) + s(time, k = 20),data = timetemp, correlation = corARMA(form = ~ 1|year, p = 2),control = ctrl)

我应该在哪里传递变量来解释一天内的相关性?

作为参考,这是我的数据示例:

tibble::tribble(
               ~created_at,            ~time, ~month, ~year, 
~apparentTemperature,
     "2014-01-03 09:30:28",              9.5,      1,  2014,               -17.87,
     "2014-01-03 10:13:43", 10.2166666666667,      1,  2014,               -17.87,
     "2014-01-03 12:19:32", 12.3166666666667,      1,  2014,               -16.14,
     "2014-01-03 12:44:04", 12.7333333333333,      1,  2014,               -20.24,
     "2014-01-03 13:09:38",            13.15,      1,  2014,               -20.24,
     "2014-01-03 13:39:00",            13.65,      1,  2014,               -20.44
     )
1个回答

取决于您希望如何在几天内嵌套自相关?

modar2 <- gamm(apparentTemperature ~ s(year) + s(month, bs = "cc", k = 12) +
               s(time, k = 20), data = timetemp,
               correlation = corARMA(form = ~ 1|day, p = 2),
               control = ctrl)

将具有平滑的长期趋势、平滑的季节性效应、平滑的时间效应,自相关嵌套在几天内(为此,您需要创建一个新变量,该变量day从日期时间变量生成一年中的某一天。

如果你有很多数据,你真的不想使用form = ~ obs_seq相关结构,其中obs_seq是序列 1、2、...、观察次数,因为这将创建一个lme()需要反转的大量协方差矩阵在每次迭代中。将这样的模型拟合到高频数据后,需要gamm()一周时间才能汇聚到功能强大的多核工作站上。

在该示例中,我将相关性嵌套在 year 内的部分原因是出于这个原因;这是一个很长的月度记录,并且在所有时间点上拟合完整的 ARMA 函数并不快。