Как определить нелинейное взаимодействие двух факторных переменных в обобщенных аддитивных моделях [R]
У меня есть набор данных временных рядов, который содержит переменную результата, которая является непрерывной и два факторных предиктора (один с 6 уровнями и один с 2 уровнями).
Я хотел бы смоделировать нелинейное взаимодействие двух факторных переменных на непрерывной переменной.
Это модель, которую я имею до сих пор (из-за ограничений авторских прав на данные, я использую подмножество набора данных):
library(mgcv)
load(url("http://ftp.stefanocoretta.altervista.org/documents/df.RData"))
model <- bam(
outcome ~
factor_1 + factor_2 +
s(time, k = 9) +
s(time, by = factor_1, k = 9) +
s(time, by = factor_2, k = 9),
data = df
)
summary(model)
Family: gaussian
Link function: identity
Formula:
outcome ~ factor_1 + factor_2 + s(time, k = 9) + s(time, by = factor_1,
k = 9) + s(time, by = factor_2, k = 9)
Parametric coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2612.72 23.03 113.465 <2e-16 ***
factor_1b 33.19 27.00 1.229 0.22
factor_2z -488.52 27.00 -18.093 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Approximate significance of smooth terms:
edf Ref.df F p-value
s(time) 2.564 3.184 6.408 0.000274 ***
s(time):factor_1b 1.000 1.001 0.295 0.587839
s(time):factor_2z 2.246 2.792 34.281 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
R-sq.(adj) = 0.679 Deviance explained = 69.1%
fREML = 1359.6 Scale est. = 37580 n = 207
Теперь я хотел бы добавить нелинейное взаимодействие factor_1
а также factor_2
с time
для эффекта на outcome
, так что сглаживатели в каждой комбинации могут отличаться (например: factor_2
имеет более сильный нелинейный эффект для некоторых уровней factor_1
). Что-то вроде s(time, factor_1, factor_2)
или же s(time, factor_1, by = factor_2)
не работает.
1 ответ
Включая взаимодействие двух факторов с использованием interaction()
кажется, делает работу.
library(mgcv)
load(url("http://ftp.stefanocoretta.altervista.org/documents/df.RData"))
model <- bam(
outcome ~
factor_1 + factor_2 +
s(time, k = 9) +
s(time, by = factor_1, k = 9) +
s(time, by = factor_2, k = 9) +
s(time, by = interaction(factor_1, factor_2), k = 9),
data = df
)