Следующий код оценивает сходство между двумя временными рядами:
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
используется для оценки того, как температура в Нью-Йорке и Майами отличается от средней температуры (в обоих местах) в разное время дня. Проблема, которая у меня сейчас есть, заключается в том, что мне нужно включить термин взаимодействия, который показывает, как температура каждого места меняется в течение дня в разные дни года. В конечном итоге я надеюсь отобразить всю эту информацию на одном графике (для каждого местоположения). Итак, для Майами я надеюсь иметь один график, который показывает, как температура меняется от среднего значения в разное время дня и в разное время года (трехмерный график?)
Ответы:
«A» в «gam» означает «аддитивный», что означает отсутствие взаимодействий, поэтому, если вы подходите к взаимодействиям, вы действительно больше не подходите к игровой модели.
Тем не менее, есть способы получить некоторые взаимодействия, такие как термины, в аддитивных терминах в игре, вы уже используете один из них, используя
by
аргумент tos
. Вы можете попытаться расширить это, чтобы аргументby
был матрицей с функцией (sin, cos) doy или tod. Вы также можете просто разместить сглаживающие сплайны в регулярной линейной модели, которая допускает взаимодействия (это не дает заднюю подгонку, которую делает игра, но все же может быть полезным).Вы могли бы также рассмотреть регрессию преследования проекции как другой подходящий инструмент. Лесс или более параметрические модели (с грехом и / или cos) также могут быть полезны.
Часть решения о том, какой инструмент (ы) использовать, - это вопрос, на который вы пытаетесь ответить. Вы просто пытаетесь найти модель, чтобы предсказать будущие даты и время? Вы пытаетесь проверить, значимы ли определенные предикторы в модели? Вы пытаетесь понять форму отношений между предиктором и результатом? Что-то другое?
источник
gam
by
Для двух непрерывных переменных вы можете делать то, что вы хотите (независимо от того, является ли это взаимодействие или нет, я оставлю других для обсуждения в соответствии с комментариями к ответу @ Greg's), используя:
Затем более простая модель должна быть вложена в более сложную модель, описанную выше. Эта более простая модель:
Обратите внимание на две вещи здесь:
Tod
ни для, ни междуDoy == 1
иDoy == 365.25
. Следовательно, подходят циклические кубические сплайны, обозначенные здесь черезbs = "cc"
.k = 5
). Это соответствует базовому измерению по умолчанию для каждого сглаживания вte()
терме.Вместе эти функции гарантируют, что более простая модель действительно вложена в более сложную модель.
Для получения дополнительной информации см.
?gam.models
В mgcv .источник
k
, следует ли также фиксировать количество узлов (напримерfx=TRUE
). Если нет, итоговая модель показывает различияedf
для каждого термина.s(Doy...)
и другоеs(Doy, by =Loc...)
? Я думал, что первый будет вложен в последний и, следовательно, будет необязательно указывать?m = 1
добавить к ним, чтобы наложить штраф на первую производную за сглаживание разницы.te()
, это зависит от того, что вы включаете в тензорный продукт? Взаимодействия, описанные здесь, являются факторно-гладкими взаимодействиями, ноte()
подразумевают две или более непрерывных переменных. Если вам нужны глобальные термины и предметно-специфические отклонения, тогда да,te(DoY, Year, by = Loc, m = 1)
можно использовать вместе с нимиte(DoY, Year)
, хотя есть и другие способы достижения аналогичных целей с использованием случайного эффекта, такого как фактор-гладкое взаимодействие, иte()
терминов, содержащих случайный сплайн эффекта.