2011-02-11 12 views
9

Estoy usando R para algunos análisis estadísticos de series temporales. He intentado buscar en Google, pero parece que no puedo encontrar ninguna respuesta definitiva. ¿Alguien que sepa más, por favor, apúntame en la dirección correcta?¿Cuál es la mejor práctica de manejar series de tiempo en R?

Ejemplo:

Digamos que quiero hacer una regresión lineal de dos series de tiempo. Las series de tiempo contienen datos diarios, pero puede haber lagunas aquí y allá, por lo que las series de tiempo no son regulares. Naturalmente, solo quiero comparar puntos de datos donde ambas series de tiempo tienen datos. Esto es lo que hago actualmente para leer los archivos CSV en una trama de datos:

library(zoo) 
apples <- read.csv('/Data/apples.csv', as.is=TRUE) 
oranges <- read.csv('/Data/oranges.csv', as.is=TRUE) 
apples$date <- as.Date(apples$date, "%d/%m/%Y") 
oranges$date <- as.Date(oranges$date, "%d/%m/%Y") 
zapples <- zoo(apples$close,apples$date) 
zoranges <- zoo(oranges$close,oranges$date) 
zdata <- merge(zapples, zoranges, all=FALSE) 
data <- as.data.frame(zdata) 

¿Hay una manera más pulido de hacer esto?

Además, ¿cómo puedo cortar los datos, por ejemplo, seleccionar las entradas en data con fechas dentro de un período determinado?

+2

El código no es del todo correcto, y no tenemos sus archivos csv ... ¿tal vez algunos datos ficticios? –

+0

He reparado los errores tipográficos en el código. Pero realmente no puedo ver el punto en los datos ficticios. Simplemente tome cualquier dato aleatorio y póngalo en dos columnas de archivo csv y nombre una fecha de columna y la otra cerca. – c00kiemonster

+9

La razón es que su pregunta no se considera de baja calidad y para que los que responden puedan ejecutar fácilmente el código y los respondedores múltiples todos la ejecutan usando la misma entrada. Dado que esto es algo que puede hacer usted mismo sin saber la respuesta a la pregunta, generalmente se considera su responsabilidad proporcionar esto. –

Respuesta

11

Pruebe algo en esta línea. Esto supone que las fechas están en la columna 1. El paquete dyn se puede usar para transformar lm, glm y muchas funciones de tipo de regresión similares a las que aceptan series de zoológico. Escribe dyn$lm en lugar de lm como se muestra:

library(dyn) # also loads zoo 
fmt <- "%d/%m/%Y" 
zapples <- read.zoo('apples.csv', header = TRUE, sep = ",", format = fmt) 
zoranges <- read.zoo('oranges.csv', header = TRUE, sep = ",", format = fmt) 
zdata <- merge(zapples, zoranges) 
dyn$lm(..whatever.., zdata) 

No es necesario all = FALSE desde lm ignorará las filas con AN bajo la configuración por defecto de su argumento na.action.

La función window.zoo se puede utilizar para cortar datos.

Dependiendo de lo que quieras hacer, es posible que también quieras consultar los paquetes xts y quantmod.

+0

No tenía ni idea sobre el paquete dyn, muy agradable. – c00kiemonster

+1

+1 para el paquete dyn –

6

¿Por qué convirtió ambos marcos de datos a zoo y luego fusionó y convirtió nuevamente al marco de datos? Si desea un marco de datos, simplemente ejecute esta línea después de su read.csv().

data <- merge(apples, oranges, by = "date") 

Y aquí está cómo subconjunto.

subset(data, date < slicemax & date > slicemin) 
Cuestiones relacionadas