Modificați nberDates () într-o serie de timp în R pentru submulțire

nberDates() in the tis package gives a list of recession start and end dates.

Care este cea mai slabă și cea mai scurtă cale de a transforma acest lucru într-un set de manechine pentru a submăsura o serie de timp existente?

Deci, nberDates se produce ...

> nberDates()
         Start      End
 [1,] 18570701 18581231
 [2,] 18601101 18610630
 [3,] 18650501 18671231
 [4,] 18690701 18701231
 [5,] 18731101 18790331
 [6,] 18820401 18850531

și str (nberDates ()) spune că tipul este " Nam num ". "

Am un alt obiect din seria temporală în xts care arată în prezent ...

> 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

Aș dori să am oa doua variabilă, nișă, adică 1 în timpul recesiunilor:

> 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

(Scopul meu este că aș dori să pot compara valori în recesiuni cu valori din recesiuni.)

Lucrul ciudat pe care încerc să nu-l acționează este ...

((index(mydata) > as.Date(as.character(nberDates()[,1]),format="%Y%m%d")) & (index(mydata) < as.Date(as.character(nberDates()[,2]),format="%Y%m%d")))

Dar acest randament ...

 [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

Știu că pot rezolva acest lucru cu un buzunar for-loop, dar asta întotdeauna îmi sugerează că fac rău.

Orice sugestii?

2

3 răspunsuri

Următoarele ar trebui să o facă:

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"))))))

se aplică practic prin vector și verifică fiecare element dacă se încadrează în unul dintre intervalele NBER.

Rețineți, totuși, că modul în care este scris în prezent înseamnă că va face conversia datelor NBER brute în date (as.Date) o dată pentru fiecare element din mydata </​​code> astfel încât să doriți să faceți conversia o dată, salvați-l într-un cadru de date temporar și executați cele de mai sus.

1
adăugat
Asta am căutat. Încă nu cred în funcțiile "aplicați" și totuși mă găsesc întrebând de fiecare dată. Mulțumiri!
adăugat autor Mittenchops, sursa

Iată o altă soluție care folosește un comportament util în 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)]

Alternativ, puteți utiliza seria USREC din FREDII .

library(quantmod)
getSymbols("USREC",src="FRED")
mydata2 <- merge(mydata, USREC, all=FALSE)
1
adăugat

Cu încetare, folosesc bucle imbricate după cum urmează. Încă mai căutați un răspuns mai bun!

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
    }
  }
}
0
adăugat