Ko, Inhwan, and Taedong Lee. Carbon pricing and decoupling between greenhouse gas emissions and economic growth: A panel study of 29 European countries, 1996-2014.

Accepted in the Review of Policy Research

Inhwan Ko
PhD student, Department of Political Science, University of Washington, Seattle, WA 98105

Taedong Lee, PhD
Associate Professor, Political Science Department, Seoul, Korea

Abstract

This study explores why the levels of decoupling between greenhouse gas (GHG) emissions and economic growth vary across time and countries by examining to which extent carbon pricing instruments which factors are driving this decoupling. We expect that the implementation of carbon pricing policies instruments facilitates decoupling, as they are designed to achieve cost-efficient GHG reduction. We analyze a panel data of 29 European countries between 1996 and 2014 to examine the relationships between two carbon pricing policies instruments (emission trading and carbon tax) and emission intensity (GHG emissions per unit of GDP) which we use to measure decoupling trends. Results from two-way fixed effects models show that emission trading contributes to decoupling, whereas our evidence does not support the role of carbon tax. Furthermore, emission trading is negatively associated with both emission intensity and GHG emissions, implying that it contributes to strong decoupling. Using coarsened exact matched (CEM) data, our results suggests that even a single emission trading policy (e.g., EU-ETS) across different jurisdictions may render a heterogeneous effect on decoupling depending on their socioeconomic conditions.

Data https://github.com/inhwanko/Carbon-Pricing-and-Decoupling/blob/master/decoupling.csv

1. Load neccessary packages and data

library(foreign)
library(tidyverse)
library(plm)
library(cem)
library(ggplot2)
library(ggpubr)
library(estimatr)
library(broom)
library(stargazer)
library(Hmisc)
library(MASS)
library(lmtest)
library(simcf)
library(tile)

# setwd("~")
rawdata <- read.csv("decoupling.csv") ## raw dataset is uploaded on the github 
rawdata <- as_tibble(rawdata)
rawdata <- rawdata[,-1]
rawdata
## # A tibble: 667 x 25
##    countrycode  year emission       gdp gdpmil decoup    pop  gdppc emission1996
##    <chr>       <int>    <dbl>     <dbl>  <dbl>  <dbl>  <int>  <dbl>        <dbl>
##  1 AUT          1996     84.1   2.97e11 2.97e5   283. 7.96e6 37346.        1    
##  2 AUT          1997     83.7   3.03e11 3.03e5   276. 7.97e6 38085.        0.996
##  3 AUT          1998     83.1   3.14e11 3.14e5   264. 7.98e6 39405.        0.988
##  4 AUT          1999     81.5   3.26e11 3.26e5   250. 7.99e6 40727.        0.969
##  5 AUT          2000     82.0   3.36e11 3.36e5   244. 8.01e6 42001.        0.975
##  6 AUT          2001     85.8   3.41e11 3.41e5   252. 8.04e6 42371.        1.02 
##  7 AUT          2002     87.5   3.46e11 3.46e5   253. 8.08e6 42859.        1.04 
##  8 AUT          2003     93.0   3.5 e11 3.50e5   266. 8.12e6 43053.        1.11 
##  9 AUT          2004     92.9   3.59e11 3.59e5   259. 8.17e6 43957.        1.10 
## 10 AUT          2005     94.4   3.67e11 3.67e5   257. 8.23e6 44638.        1.12 
## # ... with 657 more rows, and 16 more variables: gdp1996 <dbl>, ets <int>,
## #   carbontax <int>, co2inten <dbl>, epdtloss <dbl>, consumere <dbl>,
## #   consumeff <dbl>, urbanpop <int>, urbanpopper <dbl>, gdpgrowth <dbl>,
## #   polity <int>, indpergdp <dbl>, co2fromelec <dbl>, co2fromind <dbl>,
## #   goveff <dbl>, regqual <dbl>

2. Data cleaning

rawdata$gdpgrowth <- as.numeric(rawdata$gdpgrowth)
data <- rawdata %>% 
  filter(year!=2015 & year!=2016 & year!=2017 & year!=2018)

data <- pdata.frame(data, index=c("countrycode","year"))

data$time <- as.numeric(data$year)-1995
unique(data$countrycode)
##  [1] AUT BEL BGR CRO CYP CZE DEN EST FIN FRN GER GRE HUN IRL ITA LAT LIT NLD NOR
## [20] POL POR ROM SLK SLV SPN SWE SWZ TUR UNK
## 29 Levels: AUT BEL BGR CRO CYP CZE DEN EST FIN FRN GER GRE HUN IRL ITA ... UNK

