Replica of the draft research article as follows:

Ko, Inhwan, and Taedong Lee. Carbon pricing policies and decoupling between greenhouse gas emissions and economic growth: A panel study of 30 European countries, 1996-2014. A paper under review by Global Environmental Politics journal (submitted on Feb 11 2020).

Authors’ bio

Inhwan Ko

PhD student, Department of Political Science, University of Washington, Seattle, US

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 between countries, and examines which factors are driving this decoupling. We argue that the implementation of carbon pricing policies facilitates decoupling, as they are designed to achieve cost-efficient GHG reduction. We analyze the panel data of 30 European countries between 1996 and 2014 to examine the relationships between two carbon pricing policies, emission trading and carbon tax, and emission intensity (GHG emissions per unit of GDP) we use to capture decoupling trends. Our result indicates that while controlling for factors that may affect emission intensity, emission trading contributes to decoupling in all models, whereas carbon tax does not; this has also been suggested in previous literature. Furthermore, emission trading is negatively associated with GHG emissions, implying that it contributes to not weak, but strong decoupling of economic growth from GHG emissions.

A full-version paper is uploaded in the same repository. Or, visit my github:

https://github.com/inhwanko/carbonpricing_decoupling

1. Data import

# attach necessary packages
library(foreign)
library(tidyverse)
library(plm)
library(cem)
library(ggplot2)
library(ggpubr)
library(clubSandwich)
library(estimatr)
library(broom)
library(stargazer)
library(Hmisc)
library(MASS)
library(lmtest)

# setwd("~")
data <- read.csv("decoupling.csv") ## raw dataset is uploaded on the github 
data <- as_tibble(data)
data ## the first column shows an encoding error (country), but it does not matter since we will use "countrycode". 
## # A tibble: 570 x 31
##    癤풻ountry countrycode  year    pop urbanpop urbanpopper emission
##    <fct>      <fct>       <int>  <int>    <int>       <dbl>    <dbl>
##  1 Austria    AUT          1996 7.96e6  5237033        65.8     84.5
##  2 Austria    AUT          1997 7.97e6  5242971        65.8     84.0
##  3 Austria    AUT          1998 7.98e6  5248727        65.8     83.4
##  4 Austria    AUT          1999 7.99e6  5258949        65.8     81.7
##  5 Austria    AUT          2000 8.01e6  5271610        65.8     82.2
##  6 Austria    AUT          2001 8.04e6  5291909        65.8     86.2
##  7 Austria    AUT          2002 8.08e6  5318413        65.8     87.8
##  8 Austria    AUT          2003 8.12e6  5344871        65.8     93.4
##  9 Austria    AUT          2004 8.17e6  5378625        65.8     93.4
## 10 Austria    AUT          2005 8.23e6  5415886        65.8     94.6
## # ... with 560 more rows, and 24 more variables: emission1996 <dbl>,
## #   emissionpc <dbl>, emissionpc1996 <dbl>, gdp <dbl>, gdpmil <dbl>,
## #   gdp1996 <dbl>, gdppc <dbl>, gdppc1996 <dbl>, gdpgrowth <dbl>, decoup <dbl>,
## #   consume <dbl>, eneuse <dbl>, consumeep <dbl>, consumeff <dbl>,
## #   consumere <dbl>, co2inten <dbl>, epdtloss <dbl>, manuperc <dbl>,
## #   manuexp <dbl>, polity <int>, ETS <int>, carbontax <int>, indpergdp <dbl>,
## #   elecprodfromfossil <dbl>

2. Data cleaning

data$gdpgrowth <- as.numeric(data$gdpgrowth)

## make data as balanced panel data
data1 <- data[,-27] # data without "policyIV" variable
data2 <- subset(data, subset=(data$countrycode!="ICE")) # data without ICELAND

## check if data are panel data
data1 <- pdata.frame(data1, index=c("countrycode","year"))
data2 <- pdata.frame(data2, index=c("countrycode","year"))

