knitr::opts_chunk$set(
  collapse = TRUE,echo = FALSE,cache = TRUE,
  message = FALSE,warning = FALSE,
  comment = "#>"
)
devtools::load_all()

library(car)

library(tidyverse)

library(plm)

library(stargazer)

library(sandwich)

library(clubSandwich)

library(lmtest)

library(purrr)

library(igraph)

library(DescTools)
save_temp_status = FALSE

countries_list = list(
  oecd_countries = c("Australia","Austria","Belgium","Canada","Chile",
                     "Czech_Republic","Denmark","Estonia","Finland","France",
                     "Germany","Greece","Hungary", "Iceland","Ireland",
                     "Israel","Italy","Japan","Korea","Latvia",
                     "Lithuania","Luxembourg","Mexico","Netherlands",
                     "New_Zealand","Norway","Poland","Portugal",
                     "Slovak_Republic","Slovenia","Spain","Sweden",
                     "Switzerland","Turkey","United_Kingdom"
                     ,"United_States"),
  strong_countries = c("Australia","Austria","Belgium","Canada",
                       "Switzerland","Germany","Denmark","Spain",
                       "Finland","France","United_Kingdom","Ireland",
                       "Italy","Japan","Netherlands","Portugal",
                       "Sweden","United_States"),
  fsap_countries = c("Austria","Belgium","Germany","Denmark","Spain",
                     "France","Finland","Greece","Ireland","Italy",
                     "Luxembourg","Netherlands","Portugal",
                     "Sweden","United_Kingdom"))

countries_list$weak_countries = countries_list$oecd_countries[!countries_list$oecd_countries %in% countries_list$strong_countries]


pairs_list = lapply(names(countries_list),
                    function(temp_name){
                      apply(combn(countries_list[[temp_name]],2), 2,
                            function(temp_col){
                              ifelse(temp_col[1]<temp_col[2],
                                     paste(temp_col[1],temp_col[2],sep = "-"),
                                     paste(temp_col[2],temp_col[1],sep = "-"))})

                    })

names(pairs_list) = paste(names(countries_list), "pairs", sep = "_")

countries_list = c(countries_list, pairs_list)

rm(pairs_list)

countries_list$cross_country_pairs = countries_list$oecd_countries_pairs[!countries_list$oecd_countries_pairs %in% countries_list$strong_countries_pairs & !countries_list$oecd_countries_pairs %in% countries_list$weak_countries_pairs]

reg_list = list()

hyp_test_list = list()


control_vars = c("trade_gdp","FX_stab_tot","FO_ind_tot","MI_ind_tot")
raw_data = list()

raw_data$HousePrice = import.bis.property.price.data(
  countries_vec = countries_list$oecd_countries) %>% 
  mutate(Date = as.yearqtr(Date, format = "%Y-Q%q"))

raw_data$TotalCredit = import.bis.tot.credit.data(
  countries_vec = countries_list$oecd_countries) %>% 
  mutate(Date = as.yearqtr(Date, format = "%Y-Q%q"))

raw_data$WDI_annual = import_wdi_df(
  countries_vec = countries_list$oecd_countries)


raw_data$bis_lbs = import.bis.lbs.data(
  countries_vec = countries_list$oecd_countries) %>% 
  mutate(Date = as.yearqtr(Date, format = "%Y-Q%q"))

raw_data$Harmon_both_quarter = import.harmon.data() %>% 
  construct_countrypair_harmon_index(.,dates_vec = seq.Date(
    from = as.Date(min(raw_data$bis_lbs$Date)),
    to = as.Date(max(raw_data$bis_lbs$Date)),
    by = "quarter") %>% as.yearqtr())

raw_data$Harmon_one_quarter = import.harmon.data() %>% 
  construct_countrypair_harmon_index(.,dates_vec = seq.Date(
    from = as.Date(min(raw_data$bis_lbs$Date)),
    to = as.Date(max(raw_data$bis_lbs$Date)),
    by = "quarter") %>% as.yearqtr(),index_status = "one")

raw_data$codes = read.csv(paste0("C:\\Users\\Misha\\Documents",
                                 "\\Data\\ISO\\",
                                 "iso_2digit_alpha_country",
                                 "_codes.csv")) %>% 
  setNames(c("Code","Country"))
eu_df = read.csv(paste0("C:\\Users\\Misha\\Documents\\",
                        "Data\\Misc\\EU_membership.csv"),
                 stringsAsFactors = FALSE) %>% 
  setNames(c("Country","Euro_area","EU"))


