2

nberDates()tis パッケージには、景気後退の開始日と終了日のリストが含まれています。

これを既存の時系列をサブセット化するための一連のダミーに変換する最も巧妙で最短の方法は何ですか?

したがって、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 になる 2 番目の変数、景気後退が必要です。

> 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 ループでこれを解決できることはわかっていますが、それは常に R のやり方が間違っていることを示唆しています。

助言がありますか?

4

3 に答える 3

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 間隔の 1 つに収まるかどうかをチェックします。

ただし、これが現在書かれている方法は、生の NBER データの日付への変換 (as.Date) を要素ごとに 1 回行うことを意味することに注意してくださいmydata。データフレームを作成し、その上で上記を実行します。

于 2012-05-29T23:12:56.223 に答える
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または、 FREDIIのシリーズを使用することもできます。

library(quantmod)
getSymbols("USREC",src="FRED")
mydata2 <- merge(mydata, USREC, all=FALSE)
于 2013-06-04T20:51:07.360 に答える
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
    }
  }
}
于 2012-05-29T22:08:19.803 に答える