### deleting the first two rows that are NAs
# data1 <- data1[-c(1:2),]
# data2 <- data2[-c(1:2),]

### only leaving variables that are used for the analysis
data1 <- data1[,c(2,3,17,27,28,23,24,22,21,6,16,7,29,30)]
data2 <- data2[,c(2,3,17,28,29,23,24,22,21,27,6,16,30,31)]

3. Model results (Table 5)

## Model 1
model1f <- plm(decoup ~ ETS + carbontax +
                 co2inten + epdtloss +
                 consumere + consumeff +
                 urbanpopper + gdpgrowth, 
               data=data1, model="within")
model1r <- plm(decoup ~ ETS + carbontax +
                 co2inten + epdtloss +
                 consumere + consumeff +
                 urbanpopper + gdpgrowth, 
               data=data1, model="random")
phtest(model1f, model1r) 
## 
##  Hausman Test
## 
## data:  decoup ~ ETS + carbontax + co2inten + epdtloss + consumere +  ...
## chisq = 11.525, df = 8, p-value = 0.1737
## alternative hypothesis: one model is inconsistent
## Model 2
model2f <- plm(decoup ~ ETS + carbontax +
                 co2inten + epdtloss +
                 consumere + consumeff +
                 polity + urbanpopper + gdpgrowth, 
               data=data2, model="within")
model2r <- plm(decoup ~ ETS + carbontax +
                 co2inten + epdtloss +
                 consumere + consumeff +
                 polity + urbanpopper + gdpgrowth, 
               data=data2, model="random")
phtest(model2f, model2r) 
## 
##  Hausman Test
## 
## data:  decoup ~ ETS + carbontax + co2inten + epdtloss + consumere +  ...
## chisq = 23.65, df = 9, p-value = 0.004891
## alternative hypothesis: one model is inconsistent
## Model 3
model3f <- plm(emission ~ ETS + carbontax +
                 co2inten + epdtloss +
                 consumere + consumeff +
                 urbanpopper + gdpgrowth, 
               data=data1, model="within")
model3r <- plm(emission ~ ETS + carbontax +
                 co2inten + epdtloss +
                 consumere + consumeff +
                 urbanpopper + gdpgrowth, 
               data=data1, model="random")
phtest(model3f, model3r) 
## 
##  Hausman Test
## 
## data:  emission ~ ETS + carbontax + co2inten + epdtloss + consumere +  ...
## chisq = 1.2837, df = 8, p-value = 0.9957
## alternative hypothesis: one model is inconsistent

Model Results (Table 5)

stargazer(model1r, model2f, model3r, type='html') 
Dependent variable:
decoup emission
(1) (2) (3)
ETS -113.900*** -106.997*** -5.921**
(12.715) (13.256) (2.959)
carbontax -3.821 -40.295 -3.732
(25.071) (26.485) (5.573)
co2inten 125.954** 94.791 -30.056*
(60.948) (70.859) (15.784)
epdtloss 17.732*** 16.074*** -1.874***
(2.222) (2.233) (0.500)
consumere -11.550*** -16.812*** -2.114***
(2.120) (2.356) (0.512)
consumeff -7.962*** -8.022*** 1.742***
(2.244) (2.689) (0.597)
polity -21.301***
(4.233)
urbanpopper 0.924 5.300* 1.156*
(2.590) (3.026) (0.679)
gdpgrowth -3.134** -3.313** 0.303
(1.429) (1.405) (0.315)
Constant 847.860*** 102.821
(256.827) (76.732)
Observations 570 551 570
R2 0.449 0.516 0.214
Adjusted R2 0.441 0.481 0.203
F Statistic 456.815*** 60.746*** (df = 9; 513) 152.762***
Note: p<0.1; p<0.05; p<0.01

Appendix B

