R Преобразование дат рецессии

Я загружаю данные полосы рецессии в R через quantmod. Теперь это выглядит как двоичная информация (в формате xts), выглядящая так (показан только первый период рецессии)

1857-01-01  0
1857-02-01  0
1857-03-01  0
1857-04-01  0
1857-05-01  0
1857-06-01  0
1857-07-01  1
1857-08-01  1
1857-09-01  1
1857-10-01  1
1857-11-01  1
1857-12-01  1
1858-01-01  1
1858-02-01  1
1858-03-01  1
1858-04-01  1
1858-05-01  1
1858-06-01  1
1858-07-01  1
1858-08-01  1
1858-09-01  1
1858-10-01  1
1858-11-01  1
1858-12-01  1

Теперь у меня две проблемы:

  1. Я хотел бы определить начало и конец каждого периода рецессии (т.е. получить дату начала и окончания) для каждого периода рецессии. Поскольку есть промежуточные нули, где нет рецессии, мне нужен механизм фильтрации, который а) отфильтровывает нули (это легко), б) следит за тем, чтобы каждый новый период рецессии распознавался. Простого выбора из них еще недостаточно, поскольку тогда не будет отдельных периодов рецессии, а будет просто набор дат, когда рецессия была.
  2. Мне нужно преобразовать его в табличный формат, как показано здесь http://www.r-bloggers.com/use-geom_rect-to-add-recession-bars-to-your-time-серия-графики-rstats-ggplot/

    1857-06-01, 1858-12-01 1860-10-01, 1861-06-01 1865-04-01, 1867-12-01 1869-06-01, 1870-12-01 1873-10-01, 1879-03-01

Как только это будет сделано, я хочу использовать его как event.lines в библиотеке PerformanceAnalytics.

Может ли кто-нибудь помочь мне, как это сделать?

Если вы хотите скачать серию для опробования, сделайте

library(quantmod)
getSymbols("USREC",src="FRED")

person user2157086    schedule 12.02.2014    source источник


Ответы (2)


Это делает то, что вы хотите, я думаю.

Основная идея заключается в обнаружении переходов от 1 (спад) к 0 (отсутствие спада) и наоборот. Мы можем сделать это с помощью diff(...). diff(...) возвращает вектор, содержащий разницу между данной строкой и предыдущей для всех строк (первый элемент — NA). Итак, когда мы входим в рецессию, разница возвращает 1, когда мы выходим из рецессии, разница возвращает -1. Во всех остальных случаях он возвращает 0.

library(quantmod)
getSymbols("USREC",src="FRED")
getSymbols("UNRATE", src="FRED")
unrate.df <- data.frame(date= index(UNRATE),UNRATE$UNRATE)

start <- index(USREC[which(diff(USREC$USREC)==1)])
end   <- index(USREC[which(diff(USREC$USREC)==-1)-1])

reccesion.df <- data.frame(start=start, end=end[-1])
recession.df <- subset(reccesion.df, start >= min(unrate.df$date))

ggplot()+
  geom_line(data=unrate.df, aes(x=date,y=UNRATE)) +
  geom_rect(data=recession.df,
            aes(xmin=start,xmax=end, ymin=0,ymax=max(unrate.df$UNRATE)), 
            fill="red", alpha=0.2)

EDIT (ответ на комментарий OP)

library(PerformanceAnalytics)
cycles.dates <- paste(format(start,"%Y-%m"),format(end[-1],"%Y-%m"),sep="/")
chart.TimeSeries(UNRATE,period.areas=cycles.dates, 
                        period.color="lightblue", lwd=1)

person jlhoward    schedule 12.02.2014
comment
Большое спасибо, это выполняет многое из того, что я пытался достичь. - person user2157086; 13.02.2014
comment
Только одно: я использую не ggplot, а библиотеку PerformanceAnalytics, где xts в специальном формате как xts выглядит так: cycles.dates‹-c(1857- 06/1858/12, 1860-10/1861-06). Как бы я преобразовал серию во что-то вроде этого? - person user2157086; 13.02.2014
comment
Смотрите мои правки выше. Поскольку вы новичок в SO, прочитайте: Что мне делать, когда кто-то отвечает на мой вопрос? - person jlhoward; 13.02.2014

Чтобы добавить к ответу пользователя 2157086.

Этот метод великолепен, но сталкивается с парой проблем. Во-первых, данные расширились на пару лет назад, и в настоящее время дата начала данных является датой рецессии. Прежде чем использовать метод пользователя 2157086, удалите наблюдения с начала данных, чтобы гарантировать, что первое наблюдение не является рецессией.

Во-вторых, это не работает, когда экономика находится в рецессии!

Простое исправление:

добавьте следующий небольшой фрагмент кода

if(length(end)<length(start)){
end <- c(end, Sys.Date())    
}

перед созданием кадра данных recession.df.

person dobra    schedule 23.06.2020