R/0.crisis.db.preparation.R

Defines functions eventCounter .checkCrisisStatusEndOfSeries createCrisisVariables loadCrisisDB alternativeCrisisDB

Documented in createCrisisVariables eventCounter loadCrisisDB

##' .. content for \description{} (no empty lines) ..
##'
##' .. content for \details{} ..
##' @title Crisis Event Counter 
##' @param x 
##' @param success 
##' @param failure 
##' @return A vector with event enumeration.
##' @author Janko Cizel
eventCounter <- function(x,
                         success = 0,
                         failure = 1){

    ## cat("###  Beginning of the failure counting.\n")
    ## cat("###  Success indicator:", success, "\n")
    ## cat("###  Failure indicator:", failure, "\n")    

    i = 1
    out <- c()
    for (y in 1:length(x)){
        ## cat("Iteration: ",y,". ")
        ## cat("Value of x: ",x[y],".")

        if (y == 1){
            if (is.na(x[y])) out = c(out,NA)
            else if (x[y] == failure) out = c(out,i)
            else if (x[y] == success) out = c(out,0)
        } else {
            if (is.na(x[y])){
                if (is.na(x[y-1])) out = c(out,0)
                else if (x[y-1] == success) {out = c(out,0)}
                else if (x[y-1] == failure) {out = c(out,i);}
            }
            else if (x[y] == success){
                if (is.na(x[y-1])) {out = c(out,0);}
                else if (x[y-1] == success) {out = c(out,0);}
                else if (x[y-1] == failure) {out = c(out,0);i=i+1;}
            } else if (x[y] == failure) {
                out = c(out,i)
            }            
        }
        
        ## cat("Counter: ",tail(out,1),"\n")
    }
    ## cat("###  END OF COUNTING  ###.\n")
    return(out)    
}    

.checkCrisisStatusEndOfSeries <- function(x,
                                          success = 0,
                                          failure = 1){
    .x <- rev(x)
    i = 1
    out <- c()
    for (y in 1:length(.x)){
        if (y == 1){
            if (is.na(.x[y])) out = c(out,NA)
            else if (.x[y] == failure) out = c(out,i)
            else if (.x[y] == success) {
                out <- rep(0, times = length(.x))
                break
            }
        } else {
            if (is.na(.x[y])){
                if (is.na(.x[y-1])) out = c(out,0)
                else if (.x[y-1] == success) {out = c(out,0)}
                else if (.x[y-1] == failure) {out = c(out,i);}
            }
            else if (.x[y] == success){
                if (is.na(.x[y-1])) {out = c(out,0);}
                else if (.x[y-1] == success) {out = c(out,0);}
                else if (.x[y-1] == failure) {out = c(out,0);i=i+1;}
            } else if (.x[y] == failure) {
                out = c(out,i)
            }            
        }        
    }
    out[out>1] <- 0
    out <- rev(out)
    return(out)        
}

## .t <- dt1[(iso3=='RUS')][date>'1960-01-01']
## .t <- .t[,list(date, iso3, debtcrisis)]
## .t[, S:=.checkCrisisStatusEndOfSeries(debtcrisis*1,success = 1, failure = 0)]

