Skip to content
Snippets Groups Projects
welf_data.R 2.79 KiB
Newer Older
  • Learn to ignore specific revisions
  • # This R code extracts welfare effects from the output files of the
    # distributional sensitivity analysis of the main results of Hübler
    # et al. (2022). Welfare effects are then stored in a separate data
    # frame for esubd(i), esubm(i) and esubva(j) and saved in RDS files
    # to be used in subsequent analyses.
    
    # load packages
    library(ggplot2)
    library(readr)
    library(extrafont)
    library(openxlsx)
    library(Rcpp)
    library(tictoc)
    library(moments)
    library(confintr)
    library(stringr)
    library(dplyr)
    
    # clear workspace
    rm(list = ls())
    
    # this is where you put the output files from the sensitivity analysis
    # (use separate subdirectories for esubd(i), esubm(i), and esubva(j))
    dir = "C:/Users/Marius Braun/output_sensitivity"
    
    # string vectors for elasticity, policy and income group names
    elasticities = c("esubd", "esubm", "esubva")
    policies = c("policy", "cbam")
    inc_groups = c("lo", "mi", "hi")
    
    
    marius-lucas braun's avatar
    marius-lucas braun committed
    for(elasticity in 1:length(elasticities)) {
    
      # load file paths of output files
      filenames = as.data.frame(
        list.files(
          paste(
            dir,
    
    marius-lucas braun's avatar
    marius-lucas braun committed
            elasticities[elasticity],
    
            sep = "/"
            ),
          pattern = "output.xlsx",
          full.names = T,
          recursive = T)
      )
      colnames(filenames) = "files"
      
      # create empty data frame to store welfare effects
      welf_name = paste(
        "welf",
    
    marius-lucas braun's avatar
    marius-lucas braun committed
        elasticities[elasticity],
    
        sep = "_"
      )
      welf = as.data.frame(
        matrix(,
               nrow = nrow(filenames),
               ncol = length(policies) * length(inc_groups)
        )
      )
      
      # name columns of data frame according to policy and income group
    
    marius-lucas braun's avatar
    marius-lucas braun committed
      for(policy in 1:length(policies)) {
        for(inc_group in 1:length(inc_groups)) {
          col_num = inc_group +
            (as.numeric(policies[policy] == "cbam") * length(inc_groups))
    
    marius-lucas braun's avatar
    marius-lucas braun committed
            policies[policy],
            inc_groups[inc_group],
    
            sep = "_"
          )
        }
      }
      
      # get welfare effects from output files
    
    marius-lucas braun's avatar
    marius-lucas braun committed
      for(f in 1:nrow(filenames)) {
        filename = filenames$files[f]
        if(file.exists(filename)) {
          welfare = read.xlsx(filename, sheet = "welfp") %>%
    
            filter(TOC == "DEU" &
                     str_detect(X3,
                                paste(
                                  paste0("\\b",
                                         policies),
                                  collapse = "|")
                     )
            )
    
          welfare = welfare %>%
              arrange(desc(X3))
    
    
    marius-lucas braun's avatar
    marius-lucas braun committed
        welf[f, ] = t(as.numeric(welfare$X4))
    
      }
      
      # name welfare effects data frame
      assign(
        x = welf_name,
        value = welf
      )
      
      # save welfare effects data frame as RDS file
      saveRDS(get(welf_name),
              paste0(
                "prepared/",
                welf_name,
                ".rds")
              )
    }
    
    marius-lucas braun's avatar
    marius-lucas braun committed
    rm(elasticity, policy, inc_group, filename, f,
       col_num, welf_name, welf, filenames,
    
       welfare, dir, elasticities, inc_groups, policies)