8 nov 2018

Trabajando con fechas en R (II)

En muchas ocasiones, al trabajar con series temporales resulta de interés obtener un vector con los valores correspondientes a fechas especificas como los lunes (por ejemplo), o crear una variable binaria que corresponda a una determinada fecha. Cuando los datos han sido guardados de forma ordenada, sin omitir valores, podemos generar una secuencia repetida de 1 y 0, por ejemplo cada 7 valores, lo que nos asegura estar accediendo a cada lunes. No obstante, en muchos casos, no tenemos datos ordenados, faltando en muchas semanas datos correspondiente a fines de semanas o días festivos, por lo que sería importante obtener alguna forma alternativa de acceder a estos valores a partir de fechas especificas, no necesariamente ordenadas de forma secuencial en mis datos.

Para el siguiente ejemplo, se genera una variable aleatoria para los 365 días del 2018 (note que se utilizó la función seq para generar una secuencia de fechas, pero esta pudo haberse importado directamente de una base de datos):

x<-rnorm(365)
fechas<-seq(as.Date("2018/1/1"), by = "day", length.out = 365)

data<-data.frame(fechas,x)
head(data)
fechas x
1 2018-01-01 -0.91820518
2 2018-01-02 -1.77966799
3 2018-01-03 1.04555275
4 2018-01-04 -0.07364716
5 2018-01-05 -0.41371250
6 2018-01-06 0.90414391

Posteriormente, se crea un vector de lunes, asumiendo la siguiente idea, dentro del vector de fecha que estoy trabajando (en mi base de datos, llamada data), identifico el primer lunes, el cual corresponde a la fecha "2018/1/1", luego indico que esta secuencia se repita semanalmente (todos los lunes) [by = "week"], durante el periodo “2018/12/31". Por lo que, este vector llamado lunes, contiene todas las fechas que son lunes durante el periodo de estudio.

lunes<-seq(as.Date("2018/1/1"), as.Date("2018/12/31"), by = "week")
lunes
[1] "2018-01-01" "2018-01-08" "2018-01-15"

Recuperar un vector de valores de fechas especifica

Ahora, como tenemos identificadas las fechas de interés, utilizamos el concepto de indexación en R para acceder a los valores de interés, combinado con el operador especial %in%, que es equivalente a la igualdad del vector fecha a cada uno de los valores (también fechas) indicado en el vector lunes. Es decir, que busca en el vector de fechas de mi base de datos, todos los valores que son iguales a al menos uno de los valores contenidos en el vector lunes (verifique que el vector lunes lo puede cambiar por cualquier otro vector de fechas que le resulten de interés como podría utilizarse en la metodología de estudios de eventos, Event Study).

x[fechas %in% lunes]
[1] -0.9182051773 0.2278011059 ...

Crear una variable binaria para fechas especificas

Finalmente, podemos crear una variable binaria que sea igual a 1 para los días lunes y cero para el resto de fechas, para esto utilizamos el operador lógico especial %in% para crear una binaria que sea igual a 1 siempre que una de las fechas de las guardadas en mi base de datos, sea igual al vector de fechas de interés identificada.

dummyLunes<-as.numeric(fechas %in% lunes)
dummyLunes
[1] 1 0 0 0 0 0 0 1

Una alternativa más sencilla de generar el vector de lunes es utilizando la función weekdays y el operador lógico de igualdad.

as.numeric(weekdays(fechas)=="lunes")

Recesión plot en R usando ggplot (recession plot in r)

En el siguiente ejemplo se simular y replica -parcialmente- un ejemplo usado por el FMI para ilustrar la importancia del uso de series de ti...