我正在通过quantmod
将衰退频段数据下载到R中。现在这是一个二进制信息(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
现在,我有两个问题:
我需要以这样的表格格式转换它,如下所示 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,1873-03-01
完成此操作后,我想将其用作库PerformanceAnalytics
中的event.lines。
有人可以帮我解决这个问题吗?
如果您想下载试用系列,请执行
library(quantmod)
getSymbols("USREC",src="FRED")
答案 0 :(得分:3)
我想,这就是你想做的。
基本思想是检测从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)
编辑(对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)
答案 1 :(得分:0)
要添加到user2157086的答案中。
此方法很棒,但遇到了两个问题。首先,数据回溯了几年,当前数据的开始日期是经济衰退日期。在使用user2157086的技术之前,请从数据开头删除观察值,以确保第一个观察值是非衰退观察值。
第二,当经济不景气时,这不起作用!
简单修复:
添加以下代码
if(length(end)<length(start)){
end <- c(end, Sys.Date())
}
在创建recession.df数据框之前。