##' .. content for \description{} (no empty lines) ..
##'
##' .. content for \details{} ..
##' @title Create Crisis Variables 
##' @param crisisDT 
##' @param crisisCol 
##' @param idCol 
##' @param timeCol 
##' @return Original data.table with included countdown variables.
##' @author Janko Cizel
createCrisisVariables <- function(crisisDT,
                                  crisisCol = "Banking Crisis",
                                  idCol = 'iso3',
                                  timeCol = 'date',
                                  groups =
                                  list("[-4:-1]"=expression(COUNTDOWN %between% c(-4,-1)),
                                       "[0]"=expression(COUNTDOWN == 0),
                                       "[1:4]"=expression(COUNTDOWN %between% c(1,4)))){
    crisis <- copy(crisisDT)
    crisis[, c('PCN','CN','S') := {
        ## cat("Country: ",.BY[[1]],"\n")
        list(eventCounter(get(crisisCol),success = 1,failure = 0),
             eventCounter(get(crisisCol),success = 0,failure = 1),
             .checkCrisisStatusEndOfSeries(get(crisisCol),success = 1, failure = 0))
    }
         , by = idCol ]

    crisis <- crisis[order(get(idCol),-get(timeCol))]
    crisis[PCN > 0 & (S!=1),
           COUNTDOWN := -(0:(.N-1))
         , by = c(idCol,'PCN')]
    
    crisis <- crisis[order(get(idCol),get(timeCol))]
    crisis[CN > 0, COUNTDOWN := (1:(.N))
         , by = c(idCol,'CN')]

    crisis[,
           COUNTDOWN := {
               COND <- (PCN == max(PCN)) & (max(PCN) > max(CN))
               COUNTDOWN[COND] <- NA
               COUNTDOWN
           },
           by = get(idCol)]

    ## crisis[, CRISIS := {
    ##     x <- rep(NA,times = length(COUNTDOWN))
    ##     x[COUNTDOWN %in% -3:0] <- 1
    ##     x[COUNTDOWN %in% 1:5] <- 2
    ##     x[is.na(x)] <- 0
    ##     x
    ## }]

    crisis[['CRISIS']] <- rep("CONTROL",times = length(crisis$COUNTDOWN))
    for (x in names(groups)){
        crisis[eval(groups[[x]]), CRISIS:= paste0(x)]
    }

    ## print(data.frame(crisis[, c(idCol, timeCol, crisisCol, "PCN", "CN", "COUNTDOWN","CRISIS"),with = FALSE]),
    ##       nrows = 100)

    return(crisis)
}

##' This function returns a dataset of Reinhardt and Rogoff, which dates 6
##' different types of crises for a set of 70 countries. 
##'
##' TODO: RR's database ends in 2010. Update the DB by including the sovereign
##' debt crisis episodes during 2010-2014.
##
##' @title Load Reinhardt and Rogoff Sovereign Crisis Database
##' @return data.table with crisis dataset. 
##' @author Janko Cizel
loadCrisisDB <- function(){
    out <- fread(input = './inst/extdata/SOVEREIGN/RR-crisis.dataset.csv',
                 header = TRUE)
    out[, date := as.Date(paste0(Year,"-12-30"))]

    setnames(out, "ISO3", "iso3")

    out[, debtcrisis := (`Foreign Sov Debt`*1 + `Domestic Sov Debt`*1)>0]
    
    return(out[,c("Country", "iso3", "date", "Independence", "Currency Crisis", 
                  "Inflation Crisis", "Stock Market Crash", "Domestic Sov Debt", 
                  "Foreign Sov Debt", "Banking Crisis", "Crisis Tally", "debtcrisis"),
               with = FALSE])
}

##' .. content for \description{} (no empty lines) ..
##'
##' .. content for \details{} ..
##' @title Create additional credit event indicators 
##' @return data.table with updated sovereign crisis indicators 
##' @author Janko Cizel
alternativeCrisisDB <- function(){
    ## TO BE COMPLETED
    ratings <- getSPRatings()
    ids = unique(ratings$iso3)
    ids = ids[!is.na(ids) & ids!=""]
##     dates = .fCrDates(begin="1960-01-01",end="2012-12-31",
## frequency=apply.yearly)[[2L]] + 1
    dates = .fCrDates(begin="1960-01-01",end="2012-12-31",frequency=apply.yearly)[[2L]] 

    o <- CJ(iso3 = ids,date = dates)
    setkey(o, iso3, date)
    setkey(ratings, iso3, date)
    out <- ratings[o, roll = 365]

    modCols <- c('rating','ratingnum')
    out[
      , paste(modCols) := lapply(.SD, na.locf, na.rm = FALSE)
      , by = "iso3"
      , .SDcols = modCols]

    out <- out[!is.na(rating)]

    ## BEGINNING OF THE CRISIS IS THE YEAR WHEN RATINGS BEGIN A 2-YEAR DROP OF
    ## MORE THAN 2 NOTCHES.
    out[, ratingdif1y := GeneralUtilities:::shift(ratingnum, lag = +1, dif = TRUE), by = 'iso3']

    ## out[, quantile(ratingdif1y,
    ##                probs = seq(0,1,0.01),
    ##                na.rm = TRUE)]

    ## data.frame(out[ratingdif1y <= -2])

    ## out[, ratingdrop := (ratingdif1y <= -2)*1]
    out[, ratingdrop := (ratingdif1y >= 2)*1]

    out <- 
        out[, list(iso3,
                   date,
                   ratingdif1y,
                   ratingdrop)]
    return(out)
}
jcizel/SovereignCrisis documentation built on May 18, 2019, 10:24 p.m.