Skip to content

Economic Models in R (Partial and General Equilibrium)

License

Notifications You must be signed in to change notification settings

paulofelipe/emr

Repository files navigation

emr - Economic Models in R

Esta pacote tem o objetivo de possibilitar a definição e a execução de simulações de modelos de equilíbrio parcial e geral. A ideia é ser algo similar ao GAMS e GEMPACK.

A definição dos modelos segue a lógica discutida em A simple structure for CGE models by Xiao-guang Zhang.

Structure of variables and equations (Zhang, 2013)

Nessa abordagem, as variáveis exógenas e endógenas serão classificadas em dois tipos: definidas ou não-definidas. As variáveis exógenas, por definição, são definidas. As endógenas pode ser dos dois tipos. As variáveis definidas são aquelas que podem ser construídas a partir dos valores das demais variáveis, das chamadas equação de definição. Já as não-definidas são aquelas que os valores serão definidos a partir de condições de equilíbrio de mercado (MCCs).

Primeiro Exemplo - Modelo de Armington

O modelo de armington consiste no problema do consumidor que deve alocar sua renda em produtos de (N) diferentes origens, que chamaremos de variedades. O consumidor tem uma função de utilidade do tipo CES com elasticidade de substituição. Dessa forma, o problema do consumidor é o seguinte:

[ \max_{{c_1,...,c_n}}U = \left[\sum_{i=1}^N\alpha_i^\frac{1-\sigma}{\sigma} c_i^\frac{\sigma-1}{\sigma}\right]^\frac{\sigma}{\sigma-1}]

[ s.a. \sum_{i=1}^N p_ic_i = R,]

onde (p_i = p_i^s(1+t_i)) é o preço pago ao produtor adicionado de uma tarifa ad valorem (t_i).

Resolvendo o problema do consumidor, chega-se a seguinte equação de demanda para a variedade (i):

[c_i = \left(\frac{\alpha_i p_i}{P}\right)^{-\sigma} Q] onde (Q=R/P) e (P) é o índice de preços da CES que tem a seguinte formula:

[ P = \left[\sum_i (\alpha_i p_i)^{1-\sigma}\right]^\frac{1}{1-\sigma}]

Adicionalmente, pode-se definir uma função de demanda total do tipo elasticidade constante:

[Q = k^d P^{\eta}]

onde (\eta < 0) é elasticidade-preço da demanda.

Por fim, a oferta de cada variedade também é dada por uma função do tipo elasticidade constante:

[ q_i = k^s \left(\frac{p_i}{1+t_i}\right)^{\epsilon_i}]

Dessa forma, o sistema é formado por essas equações para as variáveis (Q) (definida), (q_i) (definida), (c_i) (definida), (P) (definida) e (p_i) (não-definida):

  • Demanda Total:

[Q = k^d P^{\eta}]

  • Oferta da variedade (i):

[ q_i = k^s \left(\frac{p_i}{1+t_i}\right)^{\epsilon_i}]

  • Demanda pela variedade (i):

[c_i = \left(\frac{\alpha_i p_i}{P}\right)^{-\sigma} Q]

  • Índice de preços:

[ P = \left[\sum_i (\alpha_i p_i)^{1-\sigma}\right]^\frac{1}{1-\sigma}]

  • Condição de equilíbrio (para a variável (p_i)):

[c_i = q_i]

Agora, vamos definir o modelo no R. Para isso, vamos escrever as equações em variações exatas. Isto é, a variação de uma variável (x) entre o equilíbrio base e o novo equilíbrio ((x')) é denotada por (\hat{x} = \frac{x'}{x}).

Para construir o modelo, precisaremos definir os conjuntos de índices (por exemplo, o nome das regiões fornecedoras (i)), os parâmetros (acomoda parâmetros e variáveis exógenas), as variáveis e as equações.

library(emr) #load the package!
library(tidyverse)

params <- list()
variables <- list()
equations <- list()
sets <- list()

Sets

Começando pelo conjunto de índices:

sets[['REG']] <-c("reg1", "reg2", "reg3")

Parâmetros

Agora iremos definir os parâmetros:

params[["sigma"]] <- create_param(
  value = 4,
  indexes = list(sigma = "sigma"),
  desc = "elasticity of substitution"
)

params[["eta"]] <- create_param(
  value = -1,
  indexes = list(eta = "eta"),
  desc = "price elasticity of total demand"
)

params[["epsilon"]] <- create_param(
  value = c(1, 10, 10),
  indexes = sets['REG'],
  desc = "price elasticity of individuals supplies"
)