3. Model results

3.1. Setting up the formuli

colnames(data)
##  [1] "countrycode"  "year"         "emission"     "gdp"          "gdpmil"      
##  [6] "decoup"       "pop"          "gdppc"        "emission1996" "gdp1996"     
## [11] "ets"          "carbontax"    "co2inten"     "epdtloss"     "consumere"   
## [16] "consumeff"    "urbanpop"     "urbanpopper"  "gdpgrowth"    "polity"      
## [21] "indpergdp"    "co2fromelec"  "co2fromind"   "goveff"       "regqual"     
## [26] "time"
formula1 <- decoup ~ ets + carbontax + co2inten + epdtloss + consumere + consumeff + urbanpopper + polity + gdpgrowth + indpergdp
formula2 <- decoup ~ ets*goveff + carbontax*goveff + co2inten + epdtloss + consumere + consumeff + urbanpopper + polity + goveff + gdpgrowth + indpergdp

formula3 <- emission ~ ets + carbontax + co2inten + epdtloss + consumere + consumeff + urbanpopper + polity + gdpgrowth + indpergdp
formula4 <- emission ~ ets*goveff + carbontax*goveff + co2inten + epdtloss + consumere + consumeff + urbanpopper + polity + goveff + gdpgrowth + indpergdp

3.2. A Hausman test

model1f <- plm(formula1, data=data, model="within", effect = "twoway")
model1r <- plm(formula1, data=data, model="random", effect = "twoway")
phtest(model1f, model1r) 
## 
##  Hausman Test
## 
## data:  formula1
## chisq = 71.846, df = 10, p-value = 1.949e-11
## alternative hypothesis: one model is inconsistent
model2f <- plm(formula2, data=data, model="within", effect = "twoway")
model2r <- plm(formula2, data=data, model="random", effect = "twoway")
phtest(model2f, model2r) 
## 
##  Hausman Test
## 
## data:  formula2
## chisq = 26.02, df = 13, p-value = 0.0169
## alternative hypothesis: one model is inconsistent
model3f <- plm(formula3, data=data, model="within", effect = "twoway")
model3r <- plm(formula3, data=data, model="random", effect = "twoway")
phtest(model3f, model3r) 
## 
##  Hausman Test
## 
## data:  formula3
## chisq = 26.547, df = 10, p-value = 0.00307
## alternative hypothesis: one model is inconsistent
model4f <- plm(formula4, data=data, model="within", effect = "twoway")
model4r <- plm(formula4, data=data, model="random", effect = "twoway")
phtest(model4f, model4r) 
## 
##  Hausman Test
## 
## data:  formula4
## chisq = 18.703, df = 13, p-value = 0.1326
## alternative hypothesis: one model is inconsistent

3.3. Model results

