una tiempo studio serie regresion moviles medias lineal diferenciacion curso con ajustar r time-series

studio - series de tiempo en r



RemodelaciĆ³n de datos de series de tiempo de formato ancho a alto(para el trazado) (5)

De la página de ayuda tidyr se reúnen

Ejemplos

library(tidyr) library(dplyr) # From http://stackoverflow.com/questions/1181060 stocks <- data.frame( time = as.Date(''2009-01-01'') + 0:9, X = rnorm(10, 0, 1), Y = rnorm(10, 0, 2), Z = rnorm(10, 0, 4) ) gather(stocks, stock, price, -time) stocks %>% gather(stock, price, -time)

Esta pregunta ya tiene una respuesta aquí:

Tengo un marco de datos que contiene varias series temporales de devoluciones, almacenadas en columnas.

La primera columna contiene fechas, y las columnas subsiguientes son series de tiempo independientes, cada una con un nombre. Los encabezados de las columnas son los nombres de las variables.

## I have a data frame like this t <- seq(as.Date(''2009-01-01''),by=''days'',length=10) X <- rnorm(10,0,1) Y <- rnorm(10,0,2) Z <- rnorm(10,0,4) dat <- data.frame(t,X,Y,Z) ## which appears as t X Y Z 1 2009-01-01 -1.8763317 -0.1885183 -6.655663 2 2009-01-02 -1.3566227 -2.1851226 -3.863576 3 2009-01-03 -1.3447188 2.4180249 -1.543931

Quiero trazar cada serie de tiempo como una línea en un diagrama separado, en una red, con cada gráfico etiquetado por los nombres de las variables.

Para trazar esto con celosía, los datos deben estar en un formato alto, como tal:

t symbol price 1 2009-01-01 X -1.8763317 2 2009-01-02 Y -0.1885183 2 2009-01-02 Z -6.655663

¿Qué es una buena función llamada para hacer esto?


Muchas gracias por las respuestas, amigos. La respuesta de Dirk fue muy clara.

El paso faltante resultó estar utilizando la función "stack ()" para convertir el marco de datos de un formato ancho a uno largo. Soy consciente de que puede haber una manera más fácil de hacer esto con la función reshape (), feliz de ver un ejemplo si alguien quiere publicarlo.

Así que esto es lo que terminé haciendo, usando el marco de datos ''dat'' mencionado en la pregunta:

## use stack() to reshape the data frame to a long format ## <time> <stock> <price> stackdat <- stack(dat,select=-t) names(stackdat) <- c(''price'',''symbol'') ## create a column of date & bind to the new data frame nsymbol <- length(levels(stackdat$symbol)) date <- rep(dat$t, nsymbol) newdat <- cbind(date,stackdat) ## plot it with lattice library(lattice) xyplot(price ~ date | symbol, ## model conditions on ''symbol'' to lattice data=newdat, ## data source type=''l'', ## line layout=c(nsymbol,1)) ## put it on a single line ## or plot it with ggplot2 library(ggplot2) qplot(date, price, data = newdat, geom="line") + facet_grid(. ~ symbol)


Para un marco de datos ''temp'' con la fecha en la primera columna y los valores en cada una de las otras columnas:

> par(mfrow=c(3,4)) # 3x4 grid of plots > mapply(plot,temp[,-1],main=names(temp)[-1],MoreArgs=list(x=temp[,1],xlab="Date",type="l",ylab="Value") )


Si se trata de una serie de tiempo multivariable, considere almacenarlo como un objeto del zoológico utilizando el paquete del mismo nombre. Esto hace que la indexación, la fusión y el subconjunto sean mucho más fáciles --- vea las viñetas del zoológico.

Pero como usted preguntó acerca de los diagramas de celosía - y esto también se puede hacer. En este ejemplo, construimos un simple data.frame ''largo'' con una columna de fecha, así como una columna de valor ''val'' y una columna de identificación de variable ''var'':

> set.seed(42) > D <- data.frame(date=rep(seq(as.Date("2009-01-01"),Sys.Date(),by="week"),2),/ val=c(cumsum(rnorm(30)), cumsum(rnorm(30))), / var=c(rep("x1",30), rep("x2",30)))

Dado ese conjunto de datos, el trazado según su descripción se realiza mediante xyplot desde el paquete de celosía, solicitando un diagrama de ''datos de valores dados agrupados por variable'' donde activamos las líneas en cada panel:

> library(lattice) > xyplot(val ~ date | var, data=D, panel=panel.lines)


también puede usar melt () de la biblioteca ''remodelar'' (creo que es más fácil de usar que remodelar): eso le ahorrará el paso adicional de tener que agregar la columna de tiempo de nuevo en ...

> library(reshape) > m <- melt(dat,id="t",variable_name="symbol") > names(m) <- sub("value","price",names(m)) > head(m) t symbol price 1 2009-01-01 X -1.14945096 2 2009-01-02 X -0.07619870 3 2009-01-03 X 0.01547395 4 2009-01-04 X -0.31493143 5 2009-01-05 X 1.26985167 6 2009-01-06 X 1.31492397 > class(m$t) [1] "Date" > library(lattice) > xyplot( price ~ t | symbol, data=m ,type ="l", layout = c(1,3) )

Sin embargo, para esta tarea en particular, consideraría usar la biblioteca ''zoológico'', que no requiere que modifiques el marco de datos:

> library(zoo) > zobj <- zoo(dat[,-1],dat[,1]) > plot(zobj,col=rainbow(ncol(zobj)))

Los desarrolladores / colaboradores de R (Gabor y Hadley en este caso) nos han bendecido con muchas opciones excelentes. (y no puedo olvidar a Deepayan por el paquete de celosía)