Tengo una serie de tiempo y quiero subgrupo mientras la mantengo como una serie de tiempo, preservando el inicio, el final y la frecuencia.
Por ejemplo, digamos que tengo una serie de tiempo:
> qs <- ts(101:110, start=c(2009, 2), frequency=4)
> qs
Qtr1 Qtr2 Qtr3 Qtr4
2009 101 102 103
2010 104 105 106 107
2011 108 109 110
Ahora lo subconjunto:
> qs[time(qs) >= 2010 & time(qs) < 2011]
[1] 104 105 106 107
Tenga en cuenta que obtuve los resultados correctos, pero perdí los "envoltorios" de la serie de tiempo (es decir, inicio, final, frecuencia).
Estoy buscando una función para esto. ¿No es un subconjunto de series de tiempo un escenario común? Como todavía no he encontrado uno, aquí hay una función que escribí:
subset.ts <- function(data, start, end) {
ks <- which(time(data) >= start & time(data) < end)
vec <- data[ks]
ts(vec, start=start(data) + c(0, ks[1] - 1), frequency=frequency(data))
}
Me gustaría escuchar sobre mejoras o formas más limpias de hacer esto. En particular, no me gusta la forma en que codifico el inicio y el final. Prefiero dejar que el usuario especifique una condición booleana arbitraria.
fuente
También es útil, si está combinando varias series de tiempo y no quiere tener que tener
window
cada una para que coincidan,ts.union
yts.intersect
.fuente