stargazer(model1f, model2r, model3f, type='html') 
Dependent variable:
decoup emission
(1) (2) (3)
ETS -119.208*** -102.500*** -6.030**
(13.509) (12.727) (2.988)
carbontax -4.896 -33.840 -3.616
(25.342) (26.177) (5.605)
co2inten 71.620 141.076** -29.259*
(72.650) (59.838) (16.069)
epdtloss 17.051*** 16.792*** -1.861***
(2.277) (2.192) (0.504)
consumere -12.472*** -15.464*** -2.069***
(2.341) (2.164) (0.518)
consumeff -6.820** -8.713*** 1.715***
(2.755) (2.209) (0.609)
polity -21.413***
(4.239)
urbanpopper 4.460 1.342 1.100
(3.126) (2.584) (0.691)
gdpgrowth -3.003** -3.433** 0.307
(1.431) (1.408) (0.316)
Constant 1,108.123***
(254.388)
Observations 570 551 570
R2 0.460 0.502 0.217
Adjusted R2 0.423 0.494 0.162
F Statistic (df = 8; 532) 56.716*** 545.689*** 18.389***
Note: p<0.1; p<0.05; p<0.01

4. T-test, ANOVA

## subsetting the data frame into pre- and post- ETS and carbon tax period

dataets1 <- subset(data, subset=(ETS==1))
dataets0 <- subset(data, subset=(ETS==0))
datatax1 <- subset(data, subset=(carbontax==1))
datatax0 <- subset(data, subset=(carbontax==0))

## T-test results

t.test(dataets1$emission, dataets0$emission)
## 
##  Welch Two Sample t-test
## 
## data:  dataets1$emission and dataets0$emission
## t = -0.055031, df = 561.4, p-value = 0.9561
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -40.56445  38.35341
## sample estimates:
## mean of x mean of y 
##  185.6074  186.7130
t.test(datatax1$emission, datatax0$emission)
## 
##  Welch Two Sample t-test
## 
## data:  datatax1$emission and datatax0$emission
## t = -7.4357, df = 534.71, p-value = 4.162e-13
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -155.7034  -90.6264
## sample estimates:
## mean of x mean of y 
##  97.38868 220.55358
## ANOVA preparation

anovadata <- data1
anovadata$ETS[anovadata$ETS==1] <- "ETS"
anovadata$ETS[anovadata$ETS==0] <- "No ETS"
anovadata$carbontax[anovadata$carbontax==1] <- "Carbon Tax"
anovadata$carbontax[anovadata$carbontax==0] <- "No Carbon Tax"

## ANOVA results

aov1 <- aov(decoup ~ ETS, data=anovadata)
summary(aov1)
##              Df   Sum Sq Mean Sq F value   Pr(>F)    
## ETS           1  2202703 2202703    17.5 3.32e-05 ***
## Residuals   568 71483425  125851                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
aov2 <- aov(decoup ~ carbontax, data=anovadata)
summary(aov2)
##              Df   Sum Sq Mean Sq F value Pr(>F)  
## carbontax     1   750210  750210   5.842  0.016 *
## Residuals   568 72935917  128408                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Tukey Honest Significant Difference test results (Table 3)

TukeyHSD(aov1)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = decoup ~ ETS, data = anovadata)
## 
## $ETS
##                diff      lwr      upr    p adj
## No ETS-ETS 124.6057 66.10472 183.1066 3.32e-05
TukeyHSD(aov2)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = decoup ~ carbontax, data = anovadata)
## 
## $carbontax
##                              diff      lwr      upr     p adj
## No Carbon Tax-Carbon Tax 80.89273 15.15889 146.6266 0.0159586

Boxplot of the sample means between treatment and control groups (Figure 3-4)

ggboxplot(anovadata, x="ETS", y="decoup",
          color="ETS", palette=c("#FC4E07","#00AFBB"),
          order=c("No ETS", "ETS"),
          ylab="Average Emission Intensity", xlab="Country Group with / without ETS")

ggboxplot(anovadata, x="carbontax", y="decoup",
          color="carbontax", palette=c("#FC4E07","#00AFBB"),
          order=c("No Carbon Tax", "Carbon Tax"),
          ylab="Average Emission Intensity", xlab="Country Group with / without Carbon Tax")

