Subconjunto de vetores de séries temporais R

25

Eu tenho uma série temporal e quero subconjunto, mantendo-a como uma série temporal, preservando o início, o fim e a frequência.

Por exemplo, digamos que eu tenha uma série temporal:

> 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     

Agora eu irei configurá-lo:

> qs[time(qs) >= 2010 & time(qs) < 2011]
[1] 104 105 106 107

Observe que obtive os resultados corretos, mas perdi os "invólucros" da série temporal (ou seja, início, fim, frequência).

Estou procurando uma função para isso. Não é um subconjunto de séries temporais um cenário comum? Como ainda não encontrei uma, aqui está uma função que escrevi:

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))
}

Eu gostaria de ouvir sobre melhorias ou maneiras mais limpas de fazer isso. Em particular, não gosto da maneira como codifico o início e o fim. Prefiro permitir que o usuário especifique uma condição booleana arbitrária.

David J.
fonte

Respostas:

34

Use a windowfunção:

> window(qs, 2010, c(2010, 4))
     Qtr1 Qtr2 Qtr3 Qtr4
2010  104  105  106  107
Shane
fonte
2
Observe também que a janela (qs, 2010, c (2010, 4)) <- 3 alterará os qs de acordo.
mpiktas
6

Também é útil, se você estiver combinando várias séries temporais e não quiser precisar de windowcada uma delas para que correspondam ts.unione ts.intersect.

hgcrpd
fonte