2012-05-05 5 views
13

Sto cercando di estrarre statistiche interessanti per un set di dati di serie temporali irregolari, ma in arrivo a breve su come trovare gli strumenti giusti per il lavoro. Gli strumenti per la manipolazione di serie storiche regolarmente campionato o una serie di indice a base di ogni tempo sono abbastanza facili da trovare, anche se io non sto avendo molta fortuna con i problemi che sto cercando di risolvere.scorrevoli intervalli di tempo per i dati di serie storiche in R

In primo luogo, un insieme di dati riproducibili:

library(zoo) 
set.seed(0) 
nSamples <- 5000 
vecDT  <- rexp(nSamples, 3) 
vecTimes <- cumsum(c(0,vecDT)) 
vecDrift <- c(0, rnorm(nSamples, mean = 1/nSamples, sd = 0.01)) 
vecVals  <- cumsum(vecDrift) 
vecZ  <- zoo(vecVals, order.by = vecTimes) 
rm(vecDT, vecDrift) 

supponga i tempi sono in secondi. Ci sono quasi 1700 secondi (poco meno di 30 minuti) nella serie vecZ e 5001 durante quel periodo. (NB:. Mi piacerebbe provare utilizzando xts, ma xts sembra aver bisogno di informazioni aggiornate, e io non preferisco usare una data particolare quando non è rilevante)

I miei obiettivi sono i seguenti:

  • Identificare gli indici dei valori 3 minuti prima e 3 minuti dopo ciascun punto. Poiché i tempi sono continui, dubito che due punti qualsiasi siano esattamente a 3 minuti di distanza. Quello che mi piacerebbe trovare sono i punti che sono al massimo 3 minuti prima, e almeno 3 minuti dopo, il punto dato, vale a dire qualcosa di simile a quanto segue (in pseudocodice):

    backIX(t, vecZ, tDelta) = min{ix in length(vecZ) : t - time(ix) < tDelta} forwardIX(t, vecZ, tDelta) = min{ix in length(vecZ) : time(ix) - t > tDelta}

    Quindi, per 3 minuti, tDelta = 180. Se t=2500, il risultato per forwardIX() sarebbe 3012 (ovvero il tempo (vecZ) [2500] è 860.1462 e il tempo (vecZ) [3012] è 1040.403, o poco più di 180 secondi dopo) e l'uscita di backwardIX() sarà 2020 (corrispondente al tempo 680,7162 secondi).

    Idealmente, mi piacerebbe utilizzare una funzione che non richiede t, in quanto ciò richiederà le chiamate length(vecZ) alla funzione, che ignora il fatto che è possibile calcolare in modo più efficiente finestre di tempo scorrevoli.

  • applicare una funzione a tutti i valori in una finestra di tempo di laminazione. Ho visto rollapply, che richiede una dimensione fissa finestra (cioè numero fisso di indici, ma non una finestra fissa di tempo). Posso risolvere questo il modo naif, con un anello (o foreach ;-)) che è calcolato per indice t, ma chiesti se ci sono alcune semplici funzioni già implementate, ad esempio una funzione per calcolare la media di tutti i valori in un dato intervallo di tempo. Dal momento che questo può essere fatto in modo efficiente tramite semplici statistiche riassuntive che scorrono su una finestra, dovrebbe essere computazionalmente più conveniente di una funzione che accede a tutti i dati più volte per calcolare ogni statistica. Alcune funzioni abbastanza naturali: media, min, max e mediana.

    Anche se la finestra non varia in base al tempo, la possibilità di variare le dimensioni della finestra sarebbe adeguata e posso trovare quella dimensione della finestra utilizzando il risultato della domanda precedente. Tuttavia, sembra che ancora richieda calcoli in eccesso, quindi essere in grado di specificare intervalli basati sul tempo sembra più efficiente.

Ci sono pacchetti in R che facilitano tali manipolazioni di dati in finestre temporali, o sono sfortunato e dovrei scrivere le mie proprie funzioni?


Nota 1: This question cerca di fare qualcosa di simile, tranne che su intervalli disgiunti, piuttosto che a rotazione le finestre di tempo, per esempioPotrei adattarlo per fare la mia analisi su ogni blocco successivo di 3 minuti, ma non vedo un modo per adattarlo a intervalli di 3 minuti.

Nota 2: Ho notato che il passaggio da un oggetto zoo a un vettore numerico (per le volte) ha velocizzato in modo significativo il problema dell'identificazione dell'endpoint di intervallo/finestra per il primo obiettivo. Questo è ancora un algoritmo ingenuo, ma vale la pena ricordare che lavorare con gli oggetti zoo potrebbe non essere ottimale per l'approccio ingenuo.

+0

penso 'xts' è probabilmente la strada da percorrere. Vedi '? Endpoints','? To.period', '? Period.apply' e'? Split.xts'. Costruisci il tuo oggetto in xts come questo: 'x <- .xts (vecVals, vecTimes)' – GSee

+0

@GSee Grazie, anche se mi sembra che quelle funzioni suddividano i dati in intervalli successivi e disgiunti (come menzionato nella nota che ho aggiunto a la domanda). Se c'è un modo per rendere scorrevoli/scorrevoli finestre di tempo, non ho ancora capito come fare 'xts' farlo. – Iterator

+0

si può fondere con un oggetto xts strettamente regolare a larghezza zero e 'na.locf' per ottenere che i dati siano strettamente regolari. Quindi usa 'rollapply' – GSee

risposta

1

Ecco quello che stavo suggeting, ma io non sono sicuro che risponde esattamente alla tua domanda

#Picking up where your code left off 
library(xts) 
library(TTR) 
x <- .xts(vecZ, vecTimes) 
xx <- na.locf(cbind(xts(, seq.POSIXt(from=start(x), to=end(x), by='sec')), x)) 
x$means <- runMean(xx, n=180) 
out <- x[!is.na(x[, 1]), ] 
tail(out) 

            x  means 
1969-12-31 18:28:17.376141 0.2053531 0.1325938 
1969-12-31 18:28:17.379140 0.2101565 0.1329065 
1969-12-31 18:28:17.619840 0.2139770 0.1332403 
1969-12-31 18:28:17.762765 0.2072574 0.1335843 
1969-12-31 18:28:17.866473 0.2065790 0.1339608 
1969-12-31 18:28:17.924270 0.2114755 0.1344264