我正在通过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现在我有两个问题:
完成此操作后,我希望将其作为event.lines在库PerformanceAnalytics中使用。
有人能帮我解决这个问题吗?
如果您想下载该系列以供尝试,请执行
library(quantmod)
getSymbols("USREC",src="FRED")发布于 2014-02-12 22:38:34
我想这能做你想做的事。
其基本思想是检测从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)

发布于 2020-06-23 01:49:25
添加用户2157086的答案。
这个方法很好,但是遇到了一些问题。首先,数据已经扩展到几年前,目前数据的开始日期是衰退日期。在使用using 2157086的技术之前,从数据的开头删除观察,以确保第一次观测是不衰退的观测。
第二,当经济陷入衰退时,这是行不通的!
简单的修正:
添加以下代码
if(length(end)<length(start)){
end <- c(end, Sys.Date())    
}在创建recession.df数据文件之前。
https://stackoverflow.com/questions/21739012
复制相似问题