eu_dates_vec = seq.Date(
  from = as.Date(min(raw_data$bis_lbs$Date)),
  to = as.Date(max(raw_data$bis_lbs$Date)),
  by = "year") %>% 
  format(.,"%Y")

raw_data$EU_both = construct_countrypair_EU_index(
  df = eu_df %>% 
    select(Country, EU) %>% 
    rename(Date = EU),dates_vec = eu_dates_vec) %>% 
  rename(EU_both = Status) %>% 
  mutate(Date = as.character(Date))

raw_data$EU_one = construct_countrypair_EU_index(
  df = eu_df %>% 
    select(Country, EU) %>% 
    rename(Date = EU),dates_vec = eu_dates_vec,
  index_status = "one") %>% 
  rename(EU_one = Status) %>% 
  mutate(Date = as.character(Date))


raw_data$Euro_both = construct_countrypair_EU_index(
  df = eu_df %>% 
    select(Country, Euro_area) %>% 
    rename(Date = Euro_area),dates_vec = eu_dates_vec) %>% 
  rename(Euro_both = Status) %>% 
  mutate(Date = as.character(Date))

raw_data$Euro_one = construct_countrypair_EU_index(
  df = eu_df %>% 
    select(Country, Euro_area) %>% 
    rename(Date = Euro_area),dates_vec = eu_dates_vec,
  index_status = "one") %>% 
  rename(Euro_one = Status) %>% 
  mutate(Date = as.character(Date))

rm(eu_df, eu_dates_vec)
raw_data$crises_df =  import.crises.dates.df(countries_vec = countries_list$oecd_countries)
df_list = list(raw_data$TotalCredit %>%
                 filter(quarters(Date) == "Q4") %>%
                 mutate(Date = format(Date, "%Y")) %>% 
                 deflate.data(.,vars_to_deflate = "Total_Credit") %>% 
                 select(-Total_Credit),
               raw_data$HousePrice %>%
                 filter(quarters(Date) == "Q4") %>%
                 mutate(Date = format(Date, "%Y")),
               raw_data$WDI_annual %>%
                 rename(Date = Year) %>%
                 deflate.data(.,vars_to_deflate = c("GDP","GDP_per_Capita"),
                              cpi = raw_data$CPI) %>% 
                 select(-GDP, -GDP_per_Capita))


df = df_list %>% 
  reduce(right_join, by = c("Date", "Country")) %>% 
  group_by(Country) %>% 
  mutate_at(.vars = c("Total_Credit_real","HousePrice"),
            .funs = list(ret = ~c(NA,diff(log(.))))) %>%
  mutate(Fin_ret = rowMeans(data.frame(Total_Credit_real_ret,
                                       HousePrice_ret),na.rm = TRUE)) %>%
  ungroup() %>%
  filter(is.finite(Fin_ret)) %>% 
  filter(Date >=1978)

rm(df_list)
bank_graph_df = import.bis.lbs.data(
  countries_vec = countries_list$oecd_countries,
  collapse_countrypair = FALSE)  %>% 
  filter(grepl("Q4",Date)) %>% 
  group_by(Country, Counter_Country,Date) %>% 
  summarise(Weight = mean(Balance, na.rm = TRUE)) %>% 
  ungroup() %>% 
  filter(complete.cases(.)) %>% 
  mutate(Date = str_extract(Date,"^\\d{4}"))

net_list = lapply(split(bank_graph_df,bank_graph_df$Date),
                  function(temp_df){
                    links_df = temp_df %>% 
                      select(-Date)

                    net = graph_from_data_frame(links_df)

                    E(net)$weight = links_df$Weight

                    return(net)


                  })

centrality_df = lapply(names(net_list),
                       function(temp_name){

                         in_cent = graph.strength(net_list[[temp_name]],
                                                  mode = "in") %>% 
                           data.frame(Country = names(.),
                                      Date = temp_name,
                                      Center_in = .)

                         out_cent = graph.strength(net_list[[temp_name]],
                                                   mode = "out") %>% 
                           data.frame(Country = names(.),
                                      Date = temp_name,
                                      Center_out = .)

                         df = full_join(in_cent, out_cent,
                                        by = c("Country","Date"))

                         return(df)


                       }) %>% 
  rbind_all()

df = left_join(df, centrality_df, by = c("Country","Date"))
bank_list = list()

bank_balance_real = raw_data$bis_lbs %>%
  filter(quarters(Date) == "Q4") %>%
  mutate(Date = format(Date, "%Y")) %>%
  mutate(Balance = Balance * 10 ^ 6) %>% 
  deflate.data(.,vars_to_deflate = "Balance") %>%
  select(Date, CountryPair,Balance_Pos, Balance_real)