5. Coarsened Exact Matching results (Table 6)

require(cem)

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

ets1 <- which(data1$ETS==1)
ets0 <- which(data1$ETS==0)
nets1 <- length(ets1)
nets0 <- length(ets0)

## checking naive mean difference

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

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

## you will only need variables to do the matching, without countrycode and year
data_ets <- data1[,c(-1,-2,-12)]

## deriving univariate imbalance measures:

imbalance(group=data_ets$ETS, data=data_ets[vars_ets])
## 
## Multivariate Imbalance Measure: L1=0.906
## Percentage of local common support: LCS=5.0%
## 
## Univariate Imbalance Measures:
## 
##               statistic   type         L1   min   25%   50%   75%    max
## carbontax   -0.10432331 (diff) 0.10432331  0.00  0.00  0.00 -1.00   0.00
## co2inten     0.08631579 (diff) 0.02584586  0.18 -0.11  0.13  0.25   0.06
## epdtloss     2.09967105 (diff) 0.18656015  1.62  0.77  0.94  3.09  24.60
## consumere   -2.07184680 (diff) 0.07330827 -0.50 -2.86 -1.61 -1.71 -10.59
## consumeff    2.37847744 (diff) 0.00000000  5.90 -7.73  4.06  3.81   1.02
## urbanpopper -1.65820019 (diff) 0.00000000  0.89 -1.27 -1.04 -3.94  -0.47
## gdpgrowth    2.07469455 (diff) 0.20629699  7.43  1.92  1.90  1.50  -0.09
## do matching
mat <- cem(treatment="ETS", data=data_ets, drop="decoup")
## The data contain missing values. CEM will match on them; see the manual for other options.
mat
##            G0  G1
## All       304 266
## Matched    37  21
## Unmatched 267 245

Sample average treatment effect of the treated (SATT) in different models (Table 6)

ets_linear <- att(mat, decoup~ETS, data=data_ets, model="linear")

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

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

ets_linear ## first row of table 
## 
##            G0  G1
## All       304 266
## Matched    37  21
## Unmatched 267 245
## 
## Linear regression model on CEM matched data:
## 
## SATT point estimate: -53.187619 (p.value=0.458782)
## 95% conf. interval: [-192.925617, 86.550379]
ets_linear_control ## second row of the table
## 
##            G0  G1
## All       304 266
## Matched    37  21
## Unmatched 267 245
## 
## Linear regression model on CEM matched data:
## 
## SATT point estimate: -43.987407 (p.value=0.294288)
## 95% conf. interval: [-125.311959, 37.337144]
ets_linearRE_control ## third row of the table
## 
##            G0  G1
## All       304 266
## Matched    37  21
## Unmatched 267 245
## 
## Linear random effect model on CEM matched data:
## 
## SATT point estimate: -36.363530 (p.value=2.000000)
## 95% conf. interval: [-44.066542, -28.660518]

Though not included in the paper, we can draw a plot of the output of the SATT derived above. For instance, our finding is based on the linear random effects model with control variables, which exhibits statistically significant and negative coefficient estimate of the effect of ETS on emission intensity, can be plotted as below:

plot(ets_linearRE_control, mat, data_ets, vars_ets)

6. Plotting the figure 1 and 2

data <- data[-c(571,572),]
## Warning: The `i` argument of ``[.tbl_df`()` must lie in [-rows, 0] if negative, as of tibble 3.0.0.
## Use `NA` as row index to obtain a row full of `NA` values.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.
## Figure 1
plot1 <- ggplot(data, aes(year)) + 
  geom_point(aes(y=emission1996)) +
  geom_line(aes(y=gdp1996)) +
  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)) +
  facet_wrap(~countrycode, nrow=5)
plot1 + theme_gray()