summary(model1f, vcov=vcovSCC(model1f, type="HC4", cluster="group"))
## Twoways effects Within Model
## 
## Note: Coefficient variance-covariance matrix supplied: vcovSCC(model1f, type = "HC4", cluster = "group")
## 
## Call:
## plm(formula = formula1, data = data, effect = "twoway", model = "within")
## 
## Balanced Panel: n = 29, T = 19, N = 551
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -323.28319  -39.27869   -0.73165   38.30110  448.65369 
## 
## Coefficients:
##             Estimate Std. Error t-value Pr(>|t|)   
## ets         -86.3453    30.6218 -2.8197 0.005000 **
## carbontax   -28.2297    66.8969 -0.4220 0.673217   
## co2inten    150.0125   138.5149  1.0830 0.279334   
## epdtloss     12.7914     8.3236  1.5368 0.124993   
## consumere    -9.1054     8.3723 -1.0876 0.277315   
## consumeff    -7.8532     6.1750 -1.2718 0.204046   
## urbanpopper  14.4019     8.1289  1.7717 0.077063 . 
## polity      -10.6550    14.4609 -0.7368 0.461584   
## gdpgrowth    -3.0020     2.4070 -1.2472 0.212913   
## indpergdp   -20.0087     6.8025 -2.9414 0.003421 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    5571500
## Residual Sum of Squares: 3925100
## R-Squared:      0.2955
## Adj. R-Squared: 0.21564
## F-statistic: 8.02456 on 10 and 28 DF, p-value: 6.1008e-06
summary(model2f, vcov=vcovSCC(model2f, type="HC4", cluster="group"))
## Twoways effects Within Model
## 
## Note: Coefficient variance-covariance matrix supplied: vcovSCC(model2f, type = "HC4", cluster = "group")
## 
## Call:
## plm(formula = formula2, data = data, effect = "twoway", model = "within")
## 
## Balanced Panel: n = 29, T = 16, N = 464
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -200.0257  -32.2308    2.4306   29.7169  456.8989 
## 
## Coefficients:
##                    Estimate Std. Error t-value  Pr(>|t|)    
## ets              -250.22360   41.90844 -5.9707 5.149e-09 ***
## goveff           -167.55804   30.81147 -5.4382 9.303e-08 ***
## carbontax        -173.67289  162.82394 -1.0666  0.286771    
## co2inten           73.70499  108.24606  0.6809  0.496320    
## epdtloss            3.96408    2.94356  1.3467  0.178828    
## consumere          -7.56431    4.44852 -1.7004  0.089818 .  
## consumeff          -3.18205    4.25361 -0.7481  0.454842    
## urbanpopper         7.78227    7.34159  1.0600  0.289762    
## polity             -0.81087   17.01032 -0.0477  0.962003    
## gdpgrowth          -1.03773    1.75638 -0.5908  0.554959    
## indpergdp         -11.90196    3.81002 -3.1239  0.001913 ** 
## ets:goveff        133.82616   30.90794  4.3298 1.881e-05 ***
## goveff:carbontax   98.64526   82.88347  1.1902  0.234674    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    3951200
## Residual Sum of Squares: 2049000
## R-Squared:      0.48143
## Adj. R-Squared: 0.41007
## F-statistic: 18.1767 on 13 and 28 DF, p-value: 2.7276e-10
summary(model3f, vcov=vcovSCC(model3f, type="HC4", cluster="group"))
## Twoways effects Within Model
## 
## Note: Coefficient variance-covariance matrix supplied: vcovSCC(model3f, type = "HC4", cluster = "group")
## 
## Call:
## plm(formula = formula3, data = data, effect = "twoway", model = "within")
## 
## Balanced Panel: n = 29, T = 19, N = 551
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -102.5961   -8.6111   -0.6676    8.6143  110.0521 
## 
## Coefficients:
##              Estimate Std. Error t-value Pr(>|t|)  
## ets         -31.25065   17.76244 -1.7594  0.07913 .
## carbontax   -13.87661   14.97463 -0.9267  0.35455  
## co2inten    -42.58040   50.01243 -0.8514  0.39496  
## epdtloss     -1.67242    1.27840 -1.3082  0.19141  
## consumere    -2.85157    1.42212 -2.0052  0.04549 *
## consumeff     2.06128    1.56631  1.3160  0.18878  
## urbanpopper  -0.18266    1.35319 -0.1350  0.89268  
## polity       -1.05860    1.01068 -1.0474  0.29542  
## gdpgrowth    -0.33117    0.65982 -0.5019  0.61595  
## indpergdp     1.64337    1.24842  1.3164  0.18866  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    321400
## Residual Sum of Squares: 253950
## R-Squared:      0.20988
## Adj. R-Squared: 0.12032
## F-statistic: 2.19164 on 10 and 28 DF, p-value: 0.049844
summary(model4f, vcov=vcovSCC(model4f, type="HC4", cluster="group"))
## Twoways effects Within Model
## 
## Note: Coefficient variance-covariance matrix supplied: vcovSCC(model4f, type = "HC4", cluster = "group")
## 
## Call:
## plm(formula = formula4, data = data, effect = "twoway", model = "within")
## 
## Balanced Panel: n = 29, T = 16, N = 464
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -92.76194  -7.81111  -0.56694   7.65848 114.91405 
## 
## Coefficients:
##                   Estimate Std. Error t-value Pr(>|t|)  
## ets              -17.54182   16.64608 -1.0538  0.29259  
## goveff            35.44115   23.85778  1.4855  0.13818  
## carbontax         -9.50210   20.51410 -0.4632  0.64347  
## co2inten         -29.03067   44.58541 -0.6511  0.51533  
## epdtloss          -1.14097    0.96305 -1.1848  0.23681  
## consumere         -2.51120    1.23846 -2.0277  0.04324 *
## consumeff          1.70736    1.42064  1.2018  0.23013  
## urbanpopper        1.13455    1.76508  0.6428  0.52073  
## polity            -2.23973    1.24557 -1.7982  0.07289 .
## gdpgrowth         -0.69545    0.55919 -1.2437  0.21434  
## indpergdp          0.98959    1.06514  0.9291  0.35340  
## ets:goveff        -4.32795    6.49951 -0.6659  0.50586  
## goveff:carbontax  -2.03312   17.44472 -0.1165  0.90728  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    267120
## Residual Sum of Squares: 203900
## R-Squared:      0.23669
## Adj. R-Squared: 0.13167
## F-statistic: 5.30476 on 13 and 28 DF, p-value: 0.00010822

