nberDates()
给出了经济衰退开始和结束日期的列表。
最简单,最简单的方法是将其转化为一组假人,以便对现有时间序列进行子集化?
所以,nberDates本身就会产生......
> nberDates()
Start End
[1,] 18570701 18581231
[2,] 18601101 18610630
[3,] 18650501 18671231
[4,] 18690701 18701231
[5,] 18731101 18790331
[6,] 18820401 18850531
和str(nberDates())
表示类型为“Named num
”。
我在xts中有另一个时间序列对象,目前看起来像这样...
> head(mydata)
value
1966-01-01 15
1967-01-01 16
1968-01-01 20
1969-01-01 21
1970-01-01 18
1971-01-01 12
我希望有一个第二个变量,凹陷,在经济衰退期间是1:
> head(mydata)
value recess
1966-01-01 15 0
1967-01-01 16 0
1968-01-01 20 0
1969-01-01 21 0
1970-01-01 18 1
1971-01-01 12 0
(我的目标是,我希望能够将衰退中的价值与经济衰退中的价值进行比较。)
我正在尝试的那种笨重的东西不起作用就是这个......
((index(mydata) > as.Date(as.character(nberDates()[,1]),format="%Y%m%d")) & (index(mydata) < as.Date(as.character(nberDates()[,2]),format="%Y%m%d")))
但这会产生......
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Warning messages:
1: In `>.default`(index(mydata), as.Date(as.character(nberDates()[, :
longer object length is not a multiple of shorter object length
2: In `<.default`(index(mydata), as.Date(as.character(nberDates()[, :
longer object length is not a multiple of shorter object length
我知道我可以用笨重的for循环来解决这个问题,但这总是向我暗示我做错了。
有什么建议吗?
答案 0 :(得分:1)
以下应该这样做:
sapply(index(mydata), function(x) any(((x >= as.Date(as.character(nberDates()[,1]),format="%Y%m%d") & (x <= as.Date(as.character(nberDates()[,2]),format="%Y%m%d"))))))
sapply基本上通过向量并检查每个元素是否属于NBER间隔之一。
但请注意,目前编写的方式意味着它会将原始NBER数据转换为mydata
中每个元素的日期(as.Date),因此您可能希望执行转换一次,将其保存到一些临时数据框,然后在其上运行上面的内容。
答案 1 :(得分:1)
这是另一个在merge.xts
中使用一些方便行为的解决方案。
library(xts)
library(tis) # for nberDates()
# make two xts objects filled with ones
# 1) recession start dates
# 2) recession end dates
rd <- apply(nberDates(),2,as.character)
ones <- rep(1,nrow(rd))
rStart <- xts(ones, as.Date(rd[,1],"%Y%m%d"))
rEnd <- xts(ones, as.Date(rd[,2],"%Y%m%d"))
# merge recession start/end date objects with empty xts
# object containing indexes from mydata, filled with zeros
# and take the cumulative sum (by column)
rx <- cumsum(merge(rStart,rEnd,xts(,index(mydata)),fill=0))
# the recess column = (cumulative # of recessions started at date D) -
# (cumulative # of recessions ended at date D)
mydata$recess <- (rx[,1]-rx[,2])[index(mydata)]
或者,您可以使用USREC
series from FREDII。
library(quantmod)
getSymbols("USREC",src="FRED")
mydata2 <- merge(mydata, USREC, all=FALSE)
答案 2 :(得分:0)
暂时,我正在使用嵌套循环,如下所示。还在寻找更好的答案!
mydata$recess <- 0
for (x in seq(1,dim(mydata)[1])){
for (y in seq(1,dim(nberDates())[1])){
if (index(mydata)[x] >= as.Date(as.character(nberDates()[y,1]),format="%Y%m%d") &
index(mydata)[x] <= as.Date(as.character(nberDates()[y,2]),format="%Y%m%d")){
mydata$recess[x] <- 1
}
}
}