bank_list$bank_gdp = bank_balance_real  %>%
  normalize.bis.data(.,norm_df = df[,c("Date","Country", "GDP_real")],
                     norm_val = "GDP_real") %>% 
  group_by(Date, CountryPair) %>%
  summarise(bank_gdp = mean(log(Balance_real), na.rm = TRUE)) %>%
  filter(!is.na(bank_gdp))

# bank_pop = bank_balance_real  %>%
#   normalize.bis.data(.,norm_df = df[,c("Date","Country", "Pop")],
#                      norm_val = "Pop") %>% 
#   group_by(Date, CountryPair) %>%
#   summarise(bank_pop = mean(log(Balance_real), na.rm = TRUE)) %>%
#   filter(!is.na(bank_pop))

rm(bank_balance_real)
ind_list = list()

ind_list$Harmon_both =  raw_data$Harmon_both_quarter %>% 
  mutate(Date = format(Date, "%Y")) %>% 
  group_by(CountryPair, Date, Directive) %>% 
  summarise(Transposed = max(Transposed)) %>% 
  group_by(Date,CountryPair) %>% 
  summarise(Harmon_both_Index = log(
    sum(Transposed + 1,na.rm = TRUE)))

ind_list$Harmon_one = raw_data$Harmon_one_quarter %>% 
  mutate(Date = format(Date, "%Y")) %>% 
  group_by(CountryPair, Date, Directive) %>% 
  summarise(Transposed = max(Transposed)) %>% 
  group_by(Date,CountryPair) %>% 
  summarise(Harmon_one_Index = log(
    sum(Transposed + 1,na.rm = TRUE)))

# ind_list$EU_both = raw_data$EU_both
# 
# ind_list$EU_one =  raw_data$EU_one
# 
# ind_list$Euro_both =  raw_data$Euro_both
#                     
# ind_list$Euro_one = raw_data$Euro_one
trade_list = list()

export_df = lapply(list.files(paste0("C:\\Users\\Misha\\Documents\\Data",
                                     "\\IMF\\Export-Import\\Export"),
                              full.names = TRUE),
                   import_imf_df,
                   countries_vec = countries_list$oecd_countries) %>% 
  bind_rows() %>% 
  mutate(Exports = as.numeric(Exports)) %>% 
  group_by(Date, CountryPair) %>% 
  summarise(Exports = sum(Exports, na.rm = TRUE))


import_df = lapply(list.files(paste0("C:\\Users\\Misha\\Documents\\Data",
                                     "\\IMF\\Export-Import\\Import"),
                              full.names = TRUE),
                   import_imf_df,
                   countries_vec = countries_list$oecd_countries) %>% 
  bind_rows() %>% 
  mutate(Imports = as.numeric(Imports)) %>%
  group_by(Date, CountryPair) %>% 
  summarise(Imports = sum(Imports, na.rm = TRUE))

trade_df = full_join(export_df,import_df) %>% 
  gather(.,key = Balance_Pos, value = Trade, -Date, - CountryPair) %>% 
  deflate.data(.,vars_to_deflate = "Trade") %>% 
  select(-Trade)


trade_list$trade_gdp = trade_df %>%
  ungroup() %>% 
  normalize.imf.data(.,wdi_df = df[,c("Date","Country", "GDP_real")],
                     norm_val = "GDP_real") %>%
  group_by(Date, CountryPair) %>%
  summarise(trade_gdp = mean(log(Trade_real), na.rm = TRUE)) %>%
  filter(!is.na(trade_gdp)) %>% 
  filter(is.finite(trade_gdp))

rm(export_df, import_df, trade_df)
country_pair_df = unlist(list(bank_list, trade_list, ind_list),
                         recursive = FALSE) %>% 
  reduce(left_join, by = c("Date","CountryPair"))
df = left_join(df, import.trilemma.ind(),
               by = c("Country","Date"))
df = full_join(df, import.macropru.ind(),
               by = c("Country","Date"))
df = left_join(df, import.fin.dev.ind(),
               by = c("Country","Date"))
df = left_join(df, import.wgi.ind(countries_vec = countries_list$oecd_countries) %>% 
                 filter(grepl("Estimate$", Indicator)) %>% 
                 group_by(Country, Date) %>% 
                 summarise(WGI = mean(Val, na.rm = TRUE)),
               by = c("Country","Date"))
fin_reg_df_annual = construct_fin_reg(
  df = df %>% 
    mutate(GDP_real = log(GDP_real),
           Pop = log(Pop)),
  countries_vec = countries_list$oecd_countries,
  control_vars = names(df)[!names(df) %in% c("Country","Date","Fin_ret")],
  collapse_funcs = c("sum"))

