Very Basic CGE Model

Good Morning/Afternoon/Evening,

I am a high school teacher and I am building a very basic Computer Generated Equilibrium Model (CGE Model) - code below. I think it would be very cool to show the kids how the 'economy' can come together in one of these models, sort of big picture thinking.

Basically, I have a number of endogenous variables which need to be solved for given a set of linear and/or non-linear equations, constraints which could be linear or non-linear, and a set of known (exogenous) variables.

I am having trouble making this work (could be the package I am trying to use) but more experienced users on this platform might have better insights on how to make this model work.

I have tried hard to structure the model so that it would be easy to add new equations and variables as desired without needing to rebuild the model each time.

#_______________________________________________________________________________
#
# STYLISED JOHANSSON CGE MODEL
#
#_______________________________________________________________________________
rm(list=ls(all=TRUE))



######### INPUTS ###############################################################


NUMBER_OFENDOGENOUS_VARIABLES = 14


#========   Packages  

if(!require(nleqslv)){#__________                                   
  install.packages("nleqslv")
}#_________________________________
library(nleqslv)



######### CACULATIONS ##########################################################


#~~~~~~~~ CGE Model Equations FUNCTION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CGE_Model_Equations_Funcion <- function(#__________
  
  Endogenous_Base_Variables
  
){#________________________________________________
  
  
  #========= Exogenous Inputs  ===================
  
  
  CAPITAL_SUPPLY = 1000
  
  LABOUR_SUPPLY = 5000
  
  
  TFP_X = 1 # Any Number > 1
  
  TFP_Y = 1 # Any Number > 1
  
  ALPHA_X = 0.5  # Any Number (0, 1)
  
  ALPHA_Y = 0.5   # Any Number (0, 1)
  
  BETA = 0.5  # Any Number (0, 1)
  
  
  #=========  Endogenous Variables ============
  
  
  Endogenous_Variables_Names <- c("good_X",
                                  "good_Y",
                                  "labour_demand_X",
                                  "labour_demand_Y",
                                  "capital_demand_X",
                                  "capital_demand_Y",
                                  "price_X",
                                  "price_Y",
                                  "wage",
                                  "interest_rate",
                                  "income",
                                  "utility",
                                  "consumption_X",
                                  "consumption_Y")
  
  
  rownames(Endogenous_Base_Variables) <- Endogenous_Variables_Names
  
  X <- t(Endogenous_Base_Variables)                                             # I need to transpose this so I can extract elements by NAMES (Is this True?)
  
  X <- as.data.frame(X)                                                         # Needs to be a data frame so i can extract variables by name
  
  
  
  #=========  Endogenous Equations =============================================
  
  #--------     Firms and Production  ------------------------------------------
  
  X$good_X = TFP_X * (X$labour_demand_X ^ ALPHA_X) * (X$capital_demand_X ^ (1 - ALPHA_X))  # Production Functions
  
  X$good_Y = TFP_Y * (X$labour_demand_Y ^ ALPHA_Y) * (X$capital_demand_Y ^ (1 - ALPHA_Y))
  
  
  X$labour_demand_X = (ALPHA_X * X$price_X * X$good_X) / X$wage                 # Factor Demands for both labour and capital accross both goods
  
  X$labour_demand_Y = (ALPHA_Y * X$price_Y * X$good_Y) / X$wage
  
  
  X$capital_demand_X = ((1 - ALPHA_X) * X$price_X * X$good_X) / X$interest_rate
  
  X$capital_demand_Y = ((1 - ALPHA_Y) * X$price_Y * X$good_Y) / X$interest_rate
  
  
  
  #--------     Households and Consumption  ------------------------------------
  
  X$income = wage * (X$labour_demand_X + X$labour_demand_Y) + 
    X$interest_rate * (X$capital_demand_X + X$capital_demand_Y)                 # This is total household income
  
  
  X$utility = X$income * (X$consumption_X ^ BETA) * (X$consumption_Y ^ (1 - BETA))  # Household utility function
  
  
  X$consumption_X = (BETA * X$income) / X$price_X                               # Total household consumption of both goods
  
  X$consumption_Y = ((1 - BETA) * X$income) / X$price_Y
  
  
  
  #--------   Equilibrium Conditions  ------------------------------------------
  
  if(#_____ Conditions for a Valid Solution ______________                      # I know with FUNCTION OPTIM you can insert contraints like this
    
    X$consumption_X == X$good_X &                                               # Production of goods must equal consumption 
    
    X$consumption_Y == X$good_Y &
    
    (X$labour_demand_X + X$labour_demand_Y)  == LABOUR_SUPPLY &                 # the supply of factors of production must equal demand
    
    (X$capital_demand_X + X$capital_demand_Y) == CAPITAL_SUPPLY
    
    
  ){return(t(as.matrix(X)))                                                     # the nleqslv needs a single column/vector of results?
    
  }else{#_ _ _A Solution has Not Been Found _ _ _ _ _ _
    
    NA_Matrix <- rep(NA, ncol(X))                                               # If an NA is given the function tries to solve again?
    
    return(NA_Matrix)
    
  }#_____________________________________________________
  
}#~~~~~~~   END CGE Model Equations FUNCTION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~





#========   Running the CGE Model 


Endogenous_Base_Variables <- c(rep(1, NUMBER_OFENDOGENOUS_VARIABLES))     # Starting Values


CGE_Endogenous_Results <- nleqslv(Endogenous_Base_Variables, CGE_Model_Equations_Funcion)





#________ END OF MODEL  ########################################################

I would really appreciate people's input and help with this. Thank you in advance.

1 Like

Hi @Zac.Muscat maybe this link could help you.

gEcon - general equilibrium economic modelling language and solution framework

This topic was automatically closed 21 days after the last reply. New replies are no longer allowed.

If you have a query related to it or one of the replies, start a new topic and refer back with a link.