Como amostrar novamente uma série temporal do XTS no R?


9

Eu tenho uma XTSsérie temporal irregularmente espaçada (com POSIXctvalores como tipo de índice).

Como criar uma nova série temporal amostrada em um intervalo de 10 minutos, digamos, mas com cada momento da amostra alinhado a um tempo redondo (13:00:00, 13:10:00, 13:20:00, ...) . Se um momento de reamostragem não cair exatamente em um valor de série original, quero pegar o anterior.


Você poderia dar um exemplo?
Joshua Ulrich

2
Se alguma vez houve uma lista de FAQs para xts, isso teria uma pontuação alta. Por favor, olhe por aqui, pesquise [r] xtse examine os arquivos do r-sig-finance.
Dirk Eddelbuettel

Respostas:


5
library(xts)
?endpoints

Por exemplo

tmp=zoo(rnorm(1000), as.POSIXct("2010-02-1")+(1:1000)*60)
tmp[endpoints(tmp, "minutes", 20)]

subamostrar a cada 20 minutos. Você também pode querer verificar para fora to.minutes, to.dailyetc.


Existe apenas um pequeno problema - se eu tiver ..., 14:59, 15:00, ..., ele recuperará 14:59 e não 15:00 como eu gostaria. Existe uma maneira de fazê-lo retornar 15:00? Eu tentei algo parecido "seconds", 3601, mas ele não funciona
Meh

Como os carimbos de data / hora são irregulares, só é possível garantir garantias no intervalo entre pontos de dados. Os pontos reais dependem do ponto inicial da série. Se você fixar seu ponto de partida em uma hora redonda, ele se comportará como você gosta ... (supondo que você tenha pontos a cada N minutos)
Dr. G

Isto é exatamente o que eu não quero - sendo dependente do primeiro ponto
Meh

2

Ainda não tenho certeza do que você está tentando fazer e ainda acho que um exemplo ajudaria, mas achei que poderia estar interessado align.time.

# Compare this:
tmp[endpoints(tmp, "minutes", 20)]
# with this:
align.time( tmp[endpoints(tmp, "minutes", 20)], n=60*20 )

Considere qualquer série temporal - temperatura externa. Quero saber qual é a temperatura às 11:00, relógio de parede, 12:00, relógio de parede, .... Vou verificar seu exemplo mais tarde para ver se ele faz isso
Meh

Até onde eu sei, essa aplicação de align.time após o uso de endpoints é o que Adal queria (além de mencionar a menção de usar "o anterior" na pergunta original). Enfim, é o que eu queria, então obrigado, Joshua.
Rahul Savani

Existe uma versão do align.time, mas para arredondar para baixo, não para cima? Também faz exatamente o que eu quero, mas para isso. (BTW, eu tenho uma maneira bruta: se a1 é meus XTS objeto e eu quero descer rodada para intervalos de um minuto, em seguida, index(a1)=index(a1)-60;align.time(a1,60))
Darren Cozinhe

11
@ DarrenCook: Não existe uma versão align.timedisso que faça isso. Independentemente disso, parece uma má idéia alinhar as observações com um tempo anterior à sua ocorrência.
Joshua Ulrich

2
@JoshuaUlrich Um exemplo é a conversão de ticks financeiros em um bar. 08:00 representa o minuto de 08:00:00 a 08:00:59. 08:00 como uma barra horária representa 08:00:00 para 08:59:59. (Ele é consistente com o funcionamento das barras diárias, onde 25/11/2011 representa a negociação em 25/11/2011 e não em 24/11/2011.) Acho que esse era o mesmo comportamento que o OP desejava.
Darren Cozinhe

1

Se afor um objeto xts com entradas para a segunda resolução, isso interrompe todos os segundos: index (a) = trunc (index (a), "mins")

Você também pode usar isso para arredondar para a resolução "horas" também. Mas 10 minutos não são suportados. Para isso você tem que fazer o seguinte:

x=as.POSIXlt(index(a))
x$sec[]=0;x$min[]=x$min[]%/%10
index(a)=x

Ou a=align.time.down(a,600)onde você definiu:

align.time.down=function(x,n){index(x)=index(x)-n;align.time(x,n)}

(fui com essa última opção no meu próprio script.)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.