fin_reg_df_annual = fin_reg_df_annual %>% 
  full_join(.,get.quasi.cor(df %>% select(Date, Country,Fin_ret)) %>% 
              rename(Fin_synch_quasi_cor = Fin_ret),
            by = c("Date","CountryPair"))

fin_reg_df_annual = fin_reg_df_annual %>% 
  full_join(.,country_pair_df, by = c("Date","CountryPair"))

fin_reg_df_annual = fin_reg_df_annual %>% 
  filter(!is.na(CountryPair)) %>% 
  filter(!is.na(Fin_synch)) %>% 
  filter(!is.na(bank_gdp)) %>% 
  filter(!is.na(Date))


temp_lm_resid = function(x,Time){

  if(sum(!is.na(x)) < 2){return(rep(NA, length(x)))}

  return(residuals(lm(x ~ Time)))

}


fin_reg_df_annual = fin_reg_df_annual %>% 
  group_by(CountryPair) %>% 
  mutate(Time_trend = seq.int(from = 1,to = length(Date))) %>% 
  mutate(bank_gdp_delta = c(NA, diff(bank_gdp))) %>% 
  mutate(Fin_synch_delta = c(NA, diff(Fin_synch))) %>% 
  mutate(bank_gdp_detrended = temp_lm_resid(bank_gdp, Time_trend)) %>% 
  mutate(Fin_synch_detrended = temp_lm_resid(Fin_synch, Time_trend)) %>% 
  mutate(Harmon_both_detrended = temp_lm_resid(Harmon_both_Index,
                                               Time_trend)) %>% 
  ungroup()

fin_reg_df_annual$CountryPair_Category[fin_reg_df_annual$CountryPair %in% countries_list$strong_countries_pairs] = "High-Income"

fin_reg_df_annual$CountryPair_Category[fin_reg_df_annual$CountryPair %in% countries_list$cross_country_pairs] = "Cross (High - Low) Income"

fin_reg_df_annual$CountryPair_Category[fin_reg_df_annual$CountryPair %in% countries_list$weak_countries_pairs] = "Low-Income"


# saveRDS(fin_reg_df_annual, "C:\\Users\\Misha\\Desktop\\temp_df.rds")
fin_reg_df_annual = fin_reg_df_annual %>% 
  separate(col = CountryPair,into = c("Country_A","Country_B"),
           sep = "-", remove = FALSE) %>% 
  group_by(Country_A) %>% 
  mutate(Country_A_crises = classify_crises_dates(
    Target_Country = Country_A[1],
    dates_vec = Date,
    crises_df = raw_data$crises_df[,1:3])) %>% 
  group_by(Country_B) %>% 
  mutate(Country_B_crises = classify_crises_dates(
    Target_Country = Country_B[1],
    dates_vec = Date,
    crises_df = raw_data$crises_df[,1:3])) %>% 
  ungroup() %>% 
  rowwise() %>% 
  mutate(Crises_tot = sum(Country_A_crises, Country_B_crises)) %>% 
  mutate(Crises_one = as.numeric(Crises_tot ==1)) %>% 
  mutate(Crises_both = as.numeric(Crises_tot ==2)) %>% 
  mutate(Crises = min(Crises_tot,1)) %>% 
  ungroup() %>% 
  select(-Country_A,-Country_B)
write_rds(x = raw_data,
          path = "C:\\Users\\Misha\\Documents\\Data\\TempData\\temp_raw_df.rds")


write_rds(x = fin_reg_df_annual,
          path = "C:\\Users\\Misha\\Documents\\Data\\TempData\\temp_fin_df_old.rds")
reg_formula = paste("Fin_synch ~ lag(bank_gdp,1) * Crises",
                    "lag(bank_gdp,1) * FD_tot",
                    # "lag(bank_gdp,1) * EU_both",
                    # "lag(bank_gdp,1) * Euro_both",
                    # "lag(bank_gdp,1) * Common_Lang",
                         paste(control_vars, collapse = "+"),
                        "CountryPair:as.integer(Date)",
                     sep = "+")

reg_list$baseline = plm(formula = formula(reg_formula),data = fin_reg_df_annual,
          model = "within",effect = "twoways",
          index = c("CountryPair","Date"))


se_baseline = sqrt(diag(vcovHC(reg_list$baseline,cluster = "group")))


MichaelGurkov/FinSynch documentation built on Oct. 30, 2019, 9:27 p.m.