## Figure 2
plot2 <- ggplot(data = data, aes(year,decoup)) + 
  geom_point() +
  labs(x="Year", y="Decoupling (Emission (kgCO2eq) per GDP $1,000)") +
  theme(axis.title.x=element_text(size=14)) +
  theme(axis.title.y=element_text(size=14)) +
  facet_wrap(~countrycode, nrow=5)
plot2 + theme_gray()

dataplot <- data %>% 
  filter(countrycode=="AUT" | countrycode=="SPN" | countrycode=="TUR")

plot3 <- ggplot(dataplot, aes(year)) +
  geom_point(aes(y=emission1996)) +
  geom_line(aes(y=gdp1996)) +
    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)) +
  facet_wrap(~countrycode, nrow=1)

plot3+theme_gray()

7. Cluster-robust standard errors

HC2_1f <- coef_test(model1f, vcov = "CR2", 
          cluster = "individual", test = "Satterthwaite")
HC2_1r <- coef_test(model1r, vcov = "CR2", 
          cluster = "individual", test = "Satterthwaite")
HC2_2f <- coef_test(model2f, vcov = "CR2", 
          cluster = "individual", test = "Satterthwaite")
HC2_2r <- coef_test(model2r, vcov = "CR2", 
          cluster = "individual", test = "Satterthwaite")

Plotting the results (not included in the paper)

HC2_1f # cluster-robust standard error model for Model 1 (fixed effects)
##         Coef. Estimate     SE  t-stat  d.f. p-val (Satt) Sig.
## 1         ETS  -119.21  29.96 -3.9795 25.19       <0.001  ***
## 2   carbontax    -4.90  80.69 -0.0607  5.54        0.954     
## 3    co2inten    71.62 229.78  0.3117  9.37        0.762     
## 4    epdtloss    17.05   9.82  1.7368  3.88        0.160     
## 5   consumere   -12.47  11.64 -1.0711  9.34        0.311     
## 6   consumeff    -6.82  11.50 -0.5930  6.26        0.574     
## 7 urbanpopper     4.46   9.38  0.4754  5.20        0.654     
## 8   gdpgrowth    -3.00   1.80 -1.6723 14.68        0.116
HC2_1r # cluster-robust standard error model for Model 1 (random effects)
##         Coef. Estimate      SE  t-stat  d.f. p-val (Satt) Sig.
## 1 (Intercept)  847.860 1003.94  0.8445 13.48       0.4131     
## 2         ETS -113.900   26.25 -4.3394 24.68       <0.001  ***
## 3   carbontax   -3.821   77.02 -0.0496  5.89       0.9621     
## 4    co2inten  125.954  166.60  0.7560  5.82       0.4791     
## 5    epdtloss   17.732    9.54  1.8580  4.14       0.1343     
## 6   consumere  -11.550    9.67 -1.1941 12.18       0.2552     
## 7   consumeff   -7.962    7.96 -0.9996  4.11       0.3727     
## 8 urbanpopper    0.924    6.17  0.1497  9.32       0.8842     
## 9   gdpgrowth   -3.134    1.78 -1.7641 14.91       0.0982    .
HC2_2f # cluster-robust standard error model for Model 2 (fixed effects)
##         Coef. Estimate     SE t-stat  d.f. p-val (Satt) Sig.
## 1         ETS  -107.00  26.17 -4.088 24.51       <0.001  ***
## 2   carbontax   -40.29  73.30 -0.550  4.18        0.611     
## 3    co2inten    94.79 222.88  0.425  9.02        0.681     
## 4    epdtloss    16.07  10.25  1.568  3.76        0.196     
## 5   consumere   -16.81  11.25 -1.495  8.63        0.171     
## 6   consumeff    -8.02  10.38 -0.773  5.95        0.469     
## 7      polity   -21.30  30.28 -0.703  1.44        0.578     
## 8 urbanpopper     5.30   9.29  0.570  5.10        0.593     
## 9   gdpgrowth    -3.31   1.79 -1.856 13.78        0.085    .
HC2_2r # cluster-robust standard error model for Model 2 (random effects)
##          Coef. Estimate      SE t-stat  d.f. p-val (Satt) Sig.
## 1  (Intercept)  1108.12 1035.70  1.070 13.31       0.3037     
## 2          ETS  -102.50   22.81 -4.493 23.82       <0.001  ***
## 3    carbontax   -33.84   73.06 -0.463  4.58       0.6644     
## 4     co2inten   141.08  165.34  0.853  5.71       0.4279     
## 5     epdtloss    16.79    9.77  1.718  3.98       0.1613     
## 6    consumere   -15.46    9.64 -1.603 11.62       0.1357     
## 7    consumeff    -8.71    7.50 -1.161  3.97       0.3107     
## 8       polity   -21.41   31.47 -0.680  1.43       0.5893     
## 9  urbanpopper     1.34    6.46  0.208  8.62       0.8402     
## 10   gdpgrowth    -3.43    1.84 -1.864 13.99       0.0834    .

