O código a seguir avalia a semelhança entre duas séries temporais:
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")
Aqui, gam
é usado para avaliar como a temperatura em Nova York e Miami varia da temperatura média (de ambos os locais) em diferentes momentos do dia. O problema que tenho agora é que preciso incluir um termo de interação que mostre como a temperatura de cada local varia ao longo do dia em diferentes dias do ano. Eventualmente, espero exibir todas essas informações em um gráfico (para cada local). Então, para Miami, espero ter um gráfico que mostre como a temperatura varia em relação à média em diferentes horários do dia e em diferentes épocas do ano (gráfico 3D?)
r
time-series
data-visualization
gam
KatyB
fonte
fonte
Respostas:
O "a" em "gam" significa "aditivo", o que significa que não há interações. Portanto, se você ajustar as interações, não estará mais adaptando um modelo de gam.
Dito isto, existem maneiras de obter alguma interação, como termos dentro dos termos aditivos em um gam, você já está usando um deles usando o
by
argumento paras
. Você pode tentar estender isso para que o argumentoby
seja uma matriz com uma função (sin, cos) de doy ou tod. Você também pode ajustar splines de suavização em um modelo linear regular que permita interações (isso não fornece o ajuste que o gam faz, mas ainda pode ser útil).Você também pode considerar a regressão de busca de projeção como outra ferramenta de ajuste. Modelos Loess ou mais paramétricos (com pecado e / ou cos) também podem ser úteis.
Parte da decisão sobre quais ferramentas usar é qual pergunta você está tentando responder. Você está apenas tentando encontrar um modelo para prever datas e horários futuros? você está tentando testar se determinados preditores são significativos no modelo? você está tentando entender a forma do relacionamento entre um preditor e o resultado? Algo mais?
fonte
gam
by
Para duas variáveis contínuas, você pode fazer o que quiser (seja uma interação ou não, deixarei outros discutirem conforme os comentários da resposta do @ Greg) usando:
O modelo mais simples deve ser aninhado no modelo mais complexo acima. Esse modelo mais simples é:
Observe duas coisas aqui:
Tod
nem entreDoy == 1
eDoy == 365.25
. Portanto, splines cúbicos cíclicos são apropriados, indicados aqui viabs = "cc"
.k = 5
). Isso corresponde à dimensão base padrão para cada suavização em umte()
termo.Juntos, esses recursos garantem que o modelo mais simples seja realmente aninhado no modelo mais complexo.
Para mais informações veja
?gam.models
em mgcv .fonte
k
, deve-se também fixar o número de nós (por exemplofx=TRUE
). Caso contrário, o modelo resultante mostra uma variaçãoedf
para cada termo.s(Doy...)
es(Doy, by =Loc...)
? Eu pensei que o primeiro seria aninhado no último e, portanto, não é necessário especificar?m = 1
adicionado a eles para aplicar a penalidade na primeira derivada pela diferença de smooths.te()
, depende do que você está incluindo no produto tensorial? As interações descritas aqui são interações fator-suave, maste()
implicariam duas ou mais variáveis contínuas. Se você deseja termos globais e desvios específicos de um assunto, sim,te(DoY, Year, by = Loc, m = 1)
pode ser usado em conjuntote(DoY, Year)
, embora existam outras maneiras de conseguir coisas semelhantes usando a interação fator-suave dete()
efeito aleatório e termos contendo um spline de efeito aleatório.