4

我正在通过 将衰退带数据下载到 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. 我想确定每个衰退期的每个衰退期的开始和结束(即获取开始和结束日期)。由于没有衰退的中间零点,我需要一个过滤机制,它a)过滤掉零点(这很容易),b)确保识别每个新的衰退期。仅仅选择那些还没有奏效,因为那时没有单独的衰退期,而只是出现衰退的日期的集合。
  2. 我需要将它转换成这样的表格格式,如下所示 http://www.r-bloggers.com/use-geom_rect-to-add-recession-bars-to-your-time-series-plots-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

完成后,我想将它用作 library 中的 event.lines PerformanceAnalytics

任何人都可以帮助我如何做到这一点?

如果您想下载该系列进行尝试,请执行

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

2 回答 2

5

我认为这可以满足您的要求。

基本思想是检测从 1(衰退)到 0(无衰退)的转变,反之亦然。我们可以用diff(...). 对于所有行(第一个元素是)diff(...),返回包含给定行与前一行之间差异的向量。NA因此,当我们进入衰退时,diff 返回 1,当我们离开衰退时,diff 返回 -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)

编辑(对 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)

于 2014-02-12T22:38:34.083 回答
0

添加到user2157086的答案。

这种方法很棒,但遇到了几个问题。首先,数据已经扩大了几年,目前数据的开始日期是衰退日期。在使用 user2157086 的技术之前,从数据的开头删除观察值,以确保第一个观察值是非衰退观察值。

其次,这在经济衰退时不起作用!

简单修复:

添加以下一点代码

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

在创建衰退.df 数据框之前。

于 2020-06-23T01:49:25.150 回答