8. Correlation table (Appendix A)

## 
data3 <- subset(data, subset=(data$countrycode!="ICE")) ## data without ICELAND
data3 <- pdata.frame(data3, index=c("countrycode","year"))
data3 <- data3[-c(1:2),]

## re-extract necessary variables
cordata <- data3[, c(17,28,29,23,24,22,21,6,16,27)]

## correlation and its p-value table
corp <- rcorr(as.matrix(cordata))

## save them seperately into two variables
corp1 <- data.frame(corp$r)
corp2 <- data.frame(corp$P)

## allow round for p-value table up to 10^-3
corp2<-round(corp2, 3)

## save them in a different excel file
write.csv(corp1, "corp1.csv")
## Warning in close.connection(file): Problem closing connection: Invalid argument
write.csv(corp2, "corp2.csv")

9. Interaction term + other specifications

model4f <- plm(decoup ~ ETS*consumeff + ETS*consumere + carbontax +
                 co2inten + epdtloss +
                 consumere +
                 polity + urbanpopper + gdpgrowth, 
               data=data2, model="within")
summary(model4f)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = decoup ~ ETS * consumeff + ETS * consumere + carbontax + 
##     co2inten + epdtloss + consumere + polity + urbanpopper + 
##     gdpgrowth, data = data2, model = "within")
## 
## Balanced Panel: n = 29, T = 19, N = 551
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -322.345  -53.123    1.754   45.955  564.312 
## 
## Coefficients:
##                 Estimate Std. Error t-value  Pr(>|t|)    
## ETS           -299.30181   59.57139 -5.0243 6.999e-07 ***
## consumeff      -10.80941    2.74703 -3.9350 9.473e-05 ***
## consumere      -21.06944    2.43682 -8.6463 < 2.2e-16 ***
## carbontax      -38.67256   25.83441 -1.4969   0.13503    
## co2inten       101.13140   72.17377  1.4012   0.16176    
## epdtloss        17.74214    2.20781  8.0361 6.469e-15 ***
## polity         -22.26374    4.12389 -5.3987 1.029e-07 ***
## urbanpopper      3.60355    2.98537  1.2071   0.22796    
## gdpgrowth       -3.14324    1.37270 -2.2898   0.02244 *  
## ETS:consumeff    1.69328    0.67191  2.5201   0.01204 *  
## ETS:consumere    4.69500    0.86500  5.4277 8.832e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    10837000
## Residual Sum of Squares: 4951700
## R-Squared:      0.54306
## Adj. R-Squared: 0.50819
## F-statistic: 55.2101 on 11 and 511 DF, p-value: < 2.22e-16

Interaction terms indicate that both consumeff and consumerr increases the effect of ETS on decoupling as they increase. However, this is not what we intended to show by including interaction term.

model5f <- plm(decoup ~ ETS + carbontax +
                 co2inten + epdtloss +
                 consumere + consumeff +
                 urbanpopper + gdpgrowth, 
                 data=data1, model="within",
                 effect="twoways")

