# 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