gemTax_5_4: A General Equilibrium Model with Tax (see Cardenete et al.,...

View source: R/gemTax_5_4.R

gemTax_5_4R Documentation

A General Equilibrium Model with Tax (see Cardenete et al., 2012).

Description

A general equilibrium model with tax (see chapter 4, Cardenete et al., 2012), wherein there are 5 commodities (i.e. product 1, product 2, labor, capital goods, and tax receipt) and 4 agents (i.e. 2 firms and 2 consumers).

Usage

gemTax_5_4(
  dstl,
  names.commodity = c("prod1", "prod2", "lab", "cap", "tax"),
  names.agent = c("taxed.firm1", "taxed.firm2", "consumer1", "consumer2"),
  delta = 1,
  supply.lab.consumer1 = 30,
  supply.cap.consumer1 = 20,
  supply.lab.consumer2 = 20,
  supply.cap.consumer2 = 5,
  policy.tax = NULL
)

Arguments

dstl

the demand structure tree list.

names.commodity

names of commodities.

names.agent

names of agents.

delta

the proportion of tax revenue allocated to consumer 1. 1-delta is the proportion of tax revenue allocated to consumer 2.

supply.lab.consumer1

the labor supply of consumer 1.

supply.cap.consumer1

the capital supply of consumer 1.

supply.lab.consumer2

the labor supply of consumer 2.

supply.cap.consumer2

the capital supply of consumer 2.

policy.tax

a tax policy function (see sdm2).

Value

A general equilibrium (see sdm2), wherein labor is the numeraire.

References

Manuel Alejandro Cardenete, Ana-Isabel Guerra, Ferran Sancho (2012, ISBN: 9783642247453) Applied General Equilibrium: An Introduction. Springer-Verlag Berlin Heidelberg.

Examples


dst.consumer1 <- node_new("utility",
  type = "CD",
  alpha = 1,
  beta = c(0.3, 0.7),
  "prod1", "prod2"
)

dst.consumer2 <- Clone(dst.consumer1)
dst.consumer2$beta <- c(0.6, 0.4)

dst.firm1 <- node_new("output",
  type = "Leontief",
  a = c(0.5, 0.2, 0.3),
  "VA", "prod1", "prod2"
)
node_set(dst.firm1, "VA",
  type = "CD",
  alpha = 0.8^-0.8 * 0.2^-0.2,
  beta = c(0.8, 0.2),
  "lab", "cap"
)

dst.firm2 <- Clone(dst.firm1)
node_set(dst.firm2, "output",
  a = c(0.25, 0.5, 0.25)
)
node_set(dst.firm2, "VA",
  alpha = 0.4^-0.4 * 0.6^-0.6,
  beta = c(0.4, 0.6)
)

## no taxation
dstl <- list(dst.firm1, dst.firm2, dst.consumer1, dst.consumer2)
ge <- gemTax_5_4(dstl, delta = 1)

## ad valorem output tax (see Table 4.1)
output.tax.rate <- 0.1
dst.taxed.firm1 <- node_new("taxed.output",
  type = "FIN", rate = c(1, output.tax.rate),
  dst.firm1, "tax"
)
node_plot(dst.taxed.firm1)

dst.taxed.firm2 <- node_new("taxed.output",
  type = "FIN", rate = c(1, output.tax.rate),
  dst.firm2, "tax"
)
node_plot(dst.taxed.firm2)

dstl <- list(dst.taxed.firm1, dst.taxed.firm2, dst.consumer1, dst.consumer2)

ge.output.tax1 <- gemTax_5_4(dstl, delta = 1)
ge.output.tax2 <- gemTax_5_4(dstl, delta = 0.5)
ge.output.tax3 <- gemTax_5_4(dstl, delta = 0)

## labor tax (see Table 4.3)
lab.tax.rate <- 0.1

dst.taxed.lab <- node_new("taxed.lab",
  type = "FIN",
  rate = c(1, lab.tax.rate),
  "lab",
  "tax"
)

dst.labor.taxed.firm1 <- Clone(dst.firm1)
node_prune(dst.labor.taxed.firm1, "lab", "cap")
node_set(
  dst.labor.taxed.firm1, "VA",
  dst.taxed.lab,
  "cap"
)

dst.labor.taxed.firm2 <- Clone(dst.labor.taxed.firm1)
node_set(dst.labor.taxed.firm2, "output",
  a = c(0.25, 0.5, 0.25)
)
node_set(dst.labor.taxed.firm2, "VA",
  alpha = 0.4^-0.4 * 0.6^-0.6,
  beta = c(0.4, 0.6)
)

dstl.labor.tax <- list(dst.labor.taxed.firm1, dst.labor.taxed.firm2, dst.consumer1, dst.consumer2)

ge.lab.tax <- gemTax_5_4(dstl.labor.tax, delta = 0.5)

ge.lab.tax$p
ge.lab.tax$z / ge$z - 1

## income tax (see Table 4.3)
income.tax.rate <- 0.2
consumption.tax.rate <- income.tax.rate / (1 - income.tax.rate)
dst.taxed.consumer1 <- node_new("taxed.utility",
  type = "FIN",
  rate = c(1, consumption.tax.rate),
  dst.consumer1,
  "tax"
)

dst.taxed.consumer2 <- node_new("taxed.utility",
  type = "FIN",
  rate = c(1, consumption.tax.rate),
  dst.consumer2,
  "tax"
)

dstl <- list(dst.firm1, dst.firm2, dst.taxed.consumer1, dst.taxed.consumer2)

ge.income.tax <- gemTax_5_4(dstl, delta = 0.5)
ge.income.tax$z / ge$z - 1

## labor tax (see Table 4.3)
lab.tax.rate <- 0.3742
node_set(dst.labor.taxed.firm1, "taxed.lab",
  rate = c(1, lab.tax.rate)
)
node_set(dst.labor.taxed.firm2, "taxed.lab",
  rate = c(1, lab.tax.rate)
)

ge.lab.tax <- gemTax_5_4(list(
  dst.labor.taxed.firm1,
  dst.labor.taxed.firm2,
  dst.consumer1,
  dst.consumer2
), delta = 0.5)
ge.lab.tax$z / ge$z - 1

## variable labor tax rate
policy.var.tax.rate <- function(time, A, state) {
  current.tax.rate <- NA
  if (time >= 200) {
    tax.amount <- (state$p / state$p[3])[5]
    adjustment.ratio <- ratio_adjust(tax.amount / 18.7132504, coef = 0.1)
    last.tax.rate <- node_set(A[[1]], "taxed.lab")$rate[2]
    current.tax.rate <- last.tax.rate / adjustment.ratio
  } else {
    current.tax.rate <- 0.1
  }
  node_set(A[[1]], "taxed.lab", rate = c(1, current.tax.rate))
  node_set(A[[2]], "taxed.lab", rate = c(1, current.tax.rate))

  state$current.policy.data <- c(time, current.tax.rate)
  state
}

ge.var.lab.tax <- gemTax_5_4(dstl.labor.tax, policy = policy.var.tax.rate)
matplot(ge.var.lab.tax$ts.z, type = "l")
matplot(ge.var.lab.tax$ts.p / ge.var.lab.tax$p[3], type = "l")
plot(ge.var.lab.tax$policy.data[, 1], ge.var.lab.tax$policy.data[, 2],
  ylab = "labor tax rate"
)
ge.var.lab.tax$p / ge.var.lab.tax$p[3]



GE documentation built on Nov. 8, 2023, 9:07 a.m.

Related to gemTax_5_4 in GE...