Estoy usando un GAM en R para comparar datos de series temporales de 3 países. Los conjuntos de datos son de mediciones por hora durante un año. El objetivo principal aquí es mostrar cuándo y en qué momento del día y día del año los datos coinciden bien con la serie media. El script a continuación muestra mi intento:
## Mediciones de ozono para tres países en Europa
## Encontrar similitudes entre series temporales
require(plyr)
require(lattice)
require(mgcv)
TopFolder <- list("http://www.nilu.no/projects/ccc/onlinedata/ozone/CZ03_2009.dat"
,"http://www.nilu.no/projects/ccc/onlinedata/ozone/CY02_2009.dat"
,"http://www.nilu.no/projects/ccc/onlinedata/ozone/BE35_2009.dat"
)
## crear variable para los datos
data = ldply(TopFolder, header = TRUE, read.table, sep = "", skip = 3)
## definir niveles de ozono
Ozone <- data$Value
Ozone[Ozone==-999] <- NA
Ozone <- data.frame(Ozone)
## definir FechaHora - necesario concatenar arrays
DateTime <- paste(data$Date,data$Hour, sep = " ")
Date <- as.POSIXct(DateTime, format = "%d.%m.%Y %H:%M")
## definir países
Countries <- c("Czech","Cyprus","Belgium")
Country <- data.frame(Country = rep(Countries, each = 8760))
## unir
Dat <- cbind(Ozone, Country = Country)
Dat <- transform(Dat, Doy = as.numeric(format(Date,format = "%j")),
Tod = as.numeric(format(Date,format = "%H")),
DecTime = rep(seq(1,365, length = 8760),by = 3))
## plotear los datos de ozono
xyplot(Ozone~DecTime | Country, data = Dat, type = "l", col = 1,
strip = function(bg = 'white',...)strip.default(bg = 'white',...))
## modelo aditivo generalizado
mod1 <- gam(Ozone ~ Country + s(Doy,bs = "cc", k = 20) + s(Doy, by = Country, bs = "cc", k = 20) +
s(Tod,bs = "cc", k=7) + s(Tod,by = Country,bs = "cr", k=7),
data = Dat, method = "ML")
plot(mod1,pages=1,scale=0,shade=TRUE)
xyplot(resid(mod1) ~ Doy | Country, data = Dat, type = c("l","smooth"))
mod2 <- gamm(Ozone ~ Country + s(Doy,bs = "cc", k = 20) + s(Doy, by = Country, bs = "cc", k = 20) +
s(Tod,bs = "cc", k=7) + s(Tod,by = Country,bs = "cr", k=7),
data = Dat, method = "ML",correlation = corAR1(form = ~ DecTime | Country))
Uno de los problemas es que estoy usando un modelo aditivo con errores correlacionados es decir, en cada serie temporal de mediciones por hora, una alta concentración es seguida por otra alta concentración. Esto se puede abordar agregando una matriz de correlación al GAM:
Sin embargo, R muestra un error ya que no puede obtener más RAM del sistema operativo. Por lo tanto, para abordar esto necesito: (1) de mod1 - ajustar un modelo de series temporales (mod3) a los residuos (2) obtener el acf(1) de mod3 (2) usar el acf(1) para construir una matriz de covarianza que luego podemos pasar a mod2 simplificando así la matriz de correlación.
Cualquier consejo sobre cómo completar alguno o todos los tres pasos anteriores sería muy apreciado. Aunque creo que el primer punto del que no estoy seguro es cómo extraer los residuos para los diferentes países en mod1?