3.4. Interaction for Model 1

formula1.2 <- decoup ~ ets + carbontax + co2inten*ets + epdtloss*ets + consumere*ets + consumeff*ets + urbanpopper*ets + polity*ets + gdpgrowth*ets + indpergdp*ets

model1.2f <- plm(formula1.2, data=data, model="within", effect="twoway")
summary(model1.2f, vcov=vcovSCC(model1.2f, type="HC4", cluster="group"))
## Twoways effects Within Model
## 
## Note: Coefficient variance-covariance matrix supplied: vcovSCC(model1.2f, type = "HC4", cluster = "group")
## 
## Call:
## plm(formula = formula1.2, data = data, effect = "twoway", model = "within")
## 
## Balanced Panel: n = 29, T = 19, N = 551
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -240.63873  -30.98157   -0.26773   28.87266  379.96986 
## 
## Coefficients:
##                   Estimate Std. Error t-value  Pr(>|t|)    
## ets             -420.41238  254.20719 -1.6538 0.0988102 .  
## carbontax          5.31977   61.80809  0.0861 0.9314469    
## co2inten         128.78785  142.28132  0.9052 0.3658273    
## epdtloss          14.95955    7.95784  1.8799 0.0607263 .  
## consumere        -15.58566    6.51232 -2.3933 0.0170780 *  
## consumeff         -8.72123    7.41116 -1.1768 0.2398635    
## urbanpopper        1.89767    6.25880  0.3032 0.7618668    
## polity            -8.93076   12.93623 -0.6904 0.4902922    
## gdpgrowth         -6.08276    3.24221 -1.8761 0.0612387 .  
## indpergdp         -7.44570    4.99890 -1.4895 0.1370132    
## ets:co2inten     -74.26593   25.37635 -2.9266 0.0035876 ** 
## ets:epdtloss     -14.96581    6.17023 -2.4255 0.0156511 *  
## ets:consumere      5.96390    1.26813  4.7029 3.347e-06 ***
## ets:consumeff      2.53155    0.93849  2.6975 0.0072297 ** 
## ets:urbanpopper    1.78814    0.82522  2.1669 0.0307301 *  
## ets:polity        55.09310   20.00470  2.7540 0.0061077 ** 
## ets:gdpgrowth      6.88963    3.79681  1.8146 0.0702043 .  
## ets:indpergdp    -13.31718    3.49880 -3.8062 0.0001591 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    5571500
## Residual Sum of Squares: 2452500
## R-Squared:      0.55982
## Adj. R-Squared: 0.50185
## F-statistic: 210.859 on 18 and 28 DF, p-value: < 2.22e-16

4. Coarsened Exact Matching

require(cem)

## assigning treatment value (1- ETS, 0- No ETS)

ets1 <- which(data$ets==1)
ets0 <- which(data$ets==0)
nets1 <- length(ets1)
nets0 <- length(ets0)

## checking naive mean difference

mean(data$decoup[ets1])-mean(data$decoup[ets0])
## [1] -136.7354
## assigning control variables (including carbon tax)

vars_ets <- c("carbontax", "co2inten","epdtloss","consumere","consumeff","urbanpopper","polity","gdpgrowth","indpergdp")

## you will only need variables to do the matching, without countrycode and year
colnames(data)
##  [1] "countrycode"  "year"         "emission"     "gdp"          "gdpmil"      
##  [6] "decoup"       "pop"          "gdppc"        "emission1996" "gdp1996"     
## [11] "ets"          "carbontax"    "co2inten"     "epdtloss"     "consumere"   
## [16] "consumeff"    "urbanpop"     "urbanpopper"  "gdpgrowth"    "polity"      
## [21] "indpergdp"    "co2fromelec"  "co2fromind"   "goveff"       "regqual"     
## [26] "time"
data_ets <- data[,c(6,11,12,13,14,15,16,18,20,19,21)]

