首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R衰退日期转换

R衰退日期转换
EN

Stack Overflow用户
提问于 2014-02-12 20:35:24
回答 2查看 1.6K关注 0票数 4

我正在通过quantmod下载衰退波段数据到R。现在,这是一个二进制信息( xts格式),如下所示(只显示了第一个衰退时期)

代码语言:javascript
运行
复制
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. 我需要将它转换成这样的表格格式,如下面所示,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

完成此操作后,我希望将其作为event.lines在库PerformanceAnalytics中使用。

有人能帮我解决这个问题吗?

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

代码语言:javascript
运行
复制
library(quantmod)
getSymbols("USREC",src="FRED")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-12 22:38:34

我想这能做你想做的事。

其基本思想是检测从1(衰退)到0(无衰退)的转换,反之亦然。我们可以用diff(...)来做这件事。diff(...)返回包含给定行与前一行之间差异的向量,用于所有行(第一个元素是NA)。因此,当我们进入衰退时,diff返回1,当我们离开衰退时,diff返回-1。所有其他时间,它返回0。

代码语言:javascript
运行
复制
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评论的回应)

代码语言:javascript
运行
复制
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)

票数 6
EN

Stack Overflow用户

发布于 2020-06-23 01:49:25

添加用户2157086的答案。

这个方法很好,但是遇到了一些问题。首先,数据已经扩展到几年前,目前数据的开始日期是衰退日期。在使用using 2157086的技术之前,从数据的开头删除观察,以确保第一次观测是不衰退的观测。

第二,当经济陷入衰退时,这是行不通的!

简单的修正:

添加以下代码

代码语言:javascript
运行
复制
if(length(end)<length(start)){
end <- c(end, Sys.Date())    
}

在创建recession.df数据文件之前。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21739012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档