params[["tau"]] <- create_param(
  value = c(1, 1, 1),
  indexes = sets['REG'],
  desc = "change in the tarrif power (1 + t)"
)

# v0 will be used to compute shares
params[["v0"]] <- create_param(
  value = c(60, 30, 10),
  indexes = sets['REG'],
  desc = "initial values"
)

params
## $sigma
## $sigma$value
## sigma 
##     4 
## 
## $sigma$desc
## [1] "elasticity of substitution"
## 
## 
## $eta
## $eta$value
## eta 
##  -1 
## 
## $eta$desc
## [1] "price elasticity of total demand"
## 
## 
## $epsilon
## $epsilon$value
## reg1 reg2 reg3 
##    1   10   10 
## 
## $epsilon$desc
## [1] "price elasticity of individuals supplies"
## 
## 
## $tau
## $tau$value
## reg1 reg2 reg3 
##    1    1    1 
## 
## $tau$desc
## [1] "change in the tarrif power (1 + t)"
## 
## 
## $v0
## $v0$value
## reg1 reg2 reg3 
##   60   30   10 
## 
## $v0$desc
## [1] "initial values"

Índice de Preços

[ \hat{P} = \left[\sum_i \pi_ip_i^{1-\sigma}\right]^\frac{1}{1-\sigma},]

onde (\pi_i = \frac{v^0_i}{\sum_i v^0_i}) é o share da variedade (i) no dispêndio inicial. (v^0_i) é o dispêndio inicial em cada variedade (i).

variables[["P"]] <- create_variable(
  value = 1,
  indexes = list(P = "P"),
  type = "defined",
  desc = "change in price index"
)

equations[["E_P"]] <- create_equation(
  "P = sum(v0/sum(v0) * p^(1-sigma))^(1/(1-sigma))",
  type = 'defining',
  desc = "change in demand for variety i"
)

Demanda Total

[ \hat{Q} = \hat{P}^\eta ]

Inicialmente, é preciso definir as variáveis:

variables[["Q"]] <- create_variable(
  value = 1,
  indexes = list(Q = "Q"),
  type = "defined",
  desc = "change in total demand"
)

E na sequência a equação:

equations[["E_Q"]] <- create_equation(
  "Q = P^eta",
  type = "defining",
  desc = "change in total demand"
)

Oferta

[\hat{q}_i = \left(\frac{\hat{p_i}}{\hat{\tau_i}}\right)^{\epsilon_i} ] onde (\hat{\tau_i} = \frac{1 + \hat{t_i}}{1 + t_i}).

variables[["q"]] <- create_variable(
  value = 1,
  indexes = sets['REG'],
  type = "defined",
  desc = "change in supply by region"
)

equations[["E_q"]] <- create_equation(
  "q[i] = (p[i]/tau[i])^epsilon[i]",
  indexes = 'i in REG',
  type = 'defining',
  desc = "change in supply by region"
)

Demanda por variedade

[\hat{c}_i = \left(\frac{\hat{p}_i}{\hat{P}}\right)^{-\sigma} \hat{Q}]

variables[["c"]] <- create_variable(
  value = 1,
  indexes = sets['REG'],
  type = "defined",
  desc = "change in demand for variety i"
)

equations[["E_c"]] <- create_equation(
  "c[i] = (p[i]/P)^(-sigma) * Q",
  indexes = 'i in REG',
  type = 'defining',
  desc = "change in demand for variety i"
)

Equilíbrio de Mercado

[ \hat{q}_i = \hat{c}_i ]

variables[["p"]] <- create_variable(
  value = 1,
  indexes = sets['REG'],
  type = "undefined",
  desc = "change in price (including tariff) of variety supplied by region i"
)

equations[["E_p"]] <- create_equation(
  "c[i] - q[i]",
  indexes = 'i in REG',
  type = "mcc",
  desc = "equilibrium for variety i"
)

Objeto do Modelo

armington_model <- list(
  sets = sets,
  params = params,
  variables = variables,
  equations = equations
)

sol0 <- solve_emr(armington_model)
## Iteration:  0  ||F(x0)||:  0
armington_model$params$tau$value['reg2'] <- 1.1
sol1 <- solve_emr(armington_model, method = "nleqslv")

# Check the solution message
sol1$sol$message
## [1] "Function criterion near zero"
# See the results for the internal prices
enframe(sol1$variables$p) %>% 
  ggplot(aes(x = name, y = value - 1)) +
  geom_col(width = 0.7) +
  scale_y_continuous(labels = scales::percent) +
  labs(
    x = "Region",
    y = "Change in Prices"
  )

About

Economic Models in R (Partial and General Equilibrium)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published