## deriving univariate imbalance measures:

imbalance(group=data_ets$ets, data=data_ets[vars_ets])
## 
## Multivariate Imbalance Measure: L1=0.936
## Percentage of local common support: LCS=3.6%
## 
## Univariate Imbalance Measures:
## 
##               statistic   type         L1        min       25%       50%
## carbontax   -0.09501916 (diff) 0.09501916   0.000000  0.000000  0.000000
## co2inten     0.11219157 (diff) 0.06168582   0.110000  0.070000  0.150000
## epdtloss     2.16817241 (diff) 0.19731801   1.620000  0.850000  0.960000
## consumere   -2.42418774 (diff) 0.05134100  -0.500000 -2.940000 -2.740000
## consumeff    3.12078544 (diff) 0.00000000  13.030000 -4.770000  4.840000
## urbanpopper -2.02816858 (diff) 0.00000000   0.890000 -2.660000 -1.190000
## polity      -0.43180077 (diff) 0.01034483 -13.000000  0.000000  0.000000
## gdpgrowth    1.98089272 (diff) 0.19808429   7.430000  1.910000  1.870000
## indpergdp    1.71769300 (diff) 0.24559387   6.037819  3.210402  1.337763
##                   75%        max
## carbontax   -1.000000  0.0000000
## co2inten     0.280000  0.0600000
## epdtloss     3.490000 24.6000000
## consumere   -2.710000  1.7000000
## consumeff    4.240000  1.0200000
## urbanpopper -3.420000 -0.4700000
## polity       0.000000  0.0000000
## gdpgrowth    1.500000 -0.0900000
## indpergdp    1.103745 -0.6309908
## do matching
mat <- cem(treatment="ets", data=data_ets, drop="decoup")
mat
##            G0  G1
## All       290 261
## Matched    32  27
## Unmatched 258 234
ets_linear <- att(mat, decoup~ets, data=data_ets, model="linear")

ets_linear_control <- att(mat, decoup~ets + carbontax + co2inten + epdtloss + consumere + consumeff + urbanpopper + polity + gdpgrowth + indpergdp, data=data_ets,
                  model="linear") 

ets_linearRE_control <- att(mat, decoup~ets + carbontax + co2inten + epdtloss + consumere + consumeff + urbanpopper + polity + gdpgrowth + indpergdp, data=data_ets,
                  model="linear-RE") 

ets_linear ## first row of table 
## 
##            G0  G1
## All       290 261
## Matched    32  27
## Unmatched 258 234
## 
## Linear regression model on CEM matched data:
## 
## SATT point estimate: -47.727956 (p.value=0.486226)
## 95% conf. interval: [-181.194960, 85.739047]
ets_linear_control ## second row of the table
## 
##            G0  G1
## All       290 261
## Matched    32  27
## Unmatched 258 234
## 
## Linear regression model on CEM matched data:
## 
## SATT point estimate: -28.561090 (p.value=0.246748)
## 95% conf. interval: [-76.300551, 19.178372]
ets_linearRE_control ## third row of the table
## 
##            G0  G1
## All       290 261
## Matched    32  27
## Unmatched 258 234
## 
## Linear random effect model on CEM matched data:
## 
## SATT point estimate: -31.147152 (p.value=2.000000)
## 95% conf. interval: [-36.196765, -26.097539]

5. Plots

Figure 1

plot1 <- ggplot(data, aes(x=year)) + 
  geom_point(aes(y=emission1996)) +
  geom_line(aes(y=gdp1996, group=1)) +
  labs(x="Year", y="Real GDP of USD 2010 constant and CO2eq emission (1=1996)") +
  theme(axis.title.x=element_text(size=14)) +
  theme(axis.title.y=element_text(size=14)) +
  scale_x_discrete(breaks=c(2000, 2005, 2010)) +
  facet_wrap(~countrycode, nrow=5)
# + ggtitle("Figure 1. Small multiples of decoupling trend in each country, 29 #European countries, 1996-2014")

plot1 + theme_gray(base_size=15)

Figure 2