summary(model5f, vcov=vcovHC(model5f))
## Twoways effects Within Model
## 
## Note: Coefficient variance-covariance matrix supplied: vcovHC(model5f)
## 
## Call:
## plm(formula = decoup ~ ETS + carbontax + co2inten + epdtloss + 
##     consumere + consumeff + urbanpopper + gdpgrowth, data = data1, 
##     effect = "twoways", model = "within")
## 
## Balanced Panel: n = 30, T = 19, N = 570
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -341.0816  -43.7484    1.4782   42.0734  549.6071 
## 
## Coefficients:
##             Estimate Std. Error t-value Pr(>|t|)  
## ETS         -75.7439    34.4958 -2.1957  0.02856 *
## carbontax    20.4793    65.5501  0.3124  0.75485  
## co2inten    -19.7444   209.7003 -0.0942  0.92502  
## epdtloss     12.2780     7.0726  1.7360  0.08316 .
## consumere    -6.4864     9.6467 -0.6724  0.50163  
## consumeff    -5.0824     7.5931 -0.6693  0.50358  
## urbanpopper  16.5074    10.1800  1.6215  0.10551  
## gdpgrowth    -5.6174     2.3594 -2.3808  0.01764 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    5668800
## Residual Sum of Squares: 4696200
## R-Squared:      0.17158
## Adj. R-Squared: 0.082938
## F-statistic: 4.64778 on 8 and 29 DF, p-value: 0.0009821
model6f <- plm(decoup ~ ETS + carbontax +
                 co2inten + epdtloss +
                 consumere + consumeff +
                 polity + urbanpopper + gdpgrowth, 
                 data=data2, model="within",
                 effect="twoways")

summary(model6f, vcov=vcovHC(model6f))
## Twoways effects Within Model
## 
## Note: Coefficient variance-covariance matrix supplied: vcovHC(model6f)
## 
## Call:
## plm(formula = decoup ~ ETS + carbontax + co2inten + epdtloss + 
##     consumere + consumeff + polity + urbanpopper + gdpgrowth, 
##     data = data2, effect = "twoways", model = "within")
## 
## Balanced Panel: n = 29, T = 19, N = 551
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -318.21348  -42.39077    0.61598   42.20795  519.65350 
## 
## Coefficients:
##             Estimate Std. Error t-value Pr(>|t|)  
## ETS         -86.2785    45.1050 -1.9128  0.05635 .
## carbontax   -15.0902    62.2078 -0.2426  0.80843  
## co2inten     -8.7459   211.0802 -0.0414  0.96697  
## epdtloss     12.6415     7.3951  1.7095  0.08799 .
## consumere   -11.9211    10.6687 -1.1174  0.26437  
## consumeff    -5.5261     7.6139 -0.7258  0.46831  
## polity      -11.8671    13.2158 -0.8980  0.36965  
## urbanpopper  13.6176    10.0029  1.3614  0.17402  
## gdpgrowth    -5.6629     2.2830 -2.4804  0.01345 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    5574300
## Residual Sum of Squares: 4410600
## R-Squared:      0.20876
## Adj. R-Squared: 0.12085
## F-statistic: 3.85523 on 9 and 28 DF, p-value: 0.0028391

Meanwhile, two-way fixed effects model for the model 1 (without polity) indicates that ETS is still effective even if considering the panel-corrected standard errors (0.0285). The same model for the model 2 (with polity) also indicates the same, with a slightly higher p-value for ETS (0.05635).

10. Adding two variables

indpergdp - industry, % of total GDP elecprodfromfossil - electricity production from fossil fuel (coal, oil, gas), % of total production

model7f <- plm(decoup ~ ETS*elecprodfromfossil + carbontax +
                 co2inten + epdtloss +
                 consumere + consumeff + indpergdp + polity + 
                 urbanpopper + gdpgrowth, 
                 data=data2, model="within",
                 effect="individual")

