2012-05-05 15 views
13

Estoy tratando de extraer estadísticas interesantes para un conjunto de datos de series temporales irregulares, pero no puedo encontrar las herramientas adecuadas para el trabajo. Las herramientas para manipular series de tiempo regularmente muestreadas o series basadas en índices de cualquier momento son bastante fáciles de encontrar, aunque no estoy teniendo mucha suerte con los problemas que intento resolver.Intervalos de tiempo de deslizamiento para datos de series de tiempo en R

En primer lugar, un conjunto de datos reproducible:

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) 

asumir los tiempos están en segundos. Hay casi 1700 segundos (apenas cerca de 30 minutos) en la serie vecZ, y 5001 entradas durante ese tiempo. (NB:. Me gustaría probar usando xts, pero xts parece necesitar información de la fecha, y preferiría no haría uso de una fecha en particular cuando no es relevante)

Mis objetivos son los siguientes:

  • Identifique los índices de los valores 3 minutos antes y 3 minutos después de cada punto. Como los tiempos son continuos, dudo que dos puntos sean precisamente de 3 minutos de diferencia. Lo que me gustaría encontrar son los puntos que se encuentran en la mayoría de los 3 minutos antes, y al menos 3 minutos después, el punto dado, es decir, algo así como lo siguiente (en pseudocódigo):

    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}

    Entonces, durante 3 minutos, tDelta = 180. Si t=2500, el resultado para forwardIX() sería 3012 (es decir, el tiempo (vecZ) [2500] es 860.1462, y el tiempo (vecZ) [3012] es 1040.403, o poco más de 180 segundos más tarde), y la salida de backwardIX() sería 2020 (correspondiente al tiempo 680.7162 segundos).

    Idealmente, me gustaría utilizar una función que no requiere t, ya que va a requerir length(vecZ) llamadas a la función, que ignora el hecho de que las ventanas correderas de tiempo se pueden calcular de manera más eficiente.

  • Aplicar una función a todos los valores en un intervalo de tiempo continuo. He visto rollapply, que toma un tamaño de ventana fijo (es decir, un número fijo de índices, pero no un intervalo de tiempo fijo). Puedo resolver esto de la manera ingenua, con un bucle (o foreach ;-)) que se calcula por índice t, pero me preguntaba si ya hay algunas funciones simples implementadas, p. una función para calcular la media de todos los valores en un marco de tiempo dado. Dado que esto se puede hacer de manera eficiente mediante simples estadísticas de resumen que se deslizan sobre una ventana, debería ser computacionalmente más económico que una función que accede a todos los datos varias veces para calcular cada estadística. Algunas funciones bastante naturales: media, mínima, máxima y mediana.

    Incluso si la ventana no varía con el tiempo, la capacidad de variar el tamaño de la ventana sería adecuada, y puedo encontrar ese tamaño de ventana usando el resultado de la pregunta anterior. Sin embargo, eso todavía parece requerir cálculos en exceso, por lo que ser capaz de especificar intervalos basados ​​en el tiempo parece más eficiente.

¿Hay paquetes en I que facilitan este tipo de manipulaciones de datos en ventanas de tiempo, o estoy fuera de suerte y que debería escribir mis propias funciones?


Nota 1: This question pretende hacer algo similar, excepto durante intervalos disjuntos, en lugar de rodar ventanas de tiempo, por ejemplo,Podría adaptar esto para hacer mi análisis en cada bloque sucesivo de 3 minutos, pero no veo una manera de adaptar esto para intervalos de 3 minutos.

Nota 2: Descubrí que el cambio de un objeto zoo a un vector numérico (por los tiempos) ha acelerado significativamente el problema de la identificación de rango/punto final de ventana para el primer objetivo. Eso sigue siendo un algoritmo ingenuo, pero vale la pena mencionar que trabajar con objetos zoo puede no ser óptimo para el enfoque ingenuo.

+0

Creo 'xts' es probablemente el camino a seguir. Ver '? Endpoints','? To.period', '? Period.apply' y'? Split.xts'. Haga coincidir su objeto con xts como este: 'x <- .xts (vecVals, vecTimes)' – GSee

+0

@GSee Gracias, aunque me parece que esas funciones dividen los datos en intervalos sucesivos e inconexos (como se menciona en la nota que adjunté a la pregunta). Si hay una manera de hacer ventanas deslizantes/rodantes de tiempo, todavía no he descubierto cómo hacer que 'xts' haga eso. – Iterator

+0

puede fusionar con un objeto xts estrictamente regular de cero ancho y 'na.locf' para que sus datos sean estrictamente regulares. Luego usa 'rollapply' – GSee

Respuesta

1

Aquí es lo que estaba suggeting, pero no estoy seguro de que exactamente responde a su pregunta

#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 
Cuestiones relacionadas