summary(model2f, vcov=vcovSCC(model2f, type="HC4", cluster="group"))
## Twoways effects Within Model
## 
## Note: Coefficient variance-covariance matrix supplied: vcovSCC(model2f, type = "HC4", cluster = "group")
## 
## Call:
## plm(formula = formula2, data = data, effect = "twoway", model = "within")
## 
## Balanced Panel: n = 29, T = 16, N = 464
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -200.0257  -32.2308    2.4306   29.7169  456.8989 
## 
## Coefficients:
##                    Estimate Std. Error t-value  Pr(>|t|)    
## ets              -250.22360   41.90844 -5.9707 5.149e-09 ***
## goveff           -167.55804   30.81147 -5.4382 9.303e-08 ***
## carbontax        -173.67289  162.82394 -1.0666  0.286771    
## co2inten           73.70499  108.24606  0.6809  0.496320    
## epdtloss            3.96408    2.94356  1.3467  0.178828    
## consumere          -7.56431    4.44852 -1.7004  0.089818 .  
## consumeff          -3.18205    4.25361 -0.7481  0.454842    
## urbanpopper         7.78227    7.34159  1.0600  0.289762    
## polity             -0.81087   17.01032 -0.0477  0.962003    
## gdpgrowth          -1.03773    1.75638 -0.5908  0.554959    
## indpergdp         -11.90196    3.81002 -3.1239  0.001913 ** 
## ets:goveff        133.82616   30.90794  4.3298 1.881e-05 ***
## goveff:carbontax   98.64526   82.88347  1.1902  0.234674    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    3951200
## Residual Sum of Squares: 2049000
## R-Squared:      0.48143
## Adj. R-Squared: 0.41007
## F-statistic: 18.1767 on 13 and 28 DF, p-value: 2.7276e-10
set.seed(2020)
simbeta <- mvrnorm(10000, 
                   coefficients(model2f), 
                   vcovSCC(model2f, type="HC4", cluster="group"))

simbeta <- simbeta[, c(1,2,12)]
simcoef <- colMeans(simbeta)
simlwr <- c(quantile(simbeta[,1],0.025), 
            quantile(simbeta[,2],0.025), 
            quantile(simbeta[,3],0.025))
simupr <- c(quantile(simbeta[,1],0.975), 
            quantile(simbeta[,2],0.975), 
            quantile(simbeta[,3],0.975))

x2 <- seq(-2.5, 2.5, by=0.1)
x1 <- rep(1,length(x2))
y <- simcoef[1]*x1 + simcoef[2]*x2 + simcoef[3]*x1*x2
lwr <- simlwr[1]*x1 + simlwr[2]*x2 + simlwr[3]*x1*x2
upr <- simupr[1]*x1 + simupr[2]*x2 + simupr[3]*x1*x2

interact <- data.frame(y=y, x1=x1, x2=x2, lwr=lwr, upr=upr)

col <- RColorBrewer::brewer.pal(3, "Set3")

figure2.1 <- ggplot(interact, aes(x=x2,y=y)) +
  geom_line(col=col[3], size=1) +
  geom_ribbon(aes(ymin=lwr, ymax=upr, fill=col[3]), alpha=0.2) +
  theme_minimal(base_size=15) +
  xlab("Government effectiveness score") + 
  ylab("Marginal effect on emission intensity") +
  annotate("text", x=0, y=0, 
           label="When emission trading is in effect", fontface=2, size=5)

figure2.1 <- figure2.1 + theme(legend.position="none")

x2 <- seq(-2.5, 2.5, by=0.1)
x1 <- rep(0,length(x2))
y <- simcoef[1]*x1 + simcoef[2]*x2 + simcoef[3]*x1*x2
lwr <- simlwr[1]*x1 + simlwr[2]*x2 + simlwr[3]*x1*x2
upr <- simupr[1]*x1 + simupr[2]*x2 + simupr[3]*x1*x2

interact <- data.frame(y=y, x1=x1, x2=x2, lwr=lwr, upr=upr)

figure2.2 <- ggplot(interact, aes(x=x2,y=y)) +
  geom_line(col=col[3], size=1) +
  geom_ribbon(aes(ymin=lwr, ymax=upr, fill=col[3]), alpha=0.2) +
  theme_minimal(base_size=15) +
  xlab("Government effectiveness score") + 
  ylab("Marginal effect on emission intensity") +
  annotate("text", x=0, y=500, 
           label="When emission trading is not in effect", fontface=2, size=5)

figure2.2 <- figure2.2 + theme(legend.position="none")

figure2 <- ggarrange(figure2.1, figure2.2)
figure2

Figure 3

plot(ets_linear_control, mat, data_ets, vars_ets)

plot(ets_linearRE_control, mat, data_ets, vars_ets)