El siguiente código evalúa la similitud entre dos series de tiempo:
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")
Aquí, gam
se utiliza para evaluar cómo la temperatura en Nueva York y Miami varía de la temperatura media (de ambos lugares) en diferentes momentos del día. El problema que tengo ahora es que necesito incluir un término de interacción que muestre cómo la temperatura de cada ubicación varía a lo largo del día para diferentes días del año. Eventualmente espero mostrar toda esta información en un gráfico (para cada ubicación). Entonces, para Miami, espero tener un gráfico que muestre cómo la temperatura varía de la media durante diferentes momentos del día y diferentes momentos del año (¿trama 3d?)
r
time-series
data-visualization
gam
KatyB
fuente
fuente
Respuestas:
La "a" en "gam" significa "aditivo", lo que significa que no hay interacciones, por lo que si se ajustan a las interacciones, realmente ya no se ajusta a un modelo de gam.
Dicho esto, hay formas de obtener cierta interacción como términos dentro de los términos aditivos en un juego, ya está utilizando uno de esos mediante el
by
argumento tos
. Podría intentar extender esto para que el argumentoby
sea una matriz con una función (sin, cos) de doy o tod. También podría ajustar las splines de suavizado en un modelo lineal regular que permita interacciones (esto no proporciona el backfitting que hace gam, pero aún podría ser útil).También puede considerar la regresión de búsqueda de proyección como otra herramienta de ajuste. Loess o más modelos paramétricos (con sin y / o cos) también pueden ser útiles.
Parte de la decisión sobre qué herramienta (s) usar es qué pregunta está tratando de responder. ¿Estás tratando de encontrar un modelo para predecir fechas y horas futuras? ¿Está tratando de probar para ver si predictores particulares son significativos en el modelo? ¿Estás tratando de entender la forma de la relación entre un predictor y el resultado? ¿Algo más?
fuente
gam
by
Para dos variables continuas, puede hacer lo que quiera (ya sea que se trate de una interacción o no, dejaré que otros discutan según los comentarios a la respuesta de @ Greg) usando:
El modelo más simple se debe anidar dentro del modelo más complejo anterior. Ese modelo más simple es:
Tenga en cuenta dos cosas aquí:
Tod
ni entreDoy == 1
yDoy == 365.25
. Por lo tanto, las splines cúbicas cíclicas son apropiadas, indicadas aquí a través debs = "cc"
.k = 5
). Esto coincide con la dimensión base predeterminada para cada suavizado en unte()
término.Juntas, estas características aseguran que el modelo más simple realmente esté anidado dentro del modelo más complejo.
Para más información ver
?gam.models
en mgcv .fuente
k
, ¿también se debe corregir el número de nudos (por ejemplofx=TRUE
)? Si no, el modelo resultante muestra variacionesedf
para cada término.s(Doy...)
ys(Doy, by =Loc...)
? Pensé que el primero estaría anidado en el segundo y, por lo tanto, no sería necesario especificarlo.m = 1
embargo, los suavizadores de by realmente necesitan agregarse para poner la penalización en la primera derivada de los suavizados de diferencia.te()
, ¿depende de lo que esté incluyendo en el producto tensor? Las interacciones descritas aquí son interacciones de factor suave, perote()
implicarían dos o más variables continuas. Si desea términos globales y desviaciones específicas del tema, entonces sí,te(DoY, Year, by = Loc, m = 1)
podría usarse juntote(DoY, Year)
, aunque hay otras formas de lograr cosas similares usando una interacción suave de factor de efecto aleatorio yte()
términos que contienen una spline de efecto aleatorio.