summary(model7f)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = decoup ~ ETS * elecprodfromfossil + carbontax + 
##     co2inten + epdtloss + consumere + consumeff + indpergdp + 
##     polity + urbanpopper + gdpgrowth, data = data2, effect = "individual", 
##     model = "within")
## 
## Balanced Panel: n = 29, T = 19, N = 551
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -323.2079  -45.8814   -4.0736   46.6626  506.4044 
## 
## Coefficients:
##                         Estimate Std. Error t-value  Pr(>|t|)    
## ETS                    -71.08191   20.31007 -3.4998 0.0005063 ***
## elecprodfromfossil      -4.23722    1.00868 -4.2008 3.140e-05 ***
## carbontax              -67.27169   25.16016 -2.6737 0.0077416 ** 
## co2inten               270.24455   71.29199  3.7907 0.0001682 ***
## epdtloss                16.50072    2.09295  7.8840 1.938e-14 ***
## consumere              -16.52153    2.24389 -7.3629 7.270e-13 ***
## consumeff               -3.12803    2.95861 -1.0573 0.2908932    
## indpergdp              -20.71782    2.59187 -7.9934 8.839e-15 ***
## polity                 -19.90780    3.98265 -4.9986 7.951e-07 ***
## urbanpopper              0.62786    2.90565  0.2161 0.8290094    
## gdpgrowth               -1.06426    1.35784 -0.7838 0.4335283    
## ETS:elecprodfromfossil  -0.55883    0.31005 -1.8024 0.0720771 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    10837000
## Residual Sum of Squares: 4547900
## R-Squared:      0.58032
## Adj. R-Squared: 0.54741
## F-statistic: 58.7685 on 12 and 510 DF, p-value: < 2.22e-16

Interaction term between ETS and elecprodfromfossil has a statistically significant coefficient, but elecprodfromfossil per se does not. This means that the effect of ETS on emission intensity decreases as electprodfromfossil increases. Finally, % of industry in total GDP is negatively associated with emission intensity.

summary(model7f, vcov=vcovHC(model7f))
## Oneway (individual) effect Within Model
## 
## Note: Coefficient variance-covariance matrix supplied: vcovHC(model7f)
## 
## Call:
## plm(formula = decoup ~ ETS * elecprodfromfossil + carbontax + 
##     co2inten + epdtloss + consumere + consumeff + indpergdp + 
##     polity + urbanpopper + gdpgrowth, data = data2, effect = "individual", 
##     model = "within")
## 
## Balanced Panel: n = 29, T = 19, N = 551
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -323.2079  -45.8814   -4.0736   46.6626  506.4044 
## 
## Coefficients:
##                         Estimate Std. Error t-value Pr(>|t|)   
## ETS                    -71.08191   42.15148 -1.6863 0.092341 . 
## elecprodfromfossil      -4.23722    1.69713 -2.4967 0.012850 * 
## carbontax              -67.27169   62.16141 -1.0822 0.279671   
## co2inten               270.24455  156.93518  1.7220 0.085673 . 
## epdtloss                16.50072    7.06561  2.3354 0.019912 * 
## consumere              -16.52153    6.97273 -2.3694 0.018186 * 
## consumeff               -3.12803    7.12298 -0.4391 0.660742   
## indpergdp              -20.71782    7.03962 -2.9430 0.003398 **
## polity                 -19.90780   11.55044 -1.7236 0.085395 . 
## urbanpopper              0.62786    7.77493  0.0808 0.935669   
## gdpgrowth               -1.06426    1.73769 -0.6125 0.540510   
## ETS:elecprodfromfossil  -0.55883    0.71474 -0.7819 0.434656   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    10837000
## Residual Sum of Squares: 4547900
## R-Squared:      0.58032
## Adj. R-Squared: 0.54741
## F-statistic: 6.06858 on 12 and 28 DF, p-value: 4.235e-05

When considering panel corrected heteroskedasticitic standard errors, however, the statistical significance of the ETS decreases.