如何在GAM中包含一个互动词?


24

以下代码评估两个时间序列之间的相似性:

set.seed(10)
RandData <- rnorm(8760*2)
America <- rep(c('NewYork','Miami'),each=8760)

Date = seq(from=as.POSIXct("1991-01-01 00:00"), 
           to=as.POSIXct("1991-12-31 23:00"), length=8760)

DatNew <- data.frame(Loc = America,
                     Doy = as.numeric(format(Date,format = "%j")),
                     Tod = as.numeric(format(Date,format = "%H")),
                     Temp = RandData,
                     DecTime = rep(seq(1, length(RandData)/2) / (length(RandData)/2),
                                   2))
require(mgcv)
mod1 <- gam(Temp ~ Loc + s(Doy) + s(Doy,by = Loc) +
  s(Tod) + s(Tod,by = Loc),data = DatNew, method = "ML")

在这里,gam用于评估纽约和迈阿密的温度与一天中不同时间(两个地点)的平均温度之间的差异。我现在遇到的问题是,我需要包括一个交互项,以显示每个位置的温度在一年中不同日期的一天中如何变化。我最终希望将所有这些信息显示在一张图上(针对每个位置)。因此,对于迈阿密,我希望有一张图表可以显示在一天中的不同时间和一年中的不同时间,温度与平均值的变化情况(3d图?)


2
您可能会发现此问题的答案stats.stackexchange.com/questions/18937/…相关。
jbowman

Answers:


18

“ gam”中的“ a”代表“加法”,表示没有交互,因此,如果您适合交互,则实际上不再适合gam模型。

就是说,有一些方法可以在gam中的附加项中获得某些交互作用,例如项,您已经通过使用byto参数来使用其中之一s。您可以尝试将其扩展为使参数为具有bydoy或tod函数(正弦,余弦)的矩阵。您也可以只在允许交互的常规线性模型中拟合平滑样条曲线(这不会像gam那样进行后向拟合,但仍然很有用)。

您可能还会将投影追踪回归视为另一个拟合工具。黄土或更参数化的模型(具有正弦和/或余弦)也可能有用。

使用哪种工具的部分决定是您要回答什么问题。您是否只是在寻找一种模型来预测未来的日期和时间?您是否要测试以查看特定预测变量在模型中是否重要?您是否要了解预测变量与结果之间关系的形式?还有吗


3
X1个X2
ÿ=F1个X1个+F2X2+F3X1个X2+ε
gam
ÿ=F1个X1个+F2X2+F3X1个X2+F4X2X1个+ε
by

1
@Macro,这取决于您是否要分开头发(从技术上讲,您写的可能是am,因为您并未真正使用g部分)。
格雷格·斯诺

2
@Macro,我敢肯定在这个问题上已经说了很多,但是请参阅此Venable的文章,线性模型的解释,关于GAM的第4页。尚不清楚如何同时识别出非加性主效应和相互作用效应。
Andy W

非常感谢您的评论。我的主要目的不是预测未来的价值,而是简单地了解每个时间序列与两个序列的均值之间的变化。例如,mod1的结果显示了每个位置的时间序列如何从平均值(Doy)然后在一天中的时间尺度(Tod)首先从均值变化。由此,我想看看每个序列如何随Doy和Tod的变化而变化,我希望在夏季,时间序列会有很大不同。
KatyB 2012年

2
@AndyW值得注意的是,自Venable对其发表评论以来,GAM已经走了很长一段路-过去十年左右的发展,是受罚花键sensu Simon Wood(在mgcv中实施),而完全贝叶斯的处理解决了诸如平滑度选择,交互作用以及如何在加性模型框架中拟合它们(边际基的张量积是一种方法)。我有理由相信维纳布尔的&考克斯的反对GAMS作为前者的概述Exegeses不得不很大程度上解决了这些在GAM理论的最新发展。
恢复莫妮卡-G.辛普森

25

对于两个连续变量,您可以使用以下方法做您想做的(无论是否是交互,我都会让其他人根据对@Greg的答复的意见进行讨论):

mod1 <- gam(Temp ~ Loc + s(Doy, bs = "cc", k = 5) + 
                         s(Doy, bs = "cc", by = Loc, k = 5, m = 1) + 
                         s(Tod, bs = "cc", k = 5) + 
                         s(Tod, bs = "cc", by = Loc, k = 5, m = 1) +
                         te(Tod, Doy, by = Loc, bs = rep("cc",2)),
            data = DatNew, method = "ML")

然后,应将较简单的模型嵌套在上述较复杂的模型中。这个简单的模型是:

mod0 <- gam(Temp ~ Loc + s(Doy, bs = "cc", k = 5) + 
                         s(Doy, bs = "cc", by = Loc, k = 5, m = 1) + 
                         s(Tod, bs = "cc", k = 5) + 
                         s(Tod, bs = "cc", by = Loc, k = 5, m = 1),
            data = DatNew, method = "ML")

请注意此处的两件事:

  1. 说明了每种平滑剂的基本类型。在这种情况下,我们希望有对23:59和00:00之间的温度没有间断Tod之间也不Doy == 1Doy == 365.25。因此,循环三次样条是合适的,通过表示bs = "cc"
  2. 基本维明确表示(k = 5)。这与te()术语中每个平滑的默认基础尺寸匹配。

这些功能共同确保了更简单的模型确实嵌套在更复杂的模型中。

欲了解更多见?gam.modelsmgcv


与第二点有关-除了的规范外k,还应确定打结的数量(例如fx=TRUE)。如果不是,则结果模型将显示edf每个术语的变化。
2015年

考虑到边际基数的样条,mgcv软件包中提供了一些新功能,我应该对此答案进行一些更新。也就是说,我不同意您需要确定样条曲线的自由度。关键是要确保模型的基础正确嵌套。然后,可以通过将基函数的一些系数设置为零来实现模型之间的差异,就像在使用非样条项的线性模型中那样。
恢复莫妮卡-G.辛普森

3
希望有人仍在关注此线程并可能回答。在这些模型中,为什么必须同时指定s(Doy...)s(Doy, by =Loc...)?我以为第一个嵌套在后者中,因此不需要指定吗?
ego_ '16

3
不,第一个平滑是全局函数,by平滑表示它与全局平滑之间特定于站点的差异。确实需要m = 1添加by平滑来将罚分加到一阶导数上,尽管差异平滑。
恢复莫妮卡-G.辛普森

2
@JoshuaRosenberg如果您的意思是te(),这取决于您在张量产品中包括什么?这里描述的交互是因子平滑的交互,但是te()将暗示两个或多个连续变量。如果您想要全局术语和特定于主题的偏差,te(DoY, Year, by = Loc, m = 1)可以使用yes,te(DoY, Year)尽管还有其他方法可以使用类似随机效应的因子-平滑交互作用和te()包含随机效应样条的术语来实现相似的目的。
恢复莫妮卡-G.辛普森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.