Skip to content
Snippets Groups Projects
si.Rmd 118.57 KiB
title: "The energy and carbon inequality corridor for a 1.5°C compatible and just Europe: supplementary information"
author:
- Ingram S. Jaccard:
    email: jaccard@pik-potsdam.de
    institute: [PIK]
    correspondence: false
- Peter-Paul Pichler:
    email: pichler@pik-potsdam.de
    institute: [PIK]
    correspondence: false
- Johannes Többen:
    email: toebben@pik-potsdam.de
    institute: [PIK, GWS]
    correspondence: false
- Helga Weisz:
    email: weisz@pik-potsdam.de
    institute: [PIK, HU]
    correspondence: false
institute:
- PIK: Social Metabolism and Impacts, Potsdam Institute for Climate Impact Research, Member of the Leibniz Association, PO Box 60 12 03, Potsdam, 14412, Germany
- HU: Department of Cultural History & Theory and Department of Social Sciences, Humboldt University Berlin, Unter den Linden 6, Berlin, 10117, Germany
- GWS: Gesellschaft für Wirtschaftliche Strukturforschung (GWS) mbH, Heinrichstraße 30, 49080 Osnabrück, Germany
output:
  word_document:
    fig_caption: yes
    reference_docx: ../templates/template.docx
    pandoc_args:
    - --lua-filter=../templates/scholarly-metadata.lua
    - --lua-filter=../templates/author-info-blocks.lua
    - --lua-filter=../templates/pagebreak.lua
bibliography: references.bib
csl: ../templates/vancouver.csl
content: |
  35 pages, 13 tables, 7 figures
always_allow_html: yes

Content: r rmarkdown::metadata$content


knitr::opts_chunk$set(echo = TRUE)
devtools::source_gist("c83e078bf8c81b035e32c3fc0cf04ee8", 
                      filename = 'render_toc.R')

render_toc("si.Rmd")
knitr::opts_chunk$set(
  collapse = TRUE,
  warning = FALSE,
  message = FALSE,
  echo = FALSE,
  comment = "#>",
  fig.path = "../figures/",
  dpi = 300
)

if (!require("pacman")) install.packages("pacman")
pacman::p_load(tidyverse,
               janitor,
               here,
               wbstats,
               ISOcodes,
               viridis,
               hrbrthemes,
               wesanderson,
               glue,
               ggridges,
               patchwork,
               kableExtra,
               readxl,
               flextable)

pal <- wes_palette("Cavalcanti1", 5, type = "discrete")
extrafont::loadfonts()

options(scipen=999)

library(here)

Supplementary Materials and Methods

In this paper we first stratified EXIOBASE national household energy and carbon footprints by income quintile, using data from the EUROSTAT Household Budget Survey (HBS). We then ranked all of these national income quintiles (140 quintiles in total: 28 countries x 5 national income quintiles) according to their mean expenditure in purchasing power standards (PPS), and aggregated them into 10 European expenditure deciles. The resultant household energy and carbon footprints per European expenditure decile in the year 2015 are then our level of analysis through the whole main paper. In this SI document, we explain these steps in more detail, discuss limitations, and provide some supplementary results at the end.

Income-stratified national household energy and carbon footprints

The first step was stratifying an Environmentally-Extended Multi-Regional Input-Output (EE-MRIO) model's household final demand expenditure by income quantile, and then multiplying this income-stratified expenditure by 'direct and indirect supply chain' environmental intensities calculated in the EE-MRIO to estimate income-stratified national household environmental footprints.

An EE-MRIO can calculate national environmental footprints from final demand expenditure. Final demand expenditure on different production sectors, in monetary units, is multiplied by 'direct and indirect supply chain' environmental intensities per production sector to calculate the environmental footprint (for one year). The 'direct and indirect supply chain' intensities per production sector estimate the total physical amount of environmental extension, whether emissions, energy use, etc., anywhere along the supply chain per monetary unit of final demand expenditure.

In this way, the global amount of environmental pressure in that year is allocated to each country based on their final demand expenditure (this 'footprint' approach is also called consumption-based accounting as opposed to territorial-based accounting). The 'direct and indirect supply chain' intensities per production sector are calculated using standard EE-MRIO calculations [@miller_input-output_1985].

The final demand expenditure, and thus the national footprint, is typically disaggregated into several final demand categories, including households, non-profits serving households, government, gross-fixed capital formation, change in inventories and valuables. Current publicly available EE-MRIOs do not have final demand expenditure stratified by income quantile. The underlying distribution of final demand expenditure and footprint across income groups is therefore hidden.

In order to stratify the EE-MRIO final demand expenditure and footprint by income quantile, a second data input is needed with information on the income/expenditure distribution. This could be a household budget survey (HBS) stratified by income quantile or, at a more aggregate level, the national income distribution. In this paper we use:

  1. EE-MRIO: EXIOBASE version3.7 ixi, from: https://zenodo.org/record/3583071#.XjC7kSN4wpY [accessed on 12.03.2020] [@stadler_exiobase_2018] [@stadler_exiobase_2019]

  2. HBS: European household budget survey from EUROSTAT, macro-data, from : https://ec.europa.eu/eurostat/web/household-budget-surveys/database [accessed on 22.05.2020] [@eurostat_database_nodate]

We discuss each of these in turn, including additional data inputs needed to complement the HBS. We then present our methodology for our results from the main paper and some limitations. The final sub-section in 'supplementary materials and methods' presents an alternative methodology, and the final section of this supplementary information document presents supplementary results from the methodology used in the main paper and the alternative methodology. The whole analysis was performed in RStudio [@r_core_team_r:_2020], using a variety of R packages [@wickham_welcome_2019] [@firke_janitor:_2021] [@muller_here:_2020] [@piburn_wbstats:_2020] [@buchta_isocodes:_2020] [@garnier_viridis:_2018] [@rudis_hrbrthemes:_2020] [@ram_wesanderson:_2018] [@hester_glue:_2020] [@wilke_ggridges:_2021] [@pedersen_patchwork:_2020] [@zhu_kableextra:_2020] [@wickham_readxl:_2019] [@gohel_flextable:_2021] [@south_rworldmap:_2016] [@arnold_ggthemes:_2021].

EXIOBASE

We use standard input-output calculations to calculate 'direct and indirect supply chain' intensity vectors in EXIOBASE [@miller_input-output_1985]. EXIOBASE publishes the A matrix, the final demand matrix, the satellite extensions matrix, and satellite extensions direct from final demand matrix. We use the industry-by-industry (ixi) EXIOBASE data tables from EXIOBASE version3.7. This means 163 industry production sectors and 6 final demand categories for 49 regions worldwide (44 countries and 5 rest-of-world regions), from 1995 - 2016. All monetary units are in million current Euros. Stadler et al. (2018) [@stadler_exiobase_2018] describe the EXIOBASE version3.7 compilation procedure in detail, including nine supporting information documents with further detailed information on the compilation of the monetary tables (S1), energy (S2), emissions (S3), and others.

For each year, we first load the A matrix and calculate the Leontief inverse (the inverse of the A matrix). We load the final demand matrix and calculate total output (x) by pre-multiplying the Leontief inverse (L) by the row sums of the final demand matrix (Y):

x = L ° sum(Y)

We then load the satellite extensions matrix and extract the relevant extensions. To calculate direct intensity vectors (DIV) we divide the satellite extension vectors (f) by total output (x):

DIV = f/x

The 'direct and indirect supply chain' intensity vectors (TIV) are calculated by pre-multiplying the direct intensity vectors (DIV) by the Leontief inverse (L):

TIV = DIV ° L

The footprint is then calculated by row-wise multiplying the TIV by final demand:

fp = TIV * Y

Before that final step, however, we stratify national household final demand expenditure by income quintile according to the structure of the EUROSTAT HBS, explained in the 'EUROSTAT HBS' section below.

The results in the main paper also present the footprint broken down by its domestic, other European, and non-European parts. To calculate these domestic and foreign parts of the footprint, we row-wise multiply the direct intensity vectors (DIV) by the Leontief inverse (L):

TIV breakdown = DIV * L

Environmental extensions

The environmental extensions we use are emissions of CO2-equivalence (in kilograms) and 'gross total energy use' (in terajoules). We create the CO2-equivalence extension by summing together the greenhouse gases CO2, CH4, N2O, SF6, HFCs, and PFCs, from combustion, noncombustion, agriculture and waste. We use Global Warming Potential (GWP) values for a 100-year time horizon taken from the IPCC Fifth Assessment Report [@myhre_g._anthropogenic_2013 (p.73-79)]: 28 for CH4, 265 for N2O and 23500 for SF6 (HFCs and PFCs are in CO2-equivalence already in the EXIOBASE environmental extensions).

The 'gross total energy use' extension in EXIOBASE converts final energy consumption in the International Energy Agency (IEA) energy balance data from the territorial to residence principle following System of Environmental Economic Accounting (SEEA) energy accounting principles. In their Supporting Information 2, Stadler et al. (2018) [@stadler_exiobase_2018] describe the compilation of the energy extensions in EXIOBASE version3.7. Energy supply and use tables from the IEA are converted from the territory to the residence principle before being allocated to the EXIOBASE industries and final demand categories.

The conversion to the residence principle means that the EXIOBASE energy extensions refer to the functional border of a country's economy. In this case, the system border is defined by the 'residence' of the agent. This means that energy supply and use from international transport by ships, airplanes, fishing vessels, cars and trucks is allocated to the resident units of a country, independent from where these activities take place. In EXIOBASE version3.7, because emissions from these transport activities are estimated from the energy extensions via emission factors, the emissions extensions follow the residence principle as well.

Environmental extensions direct from households

For CO2-equivalence emissions and energy use direct from households, the EXIOBASE extensions provide one number of physical emissions and energy use direct from households per country. This number is made up of some mix between, primarily, direct household vehicle fuel use and direct household fuel use for housing heating and cooling, along with some other, smaller miscellaneous uses. To estimate the split between these three activities, we use two further EUROSTAT emissions and energy tables to split 'Total activities by households' between heating/cooling (HH_HEAT), transport activities (HH_TRA), and other (HH_OTH). Full definitions of what is included in these can be found in EUROSTAT's 'manual for air emissions accounts' (2015, p.66) [@eurostat_manual_2015]. While this disaggregation exists for nearly all EUROSTAT HBS countries, 2015 is the earliest year in our sample with complete coverage (except for Turkey in energy, which we impute using the Bulgarian splits). Therefore, we also use the 2015 splits between these 3 categories for our 2005 and 2010 estimates (the 2005 and 2010 results are shown only in this SI document). The two data tables are:

  1. For energy, the EUROSTAT data table 'Energy supply and use by NACE Rev. 2 activity' [env_ac_pefasu] at: http://appsso.eurostat.ec.europa.eu/nui/show.do?dataset=env_ac_pefasu [accessed on 03.06.2020]. [@eurostat_eurostat_2020]

  2. For emissions to air, we download the EUROSTAT data table 'Air emissions accounts by NACE Rev. 2 activity' [env_ac_ainah_r2] at: https://appsso.eurostat.ec.europa.eu/nui/show.do?dataset=env_ac_ainah_r2&lang=en [accessed on 03.06.2020]. [@eurostat_eurostat_nodate]

EUROSTAT HBS

The EUROSTAT HBS compiles national household budget surveys from European countries. Countries provide EUROSTAT with their HBSs in micro-data form, and EUROSTAT has aggregated and published these survey data in macro-data form every five years since 1988. Of the publicly available data tables, we use two:

  1. 'Mean consumption expenditure by income quintile (hbs_exp_t133)'

  2. 'Structure of consumption expenditure by income quintile and COICOP consumption purpose (hbs_str_t223)'

'Mean consumption expenditure by income quintile' is expressed in purchasing power standards (PPS) per year, country and income quintile, in two possible units; per household and per adult equivalent. Purchasing power standard (PPS) is a common currency measure that eliminates differences in national price-levels. The income quintiles are determined by household, ie. all households in the sample are ranked by income and evenly distributed into five quintiles, thus there are the same number of households in each income quintile. For per adult equivalent, the mean consumption expenditure by income quintile is adjusted for household size between countries, years, and income quintiles, using the modified OECD scale: the first adult in the household is given a weight of 1.0, each adult thereafter 0.5, and each child 0.3 [@eurostat_description_2016].

The 'Structure of consumption expenditure by income quintile and COICOP consumption purpose' table gives the distribution of consumption expenditure across COICOP consumption categories in each income quintile, expressed in 'parts per mille (pm)'. There are three 'levels' of COICOP breakdown. All countries have level 1 (12 consumption categories) and 2, but there are only a few with level 3. For the current analysis, we select our own mix of COICOP level 1 and 2. We use COICOP level 1, except for the categories of food (CP01), housing (CP04) and mobility (CP07), where we use level 2, due to their importance for energy use and emissions.

This is primarily because of the diversity of level 2 categories, especially within those three aggregate level 1 categories. This is most clearly seen in the housing category, where, at level 2, housing is broken down into: 'Actual rentals for housing' (CP041), 'Imputed rentals for housing' (CP042), 'Maintenance and repair of the dwelling' (CP043), 'Water supply and miscellaneous services relating to the dwelling' (CP044), and 'Electricity, gas and other fuels' (CP045). Corresponding all housing-related EXIOBASE production sectors only to the HBS level 1 'housing' consumption category (CP04) would obscure the difference between level 2 categories with extremely different effects on the footprint (electricity production vs. rental payments). The COICOP consumption categories we thus use are: CP011 ('Food'), CP012 ('Non-alcoholic beverages'), CP02 ('Alcoholic beverages, tobacco and narcotics'), CP03 ('Clothing and footwear'), 'rent' (we collapse CP041 with CP042), CP043, CP044, CP045, CP05 ('Furnishings, household equipment and routine household maintenance'), CP06 ('Health'), CP071 ('Purchase of vehicles'), CP072 ('Operation of personal transport equipment'), CP073 ('Transport services'), CP08 ('Communications'), CP09 ('Recreation and culture'), CP10 ('Education'), CP11 ('Restaurants and hotels'), CP12 ('Miscellaneous goods and services').

As mentioned above, the EUROSTAT HBS 'mean consumption expenditure by income quintile' macro-data table is expressed per household and per adult equivalent. We use households per adult equivalent as our unit of analysis throughout the main paper, and in order to express our footprint estimates per adult equivalent, we needed the total number of private households in each country and year, and for this, two additional data tables were needed. We used:

  1. The 'lfst_hhnhtych' table from EUROSTAT (Number of private households), selecting all available years and total households [accessed on 04.05.2020]. [@eurostat_eurostat_nodate-1]

  2. Norway is missing from the 'lfst_hhnhtych' EUROSTAT table. We download Norwegian data from the Norwegian statistical office: https://www.ssb.no/en/statbank/table/10986/. We select 'Private households', 'the whole country', no household type selection, all years (2005-2019), and continue with 'Table - Layout 1', then save the table as a 'Tab delimited without heading (csv)' file [accessed on 04.05.2020]. [@statistics_norway_10986:_nodate]

Method for main paper results

For our results in the main paper, we first stratify the EXIOBASE national household final demand expenditure (before calculating the footprint) by income quintile, using the relative expenditure shares of each income quintile on the COICOP consumption categories in the EUROSTAT HBS. We do this for 2005, 2010 and 2015, but only present 2015 in the main paper.

The initial step was creating a correspondence table, assigning each production sector in EXIOBASE to one COICOP consumption category in the HBS. Because the share of each consumption category/production sector in the total amount of expenditure is not identical between the HBS and EXIOBASE, there are two possible methods for then stratifying the EXIOBASE household final demand expenditure: one that keeps the EXIOBASE production sector shares of total EXIOBASE expenditure intact (breaking the HBS consumption category shares), and one that keeps the HBS consumption category shares of total HBS expenditure intact (breaking the EXIOBASE production sector shares).

Our results in the main paper use the first method, keeping the EXIOBASE production sector shares of total EXIOBASE expenditure intact. This means that the total footprint is identical to when it is calculated in EXIOBASE without any stratification by income quintile. The alternative method, on the other hand, results in a different total footprint because a different amount of final demand expenditure in each production sector is now multiplied by the same original 'direct and indirect supply chain' intensity for that production sector. We present the alternative method and some results in the last sections of this document.

In this current section we use a two sector toy model to illustrate the method behind the main paper results. In the two sector model, the term 'sector' represents EXIOBASE production sectors that correspond to one HBS consumption category.

Step 1) Multiply 'mean consumption expenditure by income quintile' in purchasing power standards per household (pps hh) by the 'structure of consumption expenditure by income quintile and COICOP consumption purpose' (in 'parts per mille' or pm) to calculate the consumption expenditure structure in 'pps hh'. Then calculate the shares of each income quintile within each sector. Table S1 shows the two sector example, where 'pps hh' is multiplied by the shares of each sector ('parts per mille' divided by 1000) to calculate the expenditure on each sector per income quintile in 'pps hh' ('s1 (pps hh)' and 's2 (pps hh)'). 's1 (q share)' and 's2 (q share)' are each income quintile's share of the total amount of expenditure (in 'pps hh') on that sector, according to the HBS.


#"HBS structure with calculations of quintile shares per sector."

quintile = c("q1","q2","q3","q4","q5")
pps_hh = c(10,13,20,33,40)

pm_sector1 = c(200,300,400,500,600)
pm_sector2 = c(800,700,600,500,400)

hbs = data.frame(quintile, pps_hh, pm_sector1, pm_sector2) %>%
  mutate(pps_hh_sector1 = pps_hh*(pm_sector1/1000),
         sector_1_shares = pps_hh_sector1/sum(pps_hh_sector1),
         pps_hh_sector2 = pps_hh*(pm_sector2/1000),
         sector_2_shares = pps_hh_sector2/sum(pps_hh_sector2)) %>%
  mutate_if(is.numeric, round, digits = 2)

flextable(hbs) %>%
  autofit() %>%
  set_header_labels(quintile = "quintile", 
                    pps_hh = "pps hh",
                    pm_sector1 = "s1 (pm)",
                    pm_sector2 = "s2 (pm)",
                    pps_hh_sector1 = "s1 (pps hh)",
                    sector_1_shares = "s1 (q share)",
                    pps_hh_sector2 = "s2 (pps hh)",
                    sector_2_shares = "s2 (q share)") %>%
  fit_to_width(max_width = 6.8)

Step 2) Join the HBS income quintile shares per sector to the EE-MRIO by sector, and multiply these shares by the EE-MRIO household final demand expenditure per sector ('eemrio hh fd') to stratify it by income quintile (Table S2).


q_share_of_sector = hbs %>%
  select(quintile,pps_hh_sector1,pps_hh_sector2) %>%
  gather(sector,value,-quintile) %>%
  mutate(sector = dplyr::recode(sector,
                                "pps_hh_sector1" = 1,
                                "pps_hh_sector2" = 2)) %>%
  group_by(sector) %>%
  mutate(q_share_of_sector = value/sum(value)) %>%
  select(-value) %>%
  spread(quintile,q_share_of_sector) 

eemrio_hh_fd = c(300,800)

eemrio = data.frame(q_share_of_sector, eemrio_hh_fd) %>%
  mutate(q1_eemrio = q1*eemrio_hh_fd,
         q2_eemrio = q2*eemrio_hh_fd,
         q3_eemrio = q3*eemrio_hh_fd,
         q4_eemrio = q4*eemrio_hh_fd,
         q5_eemrio = q5*eemrio_hh_fd) %>%
  mutate_if(is.numeric, round, digits = 2)

flextable(eemrio) %>%
  autofit(add_w=0.5) %>%
  set_header_labels(sector = "sector",
                    q1 = "q1 share",
                    q2 = "q2 share",
                    q3 = "q3 share",
                    q4 = "q4 share",
                    q5 = "q5 share",
                    eemrio_hh_fd = "eemrio hh fd",
                    q1_eemrio = "q1 fd",
                    q2_eemrio = "q2 fd",
                    q3_eemrio = "q3 fd",
                    q4_eemrio = "q4 fd",
                    q5_eemrio = "q5 fd") %>%
  fit_to_width(max_width = 6.8)

Step 3) Once the EE-MRIO household final demand expenditure is stratified by income quintile, it is multiplied by the EE-MRIO 'direct and indirect supply chain' intensities per sector to calculate the EE-MRIO household footprint per sector stratified by income quintile (Table S3). The total footprint per sector ('total fp') is the same as if we had simply multiplied the non-stratified EE-MRIO household final demand expenditure per sector ('eemrio hh fd') by the 'direct and indirect supply chain' intensity vector ('TIV').


TIV = c(0.2,0.4)

footprint = data.frame(eemrio,TIV) %>%
  select(sector,
         eemrio_hh_fd,
         q1_eemrio,
         q2_eemrio,
         q3_eemrio,
         q4_eemrio,
         q5_eemrio,
         TIV) %>%
  mutate(q1_footprint = q1_eemrio*TIV,
         q2_footprint = q2_eemrio*TIV,
         q3_footprint = q3_eemrio*TIV,
         q4_footprint = q4_eemrio*TIV,
         q5_footprint = q5_eemrio*TIV,
         total_footprint = eemrio_hh_fd*TIV) %>%
  mutate_if(is.numeric, round, digits = 2)

flextable(footprint) %>%
  autofit() %>%
  set_header_labels(sector = "sector",
                    eemrio_hh_fd = "eemrio hh fd",
                    q1_eemrio = "q1 fd",
                    q2_eemrio = "q2 fd",
                    q3_eemrio = "q3 fd",
                    q4_eemrio = "q4 fd",
                    q5_eemrio = "q5 fd",
                    TIV = "TIV",
                    q1_footprint = "q1 fp",
                    q2_footprint = "q2 fp",
                    q3_footprint = "q3 fp",
                    q4_footprint = "q4 fp",
                    q5_footprint = "q5 fp",
                    total_footprint = "total fp") %>%
  fit_to_width(max_width = 6.8)

Correspondence between EXIOBASE and EUROSTAT HBS

Table S4 shows which EUROSTAT HBS consumption category each EXIOBASE production sector corresponds to, along with our grouping of the EXIOBASE production sectors into the five aggregated final consumption categories we present in the main paper. The direct energy and carbon from households correspond to: heating/cooling (HH_HEAT) to CP045, mobility (HH_TRA) to CP072, and other (HH_OTHER) to CP05, respectively.


labels = read.csv(here("/analysis/preprocessing/income-stratified-footprints/Exiobase_T_labels_ixi_w_coicop_mapping.csv")) %>%
  select(V2,coicop,five_sectors) %>%
  unique()

flextable(labels) %>%
  autofit() %>%
  set_header_labels(V2 = "exiobase industry production sector",
                    coicop = "coicop consumption category",
                    five_sectors = "aggregate consumption category") %>%
  width(j=1, width = 4) %>%
  width(j=2, width = 1.5) %>%
  width(j=3, width = 1.5) 

Country and year coverage

The EXIOBASE version3.7 industry-by-industry is available for the years 1995 to 2016, albeit with the caveat that the original data series ends in 2011, the 2012-2016 estimates are based on trade and macro-economic data, and caution is advised when analysing trends over time. The EUROSTAT HBS is available for the years: 1988, 1994, 1999, 2005, 2010 and 2015, although not all countries are available for all years, and the years 1988, 1994, and 1999, in particular, have many missing countries. Table S5 shows the country and year coverage between EXIOBASE and the EUROSTAT HBS for the years 2005, 2010 and 2015. Rows with black text show countries that are represented in EXIOBASE, and an 'x' for those years where the necessary EUROSTAT HBS data also exists for that country. Rows with red text show countries where EUROSTAT HBS data exists, but who are not represented individually in EXIOBASE (they are in 'rest-of-world' categories in EXIOBASE).


geo = c("Austria",
        "Belgium",
        "Bulgaria",
        "Cyprus",
        "Czech Rep.",
        "Germany",
        "Denmark",
        "Estonia",
        "Greece",
        "Spain",
        "Finland",
        "France",
        "Croatia",
        "Hungary",
        "Ireland",
        "Italy",
        "Lithuania",
        "Luxembourg",
        "Latvia",
        "Montenegro",
        "North Macedonia",
        "Malta",
        "Netherlands",
        "Norway",
        "Poland",
        "Portugal",
        "Romania",
        "Serbia",
        "Sweden",
        "Slovenia",
        "Slovakia",
        "Turkey",
        "UK",
        "Kosovo")

year_2015 = c("x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x")

year_2010 = c("x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "",
              "x",
              "",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "",
              "x",
              "x",
              "x",
              "x",
              "x",
              "")
  
year_2005 = c("x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "x",
              "",
              "x",
              "x",
              "x",
              "x",
              "x",
              "")

country_year_coverage = data.frame(geo,
                                   year_2015,
                                   year_2010,
                                   year_2005)

flextable(country_year_coverage) %>%
  autofit() %>%
  set_header_labels(geo = "Country",
                    year_2015 = "2015",
                    year_2010 = "2010",
                    year_2005 = "2005") %>%
  color(i=c(20,21,28,34),color='red') %>%
  fit_to_width(max_width = 7.5) 

Purchaser price versus base price

The EUROSTAT HBS is reported in purchaser price (consumers report their expenditure in the prices they paid) while we use EXIOBASE version3.7 in base price. Because we decided to keep the EXIOBASE production sector shares the same (and just stratify by income quintile within each production sector), which also keeps the total footprint the same, this distinction between purchaser price and base price does not matter. The 'alternative method' section of this document shows that, in the alternative methodology where we break the EXIOBASE production sector shares and keep the consumption category shares of the HBS, the distinction between purchaser price and base price does matter.

In the methodology used for the main paper, once we have multiplied HBS 'pps hh' per income quintile by the sectoral shares in 'pm', to get sectoral expenditure per income quintile in 'pps hh', we include the fact that sector 1 and sector 2 have base price to purchaser price ratios that are different. The base price to purchaser price ratio for sector 1 ('s1 bp') is 0.5, whereas for sector 2 ('s2 bp') it is 1 (ie. there are no trade, transport, tax or subsidy margins in sector 2). This results in sectoral expenditure per income quintile in 'pps hh' now expressed in base price ('s1 pps hh bp' and 's2 pps hh bp') (Table S6).


bp_share_in_pp_sector_1 = c(0.5,0.5,0.5,0.5,0.5)
bp_share_in_pp_sector_2 = c(1,1,1,1,1)

hbs_bp = data.frame(quintile, 
                    pps_hh, 
                    pm_sector1, 
                    pm_sector2, 
                    bp_share_in_pp_sector_1, 
                    bp_share_in_pp_sector_2) %>%
  mutate(pps_hh_sector1 = pps_hh*(pm_sector1/1000),
         pps_hh_sector1_bp = pps_hh_sector1*bp_share_in_pp_sector_1,
         sector_1_shares = pps_hh_sector1/sum(pps_hh_sector1),
         sector_1_shares_bp = pps_hh_sector1_bp/sum(pps_hh_sector1_bp),
         pps_hh_sector2 = pps_hh*(pm_sector2/1000),
         pps_hh_sector2_bp = pps_hh_sector2*bp_share_in_pp_sector_2,
         sector_2_shares = pps_hh_sector2/sum(pps_hh_sector2),
         sector_2_shares_bp = pps_hh_sector2_bp/sum(pps_hh_sector2_bp),
         pps_hh_bp = pps_hh_sector1_bp + pps_hh_sector2_bp)
  
hbs_bp_pps = hbs_bp %>%
  select(quintile, 
         pps_hh,
         pm_sector1,
         pm_sector2,
         pps_hh_sector1,
         bp_share_in_pp_sector_1,
         pps_hh_sector1_bp,
         pps_hh_sector2,
         bp_share_in_pp_sector_2,
         pps_hh_sector2_bp) %>%
  mutate_if(is.numeric, round, digits = 2)

flextable(hbs_bp_pps) %>%
  autofit() %>%
  set_header_labels(quintile = "quintile",
                    pps_hh = "pps hh",
                    pm_sector1 = "s1 (pm)",
                    pm_sector2 = "s2 (pm)",
                    pps_hh_sector1 = "s1 (pps hh)",
                    bp_share_in_pp_sector_1 = "s1 bp",
                    pps_hh_sector1_bp = "s1 (pps hh bp)",
                    pps_hh_sector2 = "s2 (pps hh)",
                    bp_share_in_pp_sector_2 = "s2 bp",
                    pps_hh_sector2_bp = "s2 (pps hh bp)") %>%
  fit_to_width(max_width = 6.8)

Table S7 shows that even as the sectoral expenditure for sector 1 is 50% lower in base price than in purchaser price, because we only have one base price to purchaser price ratio per sector (ie. we assume that every income quintile in a country faces the same base price to purchaser price ratio when purchasing a good or service from a given sector), the sectoral shares per income quintile in base price are the same as they were in Table S1.


hbs_bp_shares = hbs_bp %>%
  select(quintile, 
         pps_hh_bp,
         pps_hh_sector1_bp,
         sector_1_shares_bp,
         pps_hh_sector2_bp,
         sector_2_shares_bp) %>%
  mutate(pm_sector1_bp = (pps_hh_sector1_bp/(pps_hh_sector1_bp + pps_hh_sector2_bp))*1000,
         pm_sector2_bp = (pps_hh_sector2_bp/(pps_hh_sector1_bp + pps_hh_sector2_bp))*1000) %>%
  mutate_if(is.numeric, round, digits = 2)

flextable(hbs_bp_shares) %>%
  autofit() %>%
  set_header_labels(quintile = "quintile",
                    pps_hh_bp = "pps hh bp",
                    pps_hh_sector1_bp = "s1 (pps hh bp)",
                    sector_1_shares_bp = "s1 (q share bp)",
                    pps_hh_sector2_bp = "s2 (pps hh bp)",
                    sector_2_shares_bp = "s2 (q share bp)",
                    pm_sector1_bp = "s1 (pm bp)",
                    pm_sector2_bp = "s2 (pm bp)") %>%
  fit_to_width(max_width = 6.8)

If we now do the same as in Table S3, joining these income quintile shares per sector to the EE-MRIO by sector, and multiplying them by the EE-MRIO household final demand expenditure per sector to stratify it by income quintile, we end up with the same stratification which will result in the same stratified footprint as before.


q_share_of_sector_bp = hbs_bp_shares %>%
  select(quintile,pps_hh_sector1_bp,pps_hh_sector2_bp) %>%
  gather(sector,value,-quintile) %>%
  mutate(sector = dplyr::recode(sector,
                                "pps_hh_sector1_bp" = 1,
                                "pps_hh_sector2_bp" = 2)) %>%
  group_by(sector) %>%
  mutate(q_share_of_sector_bp = value/sum(value)) %>%
  select(-value) %>%
  spread(quintile,q_share_of_sector_bp) 

eemrio_hh_fd = c(300,800)

eemrio_bp = data.frame(q_share_of_sector_bp, eemrio_hh_fd) %>%
  mutate(q1_eemrio = q1*eemrio_hh_fd,
         q2_eemrio = q2*eemrio_hh_fd,
         q3_eemrio = q3*eemrio_hh_fd,
         q4_eemrio = q4*eemrio_hh_fd,
         q5_eemrio = q5*eemrio_hh_fd) %>%
  mutate_if(is.numeric, round, digits = 2)

flextable(eemrio_bp) %>%
  autofit() %>%
  set_header_labels(sector = "sector",
                    q1 = "q1 share bp",
                    q2 = "q2 share bp",
                    q3 = "q3 share bp",
                    q4 = "q4 share bp",
                    q5 = "q5 share bp",
                    eemrio_hh_fd = "eemrio hh fd",
                    q1_eemrio = "q1 fd",
                    q2_eemrio = "q2 fd",
                    q3_eemrio = "q3 fd",
                    q4_eemrio = "q4 fd",
                    q5_eemrio = "q5 fd") %>%
  fit_to_width(max_width = 6.8)

European household expenditure deciles

Each national income quintile has a household final demand expenditure, household energy footprint and household carbon footprint estimate allocated to it, which represents the average in the quintile, after these initial steps. Then, to calculate European household expenditure deciles, we first ranked all these national income quintiles (140 in total: 28 European countries x 5 national income quintiles each) according to their mean household expenditure in PPS and aggregated the result to 10 European expenditure groups. This distribution allowed us to analyze the total European household energy and carbon footprints per these European expenditure deciles. We included only those countries with EUROSTAT HBS and EXIOBASE data in 2015, 2010, and 2005, which excludes Italy (no 2010 or 2015 necessary EUROSTAT HBS data, i.e. no data per income quintile) and Luxembourg (no 2010 EUROSTAT HBS data), but includes the UK, Norway and Turkey.

Each national income quintile is thus allocated to one of the 10 European expenditure deciles (some national income quintiles at the boundaries between deciles are split between two deciles). Figure S1 shows the population share of each country in our bottom 4 European expenditure deciles in 2015. A 100% share thus means that all 5 national income quintiles of that country fall within the bottom 4 European expenditure deciles. This does not imply that there are no high-income households in those countries, but because this method uses average expenditure data from the national income quintiles, the aggregation cuts off the lower and higher tails of the respective national expenditure distributions.

# load data wrangling functions
source(here("analysis", "R", "wrangler_functions.R"))

## load result data for EU deciles
eu_q_count = 10

# summary countries aggregated by country quintiles and eu ntile
dat_country_summary_by_cquint_and_euntile = get_country_summary_by_cquint_and_euntile(eu_q_count)
# pivot to long format for plotting and attach readable indicator names
cols_ex = c("year", "iso2", "quint", "eu_q_rank")
pdat_country_summary_by_cquint_and_euntile =
  pivot_results_longer_adorn(dat_country_summary_by_cquint_and_euntile, cols_ex)

# summary of countries by EU quantile without sectoral resolution
dat_country_summary_by_eu_ntile = get_country_summary_by_eu_ntile(eu_q_count)
# pivot to long format for plotting and attach readable indicator names
cols_ex = c("year", "iso2", "eu_q_rank")
pdat_country_summary_by_eu_ntile = 
  pivot_results_longer_adorn(dat_country_summary_by_eu_ntile, cols_ex)

# summary of countries by country quintile with aggregate sectoral resolution
dat_sector_summary_by_country_quintile = get_sector_summary_by_country_quintile(eu_q_count)
# pivot to long format for plotting and attach readable indicator names
cols_ex = c("year", "iso2", "quint", "eu_q_rank", "sector_agg_id")
pdat_sector_summary_by_country_quintile =
  pivot_results_longer_adorn(dat_sector_summary_by_country_quintile, cols_ex)

# summary of eu ntile with aggregate sectoral resolution
dat_sector_summary_by_eu_ntile = get_sector_summary_by_eu_ntile(eu_q_count)
# pivot to long format for plotting and attach readable indicator names
cols_ex = c("year", "eu_q_rank", "sector_agg_id")
pdat_sector_summary_by_eu_ntile =
  pivot_results_longer_adorn(dat_sector_summary_by_eu_ntile, cols_ex)

tmp3 = pdat_country_summary_by_cquint_and_euntile %>%
  filter(eu_q_rank < 5, year== 2015,  indicator=="pae_fd_ke") %>%
  group_by(iso3, quint) %>%
  summarise(value = sum(value)) %>%
  group_by(iso3) %>%
  summarise(pop = n()/5*100) 

tmp4 = pdat_country_summary_by_cquint_and_euntile %>%
  ungroup() %>%
  filter(quint == 1, year== 2015,  indicator=="pae_fd_ke") %>%
  transmute(iso3, pop2 = 0) %>%
  left_join(tmp3, by="iso3") %>%
  transmute(iso3, popshare = if_else(is.na(pop), pop2, pop+pop2))

library(rworldmap)
library(ggthemes)

quantile_rank_map = joinCountryData2Map(tmp4, joinCode = "ISO_A3", nameJoinColumn = "iso3")
quantile_rank_map_poly = fortify(quantile_rank_map) #extract polygons 

quantile_rank_map_poly = merge(quantile_rank_map_poly, quantile_rank_map@data, by.x="id", by.y="ADMIN", all.x=T)
quantile_rank_map_poly = quantile_rank_map_poly %>% arrange(id, order)

map1 = ggplot() + 
  geom_polygon(data = quantile_rank_map_poly, aes(long, lat, group = group), color="black") +
  geom_polygon(data = quantile_rank_map_poly, aes(long, lat, group = group, 
                                        fill=factor(popshare))) + 
  #scale_fill_gradient(name="Mean decile \nrank", low="skyblue", high = "skyblue4", na.value = "#EEEEEE") +
  scale_fill_viridis(direction = -1, discrete = T, na.value = "white", name="Population\n share in\n bottom 4\n European\n deciles (%)") +
  theme_map() +
  coord_map("bonne", lat0 = 50,xlim = c(-9, 44), ylim = c(35, 70), clip="on") +
  theme(legend.position = c(0.75, 0.28))
  

map1

ggsave(here("analysis", "figures", "figureS1.pdf"), device=cairo_pdf)

Limitations

While the EUROSTAT HBS is compiled for cross-country comparison purposes and aims for harmonization, there remains imperfect harmonization in the frequency of surveys, timing, content and structure between countries and years [@eurostat_eu_2020]. Some types of households may also be excluded from the samples, including super-rich households, for example in Germany, which excludes households with over €18,000 monthly net income [@eurostat_eu_2020]. Sensitive goods and services, such as alcohol, may be under-reported in household budget surveys, while expenditure on infrequent purchases such as a vehicle may create artificially large expenditure differences between households depending on the timing of the survey [@eurostat_eu_2020]. The EUROSTAT HBS macro-data also does not report direct foreign purchases, and we assumed that the expenditure shares between income quintiles of direct final demand for foreign goods and services was the same as direct final demand for domestic goods and services.

We used EXIOBASE as the EE-MRIO for this study because of its European focus, with nearly all countries in the EUROSTAT HBS also found as stand-alone countries in EXIOBASE, its detailed satellite extension data, and its year coverage (specifically version3.7, industry-by-industry), but there are well known limitations when using and selecting an EE-MRIO [@moran_convergence_2014]. The production sectors in EXIOBASE are harmonized across countries and years, but needing to map the EUROSTAT HBS to EXIOBASE meant that the most recent year of 2015 could only use the industry-by-industry version of EXIOBASE version3.7. This version assumes fixed product sales. Furthermore, because EXIOBASE version3.7 is extrapolated beyond 2011, caution should be used when comparing results over time. This, and the fact that harmonization guidelines in the EUROSTAT HBS have changed over time, were the justification for presenting only the 2015 results in the main paper, and presenting 2005 and 2010 results only here in the SI. We also show 2010 results using the product-by-product version of EXIOBASE version3.7 in the final section of this SI document.

The correspondence between the EUROSTAT HBS COICOP consumption categories and the industry production sectors in EXIOBASE is not one-to-one. Both the EUROSTAT HBS and EXIOBASE are limited in their consumption category/production sector level of detail. The share of each consumption category/production sector in the total amount of expenditure is also not identical between the HBS and EXIOBASE. As discussed in the 'methods for main paper results' section of this SI document, there are alternative methods for stratifying the EXIOBASE household final demand expenditure: one that keeps the EXIOBASE production sector shares of total expenditure intact, and one that keeps the HBS consumption category shares of total expenditure intact. Our results in the main paper use the first method, keeping the EXIOBASE sectoral shares of total expenditure intact, which means that the total footprint is identical to when it is calculated in EXIOBASE without any stratification by income quantile. The alternative method, on the other hand, results in a different total footprint because a different amount of final demand expenditure in each sector is multiplied by the same original 'direct and indirect supply chain' intensities, but stays faithful to the original HBS consumption category shares of total HBS expenditure. We show the alternative method below, and some results in the last sections of this SI document. We also stay at a relatively aggregated level for our energy and carbon footprints, as our primary goal was to connect aspects of the aggregate European household environmental footprint distribution with the decarbonisation and minimum energy requirement scenarios. Work specifically investigating distributional aspects of the European carbon footprint, sometimes at a finer sectoral level than we do here, can be found in the refs. [@ivanova_unequal_2020], [@gore_t._confronting_2020], [@sommer_carbon_2017] and [@bianco_understanding_2019].

Finally, the main limitation of the European expenditure deciles is the fact that they use average expenditure data from the national income quintiles. This aggregation cuts off the lower and higher tails of the respective national expenditure distributions. Our constructed European expenditure deciles thus likely underestimate European expenditure inequality. Also, when calculating energy and carbon intensities per harmonized European expenditure decile, and comparing them across deciles, one aspect not harmonized is the possible effect of different national energy subsidy levels. Varying energy subsidy levels between countries could play a role in the different energy and carbon intensities we observe per European expenditure deciles [@sovacool_reviewing_2017].

Alternative method for income-stratified national household energy and carbon footprints

Our methodology used for the main paper, and explained in the sections above, keeps the production sector shares of EE-MRIO household final demand expenditure (and subsequently the footprint) the same as they are found in the original EE-MRIO household final demand expenditure when not stratified by income quantile. The alternative method is to keep the consumption category shares of total HBS expenditure the same as they are found in the HBS. This means taking the total sum of household final demand expenditure from the EE-MRIO and stratifying it first based on the share of each income quantile's consumption expenditure of the total consumption expenditure as found in the HBS, before stratifying into sectors as well using the HBS 'parts per mille' per sector. This leads to a different total footprint than the original EE-MRIO footprint (when not stratified by income quantile), because a different amount of final demand expenditure in each sector is now multiplied by the same 'direct and indirect supply chain' intensities per sector that are originally calculated in the EE-MRIO.

Here the distinction between purchaser price and base price matters, as we directly take the HBS expenditure structure (which is reported in purchaser price) and apply it to the aggregated sum of EE-MRIO household final demand expenditure which is originally in base price. To correct for this, we can either convert the household budget survey to base price or take the total EE-MRIO household final demand expenditure in purchaser price, stratify it according to the HBS structure, then convert to base price. Here we show how we transform the household budget survey from purchaser price to base price using EUROSTAT margin data tables.

We use two data tables from the OECD statistics database, which are provided to the OECD by EUROSTAT (for European countries). The units here are: 'Trade and transport margins in percentage of final consumption expenditure by households' and 'Taxes less subsidies on product in percentage final consumption expenditure by households':

  • Trade and Transport margin tables, Taxes less Subsidies tables (National Accounts > Annual National Accounts > Supply and Use Tables > SUT Indicators): https://stats.oecd.org/index.aspx?queryid=84864# [@oecd_sut_nodate]

    1. Trade and transport margins in percentage of final consumption expenditure by households: Export as text file (csv) - customize to include years 2005 to 2015 [accessed on: 15-04-2020]

    2. Taxes less subsidies on product in percentage of final consumption expenditure by households: Export as text file (csv) - customize to include years 2005 to 2015 [accessed on: 15-04-2020]

We first map the HBS COICOP consumption categories to the margin data 'PRODUCT' sectors. Most countries have margin data here starting only in 2010. We take the 2010 margin data and apply this to all three years in our sample (the margins do not change significantly over time). This was possible for 20 countries. There are then two countries with only 'rent' margins missing: the Czech Republic and Slovakia. Here we apply zero to both trade and transport, and taxes less subsidies margins. There are then five countries with some missing margin data (Estonia, Ireland, Lithuania, Norway and Sweden), and three countries with no margin data at all (Germany, Spain, Turkey). We impute their margin percentages using the margin percentages of a similar, neighboring country. For Estonia and Lithuania, we use the Latvian margin percentages. For Ireland we use the UK margin percentages. For Norway and Sweden we use the Finnish margin percentages. For Germany we use the Austrian margin percentages. For Spain we use the Portuguese margin percentages, and finally, for Turkey we use the Bulgarian margin percentages. These countries appear to be close approximations based on examination of the 2010 values of another table; 'trade and transport margins in percentage of total supply at purchaser's prices.' The need to apply margin percentage data is a potential limitation of this method. If we relied on this method to produce main paper results, acquiring and applying more precise margin percentage data would arguably be a requirement.


bp_share_in_pp_sector_1 = c(0.5,0.5,0.5,0.5,0.5)
bp_share_in_pp_sector_2 = c(1,1,1,1,1)

hbs_bp = data.frame(quintile, 
                    pps_hh, 
                    pm_sector1, 
                    pm_sector2, 
                    bp_share_in_pp_sector_1, 
                    bp_share_in_pp_sector_2) %>%
  mutate(pps_hh_sector1 = pps_hh*(pm_sector1/1000),
         pps_hh_sector1_bp = pps_hh_sector1*bp_share_in_pp_sector_1,
         sector_1_shares = pps_hh_sector1/sum(pps_hh_sector1),
         sector_1_shares_bp = pps_hh_sector1_bp/sum(pps_hh_sector1_bp),
         pps_hh_sector2 = pps_hh*(pm_sector2/1000),
         pps_hh_sector2_bp = pps_hh_sector2*bp_share_in_pp_sector_2,
         sector_2_shares = pps_hh_sector2/sum(pps_hh_sector2),
         sector_2_shares_bp = pps_hh_sector2_bp/sum(pps_hh_sector2_bp),
         pps_hh_bp = pps_hh_sector1_bp + pps_hh_sector2_bp)
  
hbs_bp_pps = hbs_bp %>%
  select(quintile, 
         pps_hh,
         pm_sector1,
         pm_sector2,
         pps_hh_sector1,
         bp_share_in_pp_sector_1,
         pps_hh_sector1_bp,
         pps_hh_sector2,
         bp_share_in_pp_sector_2,
         pps_hh_sector2_bp) %>%
  mutate_if(is.numeric, round, digits = 2)

flextable(hbs_bp_pps) %>%
  autofit() %>%
  set_header_labels(quintile = "quintile",
                    pps_hh = "pps hh",
                    pm_sector1 = "s1 (pm)",
                    pm_sector2 = "s2 (pm)",
                    pps_hh_sector1 = "s1 (pps hh)",
                    bp_share_in_pp_sector_1 = "s1 bp",
                    pps_hh_sector1_bp = "s1 (pps hh bp)",
                    pps_hh_sector2 = "s2 (pps hh)",
                    bp_share_in_pp_sector_2 = "s2 bp",
                    pps_hh_sector2_bp = "s2 (pps hh bp)") %>%                 
  fit_to_width(max_width = 7)

hbs_bp_shares = hbs_bp %>%
  select(quintile, 
         pps_hh_bp,
         pps_hh_sector1_bp,
         pps_hh_sector2_bp) %>%
  mutate(pm_sector1_bp = (pps_hh_sector1_bp/(pps_hh_sector1_bp + pps_hh_sector2_bp))*1000,
         pm_sector2_bp = (pps_hh_sector2_bp/(pps_hh_sector1_bp + pps_hh_sector2_bp))*1000) %>%
  mutate_if(is.numeric, round, digits = 2)

flextable(hbs_bp_shares) %>%
  autofit() %>%
  set_header_labels(quintile = "quintile",
                     pps_hh_bp = "pps hh bp",
                     pps_hh_sector1_bp = "s1 (pps hh bp)",
                     pps_hh_sector2_bp = "s2 (pps hh bp)",
                     pm_sector1_bp = "s1 (pm bp)",
                     pm_sector2_bp = "s2 (pm bp)") %>%
  fit_to_width(max_width = 7.5)

Table S11 shows the HBS data on the left-hand side ('pps hh', 's1 (pm)' and 's2 (pm)') as before, but now the income quintile shares of mean consumption expenditure (the sum of 'pps hh') are calculated and shown as 'mean exp'. These shares are multiplied by total EE-MRIO household final demand expenditure, which in this case is 1100 (300 in sector 1 plus 800 in sector 2) (see Table S2), to calculate the amount of EE-MRIO household final demand expenditure per income quintile. These are then multiplied by the sectoral parts per mille shares to calculate EE-MRIO household final demand expenditure per sector and income quintile ('hh fd s1' and 'hh fd s2').


quintile = c("q1","q2","q3","q4","q5")
pps_hh = c(9,11,16,25,28)

pm_sector1 = c(111,176,250,333,429)
pm_sector2 = c(889,824,750,667,571)

hbs_alt_method = data.frame(quintile, 
                            pps_hh, 
                            pm_sector1, 
                            pm_sector2,
                            bp_share_in_pp_sector_1,
                            bp_share_in_pp_sector_2) %>%
  mutate(mean_expenditure_share = pps_hh/sum(pps_hh),
         eemrio_hh_fd = 1100*mean_expenditure_share,
         hh_sector1 = eemrio_hh_fd*(pm_sector1/1000),
         hh_sector1_bp = hh_sector1*bp_share_in_pp_sector_1,
         hh_sector2 = eemrio_hh_fd*(pm_sector2/1000),
         hh_sector2_bp = hh_sector2*bp_share_in_pp_sector_2)

hbs_alt_method_fd = hbs_alt_method %>%
  select(quintile,
         pps_hh,
         pm_sector1,
         pm_sector2,
         mean_expenditure_share,
         eemrio_hh_fd,
         hh_sector1,
         hh_sector2) %>%
  mutate_if(is.numeric, round, digits = 2)

flextable(hbs_alt_method_fd) %>%
  autofit() %>%
  set_header_labels(quintile = "quintile",
                    pps_hh = "pps hh",
                    pm_sector1 = "s1 (pm)",
                    pm_sector2 = "s2 (pm)",
                    mean_expenditure_share = "mean exp",
                    eemrio_hh_fd = "eemrio hh fd",
                    hh_sector1 = "hh fd s1",
                    hh_sector2 = "hh fd s2") %>%
  fit_to_width(max_width = 7.5)

Table S12 shows that we then have our EE-MRIO household final demand expenditure stratified by income quintile.


eemrio_alt_method = hbs_alt_method %>%
  select(quintile,hh_sector1,hh_sector2) %>%
  gather(sector,value,-quintile) %>%
  spread(quintile,value) %>%
  mutate(sector = dplyr::recode(sector,
                                "hh_sector1" = "1",
                                "hh_sector2" = "2")) %>%
  mutate_if(is.numeric, round, digits = 2)

flextable(eemrio_alt_method) %>%
  autofit() %>%
  set_header_labels(sector = "sector",
                    q1 = "q1 fd",
                    q2 = "q2 fd",
                    q3 = "q3 fd",
                    q4 = "q4 fd",
                    q5 = "q5 fd") %>%
  width(j=c(1:6), width = 0.8) 

If we now multiply this by the 'direct and indirect supply chain' intensity vector ('TIV'), we calculate the footprint stratified by income quintile, but our total footprint is different than in the other methodology because now different amounts of EE-MRIO household final demand expenditure per sector are being multiplied by the same 'direct and indirect supply chain' intensity vector as previously calculated inside the EE-MRIO (compare Table S13 with Table S3).


footprint_alt_method = data.frame(eemrio_alt_method, TIV) %>%
  mutate(q1_footprint = q1*TIV,
         q2_footprint = q2*TIV,
         q3_footprint = q3*TIV,
         q4_footprint = q4*TIV,
         q5_footprint = q5*TIV,
         total_footprint = q1_footprint +
           q2_footprint +
           q3_footprint +
           q4_footprint +
           q5_footprint) %>%
  mutate_if(is.numeric, round, digits = 2)

flextable(footprint_alt_method) %>%
  autofit() %>%
  set_header_labels(sector = "sector",
                    q1 = "q1 fd",
                    q2 = "q2 fd",
                    q3 = "q3 fd",
                    q4 = "q4 fd",
                    q5 = "q5 fd",
                    TIV = "TIV",
                    q1_footprint = "q1 fp",
                    q2_footprint = "q2 fp",
                    q3_footprint = "q3 fp",
                    q4_footprint = "q4 fp",
                    q5_footprint = "q5 fp",
                    total_footprint = "total fp") %>%
  fit_to_width(max_width = 7.5)

Supplementary Results

We ran the same analysis for the years 2015, 2010 and 2005. We presented only 2015 in the main paper as we focused more on the distributional aspect of the environmental footprints and their relationship to decarbonisation scenarios and minimum energy, rather than the time component. As mentioned in the 'limitations' section above, caution is needed when comparing the EUROSTAT HBS data over time, as well as the version of EXIOBASE we used (version3.7, industry-by-industry). We also estimated the environmental footprints per European expenditure decile using the product-by-product version of EXIOBASE for the year 2010, and then the year 2015 again using the alternative methodology that was explained in the supplementary methods sections in this document above.

We show each of these in turn in the format of Figure 1 from the main paper: 1) the year 2005 using the main paper method and EXIOBASE industry-by-industry version, then 2) the year 2010 using the main paper method and EXIOBASE industry-by-industry version, 3) the year 2010 using the main paper method but EXIOBASE product-by-product version, and finally 4) the year 2015 using the alternative methodology and EXIOBASE industry-by-industry version.

Year 2005, using main method, EXIOBASE industry-by-industry

# load data wrangling functions
source(here("analysis", "R", "wrangler_functions.R"))

## load result data for EU deciles
eu_q_count = 10

# summary countries aggregated by country quintiles and eu ntile
dat_country_summary_by_cquint_and_euntile = get_country_summary_by_cquint_and_euntile(eu_q_count)
# pivot to long format for plotting and attach readable indicator names
cols_ex = c("year", "iso2", "quint", "eu_q_rank")
pdat_country_summary_by_cquint_and_euntile =
  pivot_results_longer_adorn(dat_country_summary_by_cquint_and_euntile, cols_ex)

# summary of countries by EU quantile without sectoral resolution
dat_country_summary_by_eu_ntile = get_country_summary_by_eu_ntile(eu_q_count)
# pivot to long format for plotting and attach readable indicator names
cols_ex = c("year", "iso2", "eu_q_rank")
pdat_country_summary_by_eu_ntile = 
  pivot_results_longer_adorn(dat_country_summary_by_eu_ntile, cols_ex)

# summary of countries by country quintile with aggregate sectoral resolution
dat_sector_summary_by_country_quintile = get_sector_summary_by_country_quintile(eu_q_count)
# pivot to long format for plotting and attach readable indicator names
cols_ex = c("year", "iso2", "quint", "eu_q_rank", "sector_agg_id")
pdat_sector_summary_by_country_quintile =
  pivot_results_longer_adorn(dat_sector_summary_by_country_quintile, cols_ex)

# summary of eu ntile with aggregate sectoral resolution
dat_sector_summary_by_eu_ntile = get_sector_summary_by_eu_ntile(eu_q_count)
# pivot to long format for plotting and attach readable indicator names
cols_ex = c("year", "eu_q_rank", "sector_agg_id")
pdat_sector_summary_by_eu_ntile =
  pivot_results_longer_adorn(dat_sector_summary_by_eu_ntile, cols_ex)

p1 = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2005, 
         indicator == "total_fd_me") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000001,
            eu_ntile_name = first(eu_ntile_name)) %>%
  ggplot(aes(x=eu_ntile_name, y=value)) +
    geom_col(position = position_dodge(), fill=pal[1]) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Expenditure (trn€)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p2 = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2005, 
         indicator == "total_energy_use_tj") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000001,
            eu_ntile_name = first(eu_ntile_name)) %>%
  ggplot(aes(x=eu_ntile_name, y=value)) +
    geom_col(position = position_dodge(), fill=pal[1]) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Energy footprint (EJ)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p3 = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2005, 
         indicator == "total_co2eq_kg") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000000001,
            eu_ntile_name = first(eu_ntile_name)) %>%
  ggplot(aes(x=eu_ntile_name, y=value)) +
    geom_col(position = position_dodge(), fill=pal[1]) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Carbon footprint (MtCO2eq)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p_top = p1 + p2 + p3

p1 = dat_country_summary_by_eu_ntile %>%
  filter(year == 2005) %>%
  ggplot(aes(x=factor(eu_q_rank), y=pe_co2eq_kg)) +
  geom_violin(aes(weight=total_fd_me), fill=pal[1], color=pal[1], alpha=0.5) +
  geom_point( alpha=0.3) +
  geom_segment(data=dat_country_summary_by_eu_ntile %>%
                 filter(year == 2005) %>%
                 group_by(eu_q_rank) %>%
                 summarise(pe_co2eq_kg = weighted.mean(pe_co2eq_kg,total_fd_me)),
               aes(y=pe_co2eq_kg, yend=pe_co2eq_kg, x=eu_q_rank-0.3, xend=eu_q_rank+0.3), size=1.5) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Carbon intensity per expenditure (kgCO2eq/€)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p2 = dat_country_summary_by_eu_ntile %>%
  filter(year == 2005) %>%
  ggplot(aes(x=factor(eu_q_rank), y=pe_energy_use_mj)) +
  geom_violin(aes(weight=total_fd_me), fill=pal[1], color=pal[1], alpha=0.5) +
  geom_point( alpha=0.3) +
  geom_segment(data=dat_country_summary_by_eu_ntile %>%
                 filter(year == 2005) %>%
                 group_by(eu_q_rank) %>%
                 summarise(pe_energy_use_mj = weighted.mean(pe_energy_use_mj,total_fd_me)),
               aes(y=pe_energy_use_mj, yend=pe_energy_use_mj, x=eu_q_rank-0.3, xend=eu_q_rank+0.3), size=1.5) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Energy intensity per expenditure (MJ/€)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

dat3 = dat_country_summary_by_eu_ntile %>%
  filter(year == 2005) %>%
  mutate(intensity_e_c = total_co2eq_kg*0.001/total_energy_use_tj)

p3 = dat3 %>%
  ggplot(aes(x=factor(eu_q_rank), y=intensity_e_c)) +
  geom_violin(aes(weight=total_energy_use_tj), fill=pal[1], color=pal[1], alpha=0.5) +
  geom_point( alpha=0.3) +
  geom_segment(data=dat3 %>%
                 filter(year == 2005) %>%
                 group_by(eu_q_rank) %>%
                 summarise(intensity_e_c = weighted.mean(intensity_e_c,total_energy_use_tj)),
               aes(y=intensity_e_c, yend=intensity_e_c, x=eu_q_rank-0.3, xend=eu_q_rank+0.3), size=1.5) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Carbon intensity per energy (gCO2eq/TJ)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p_bottom = p2 + p1 + p3

# values in text

## inequality
exp = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2005, 
         indicator == "total_fd_me") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000001,
            eu_ntile_name = first(eu_ntile_name))

exp_total = (exp %>% summarise(value = sum(value)))$value

exp_10_10 = round((exp %>% filter(eu_q_rank == 10))$value/(exp %>% filter(eu_q_rank == 1))$value,digits = 1)

energy = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2005, 
         indicator == "total_energy_use_tj") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000001,
            eu_ntile_name = first(eu_ntile_name))

energy_total = (energy %>% summarise(value = sum(value)))$value

energy_10_10 = round((energy %>% filter(eu_q_rank == 10))$value/(energy %>% filter(eu_q_rank == 1))$value,digits = 1)

co2eq = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2005, 
         indicator == "total_co2eq_kg") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000000001,
            eu_ntile_name = first(eu_ntile_name))

co2eq_total = (co2eq %>% summarise(value = sum(value)))$value

co2eq_10_10 = round((co2eq %>% filter(eu_q_rank == 10))$value/(co2eq %>% filter(eu_q_rank == 1))$value,digits = 1)

## total per decile

exp_bottom_decile = round((exp %>% filter(eu_q_rank == 1))$value, digits = 1)

exp_top_decile = round((exp %>% filter(eu_q_rank == 10))$value, digits = 1)

energy_bottom_decile = round((energy %>% filter(eu_q_rank == 1))$value, digits = 1)

energy_top_decile = round((energy %>% filter(eu_q_rank == 10))$value, digits = 1)

co2eq_bottom_decile = round((co2eq %>% filter(eu_q_rank == 1))$value, digits = 1)

co2eq_top_decile = round((co2eq %>% filter(eu_q_rank == 10))$value, digits = 1)


## per adult equivalent per decile

aeu = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2005,
         indicator == "total_adult_eq") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value),
            eu_ntile_name = first(eu_ntile_name)) 

exp_pae = exp %>%
  rename(total_fd_me = value) %>%
  left_join(aeu, by = c("eu_q_rank", "eu_ntile_name")) %>%
  mutate(pae_fd_e = (total_fd_me/value)*1000000000000)

fd_pae_bottom_decile = round((exp_pae %>% filter(eu_q_rank == 1))$pae_fd_e, digits = 0)

fd_pae_top_decile = round((exp_pae %>% filter(eu_q_rank == 10))$pae_fd_e, digits = 0)

energy_pae = energy %>%
  rename(total_energy_use_tj = value) %>%
  left_join(aeu, by = c("eu_q_rank", "eu_ntile_name")) %>%
  mutate(pae_energy_use_gj = (total_energy_use_tj/value)*1000000000)

energy_pae_bottom_decile = round((energy_pae %>% filter(eu_q_rank == 1))$pae_energy_use_gj, digits = 1)

energy_pae_top_decile = round((energy_pae %>% filter(eu_q_rank == 10))$pae_energy_use_gj, digits = 1)

co2eq_pae = co2eq %>%
  rename(total_co2eq_kg = value) %>%
  left_join(aeu, by = c("eu_q_rank", "eu_ntile_name")) %>%
  mutate(pae_co2eq_t = (total_co2eq_kg/value)*1000000)

co2eq_pae_bottom_decile = round((co2eq_pae %>% filter(eu_q_rank == 1))$pae_co2eq_t, digits = 1)

co2eq_pae_top_decile = round((co2eq_pae %>% filter(eu_q_rank == 10))$pae_co2eq_t, digits = 1)


## intensities

mean_energy_intens = dat_country_summary_by_eu_ntile %>%
                 filter(year == 2005) %>%
                 group_by(eu_q_rank) %>%
                 summarise(pe_energy_use_mj = weighted.mean(pe_energy_use_mj,total_fd_me))

mean_energy_intens_bottom_decile = round((mean_energy_intens %>% filter(eu_q_rank == 1))$pe_energy_use_mj, digits = 1)

mean_energy_intens_top_decile = round((mean_energy_intens %>% filter(eu_q_rank == 10))$pe_energy_use_mj, digits = 1)

mean_co2eq_of_energy_intens = dat_country_summary_by_eu_ntile %>%
  filter(year == 2005) %>%
  mutate(intensity_e_c = total_co2eq_kg*0.001/total_energy_use_tj) %>%
  group_by(eu_q_rank) %>%
  summarise(intensity_e_c = weighted.mean(intensity_e_c,total_energy_use_tj))

mean_co2eq_of_energy_intens_bottom_decile = round((mean_co2eq_of_energy_intens %>% filter(eu_q_rank == 1))$intensity_e_c, digits = 1)

mean_co2eq_of_energy_intens_top_decile = round((mean_co2eq_of_energy_intens %>% filter(eu_q_rank == 10))$intensity_e_c, digits = 1)

In 2005, total household final demand expenditure was r exp_total trn€, the energy footprint r energy_total EJ, and the carbon footprint r co2eq_total MtCO2eq. We estimated the 10:10 ratios at r exp_10_10 for expenditure, r energy_10_10 for the energy footprint, and r co2eq_10_10 for the carbon footprint. Total expenditure ranged from r exp_bottom_decile trn€ to r exp_top_decile trn€ (or r fd_pae_bottom_decile€ to r fd_pae_top_decile€ per adult equivalent) across bottom and top decile, the energy footprint from r energy_bottom_decile EJ to r energy_top_decile EJ (or r energy_pae_bottom_decile GJ/ae to r energy_pae_top_decile GJ/ae), and the carbon footprint from r co2eq_bottom_decile MtCO2eq to r co2eq_top_decile MtCO2eq (or r co2eq_pae_bottom_decile tCO2eq/ae to r co2eq_pae_top_decile tCO2eq/ae). The average energy intensity of consumption was r mean_energy_intens_bottom_decile MJ/€ in the bottom decile and r mean_energy_intens_top_decile MJ/€ in the top decile. The carbon intensity of energy was r mean_co2eq_of_energy_intens_bottom_decile gCO2eq/TJ in the bottom decile, and r mean_co2eq_of_energy_intens_top_decile gCO2eq/TJ in the top decile.


a = p_top / p_bottom + plot_annotation(tag_levels = 'a') +
  plot_layout(guides = 'collect')  & 
  theme(plot.margin = unit(c(0.25,0.25,0.25,0.25), "cm"),
        legend.position = 'bottom',
        axis.title.y = element_text(size=13, hjust = 0.5),
        axis.text.x = element_text(size = 12),
        axis.text.y = element_text(size = 12),
        legend.text = element_text(size=12),
        legend.title = element_text(size=13))
a

ggsave(here("analysis", "figures", "figureS1.pdf"), device=cairo_pdf)

Year 2010, using main method, EXIOBASE industry-by-industry


p1 = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2010, 
         indicator == "total_fd_me") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000001,
            eu_ntile_name = first(eu_ntile_name)) %>%
  ggplot(aes(x=eu_ntile_name, y=value)) +
    geom_col(position = position_dodge(), fill=pal[1]) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Expenditure (trn€)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p2 = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2010, 
         indicator == "total_energy_use_tj") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000001,
            eu_ntile_name = first(eu_ntile_name)) %>%
  ggplot(aes(x=eu_ntile_name, y=value)) +
    geom_col(position = position_dodge(), fill=pal[1]) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Energy footprint (EJ)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p3 = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2010, 
         indicator == "total_co2eq_kg") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000000001,
            eu_ntile_name = first(eu_ntile_name)) %>%
  ggplot(aes(x=eu_ntile_name, y=value)) +
    geom_col(position = position_dodge(), fill=pal[1]) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Carbon footprint (MtCO2eq)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p_top = p1 + p2 + p3

p1 = dat_country_summary_by_eu_ntile %>%
  filter(year == 2010) %>%
  ggplot(aes(x=factor(eu_q_rank), y=pe_co2eq_kg)) +
  geom_violin(aes(weight=total_fd_me), fill=pal[1], color=pal[1], alpha=0.5) +
  geom_point( alpha=0.3) +
  geom_segment(data=dat_country_summary_by_eu_ntile %>%
                 filter(year == 2010) %>%
                 group_by(eu_q_rank) %>%
                 summarise(pe_co2eq_kg = weighted.mean(pe_co2eq_kg,total_fd_me)),
               aes(y=pe_co2eq_kg, yend=pe_co2eq_kg, x=eu_q_rank-0.3, xend=eu_q_rank+0.3), size=1.5) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Carbon intensity per expenditure (kgCO2eq/€)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p2 = dat_country_summary_by_eu_ntile %>%
  filter(year == 2010) %>%
  ggplot(aes(x=factor(eu_q_rank), y=pe_energy_use_mj)) +
  geom_violin(aes(weight=total_fd_me), fill=pal[1], color=pal[1], alpha=0.5) +
  geom_point( alpha=0.3) +
  geom_segment(data=dat_country_summary_by_eu_ntile %>%
                 filter(year == 2010) %>%
                 group_by(eu_q_rank) %>%
                 summarise(pe_energy_use_mj = weighted.mean(pe_energy_use_mj,total_fd_me)),
               aes(y=pe_energy_use_mj, yend=pe_energy_use_mj, x=eu_q_rank-0.3, xend=eu_q_rank+0.3), size=1.5) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Energy intensity per expenditure (MJ/€)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

dat3 = dat_country_summary_by_eu_ntile %>%
  filter(year == 2010) %>%
  mutate(intensity_e_c = total_co2eq_kg*0.001/total_energy_use_tj)

p3 = dat3 %>%
  ggplot(aes(x=factor(eu_q_rank), y=intensity_e_c)) +
  geom_violin(aes(weight=total_energy_use_tj), fill=pal[1], color=pal[1], alpha=0.5) +
  geom_point( alpha=0.3) +
  geom_segment(data=dat3 %>%
                 filter(year == 2010) %>%
                 group_by(eu_q_rank) %>%
                 summarise(intensity_e_c = weighted.mean(intensity_e_c,total_energy_use_tj)),
               aes(y=intensity_e_c, yend=intensity_e_c, x=eu_q_rank-0.3, xend=eu_q_rank+0.3), size=1.5) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Carbon intensity per energy (gCO2eq/TJ)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p_bottom = p2 + p1 + p3

# values in text

## inequality
exp = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2010, 
         indicator == "total_fd_me") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000001,
            eu_ntile_name = first(eu_ntile_name))

exp_total = (exp %>% summarise(value = sum(value)))$value

exp_10_10 = round((exp %>% filter(eu_q_rank == 10))$value/(exp %>% filter(eu_q_rank == 1))$value,digits = 1)

energy = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2010, 
         indicator == "total_energy_use_tj") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000001,
            eu_ntile_name = first(eu_ntile_name))

energy_total = (energy %>% summarise(value = sum(value)))$value

energy_10_10 = round((energy %>% filter(eu_q_rank == 10))$value/(energy %>% filter(eu_q_rank == 1))$value,digits = 1)

co2eq = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2010, 
         indicator == "total_co2eq_kg") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000000001,
            eu_ntile_name = first(eu_ntile_name))

co2eq_total = (co2eq %>% summarise(value = sum(value)))$value

co2eq_10_10 = round((co2eq %>% filter(eu_q_rank == 10))$value/(co2eq %>% filter(eu_q_rank == 1))$value,digits = 1)

## total per decile

exp_bottom_decile = round((exp %>% filter(eu_q_rank == 1))$value, digits = 1)

exp_top_decile = round((exp %>% filter(eu_q_rank == 10))$value, digits = 1)

energy_bottom_decile = round((energy %>% filter(eu_q_rank == 1))$value, digits = 1)

energy_top_decile = round((energy %>% filter(eu_q_rank == 10))$value, digits = 1)

co2eq_bottom_decile = round((co2eq %>% filter(eu_q_rank == 1))$value, digits = 1)

co2eq_top_decile = round((co2eq %>% filter(eu_q_rank == 10))$value, digits = 1)


## per adult equivalent per decile

aeu = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2010,
         indicator == "total_adult_eq") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value),
            eu_ntile_name = first(eu_ntile_name)) 

exp_pae = exp %>%
  rename(total_fd_me = value) %>%
  left_join(aeu, by = c("eu_q_rank", "eu_ntile_name")) %>%
  mutate(pae_fd_e = (total_fd_me/value)*1000000000000)

fd_pae_bottom_decile = round((exp_pae %>% filter(eu_q_rank == 1))$pae_fd_e, digits = 0)

fd_pae_top_decile = round((exp_pae %>% filter(eu_q_rank == 10))$pae_fd_e, digits = 0)

energy_pae = energy %>%
  rename(total_energy_use_tj = value) %>%
  left_join(aeu, by = c("eu_q_rank", "eu_ntile_name")) %>%
  mutate(pae_energy_use_gj = (total_energy_use_tj/value)*1000000000)

energy_pae_bottom_decile = round((energy_pae %>% filter(eu_q_rank == 1))$pae_energy_use_gj, digits = 1)

energy_pae_top_decile = round((energy_pae %>% filter(eu_q_rank == 10))$pae_energy_use_gj, digits = 1)

co2eq_pae = co2eq %>%
  rename(total_co2eq_kg = value) %>%
  left_join(aeu, by = c("eu_q_rank", "eu_ntile_name")) %>%
  mutate(pae_co2eq_t = (total_co2eq_kg/value)*1000000)

co2eq_pae_bottom_decile = round((co2eq_pae %>% filter(eu_q_rank == 1))$pae_co2eq_t, digits = 1)

co2eq_pae_top_decile = round((co2eq_pae %>% filter(eu_q_rank == 10))$pae_co2eq_t, digits = 1)


## intensities

mean_energy_intens = dat_country_summary_by_eu_ntile %>%
                 filter(year == 2010) %>%
                 group_by(eu_q_rank) %>%
                 summarise(pe_energy_use_mj = weighted.mean(pe_energy_use_mj,total_fd_me))

mean_energy_intens_bottom_decile = round((mean_energy_intens %>% filter(eu_q_rank == 1))$pe_energy_use_mj, digits = 1)

mean_energy_intens_top_decile = round((mean_energy_intens %>% filter(eu_q_rank == 10))$pe_energy_use_mj, digits = 1)

mean_co2eq_of_energy_intens = dat_country_summary_by_eu_ntile %>%
  filter(year == 2010) %>%
  mutate(intensity_e_c = total_co2eq_kg*0.001/total_energy_use_tj) %>%
  group_by(eu_q_rank) %>%
  summarise(intensity_e_c = weighted.mean(intensity_e_c,total_energy_use_tj))

mean_co2eq_of_energy_intens_bottom_decile = round((mean_co2eq_of_energy_intens %>% filter(eu_q_rank == 1))$intensity_e_c, digits = 1)

mean_co2eq_of_energy_intens_top_decile = round((mean_co2eq_of_energy_intens %>% filter(eu_q_rank == 10))$intensity_e_c, digits = 1)

In 2010, total household final demand expenditure was r exp_total trn€, the energy footprint r energy_total EJ, and the carbon footprint r co2eq_total MtCO2eq. We estimated the 10:10 ratios at r exp_10_10 for expenditure, r energy_10_10 for the energy footprint, and r co2eq_10_10 for the carbon footprint. Total expenditure ranged from r exp_bottom_decile trn€ to r exp_top_decile trn€ (or r fd_pae_bottom_decile€ to r fd_pae_top_decile€ per adult equivalent) across bottom and top decile, the energy footprint from r energy_bottom_decile EJ to r energy_top_decile EJ (or r energy_pae_bottom_decile GJ/ae to r energy_pae_top_decile GJ/ae), and the carbon footprint from r co2eq_bottom_decile MtCO2eq to r co2eq_top_decile MtCO2eq (or r co2eq_pae_bottom_decile tCO2eq/ae to r co2eq_pae_top_decile tCO2eq/ae). The average energy intensity of consumption was r mean_energy_intens_bottom_decile MJ/€ in the bottom decile and r mean_energy_intens_top_decile MJ/€ in the top decile. The carbon intensity of energy was r mean_co2eq_of_energy_intens_bottom_decile gCO2eq/TJ in the bottom decile, and r mean_co2eq_of_energy_intens_top_decile gCO2eq/TJ in the top decile.


a = p_top / p_bottom + plot_annotation(tag_levels = 'a') +
  plot_layout(guides = 'collect')  & 
  theme(plot.margin = unit(c(0.25,0.25,0.25,0.25), "cm"),
        legend.position = 'bottom',
        axis.title.y = element_text(size=13, hjust = 0.5),
        axis.text.x = element_text(size = 12),
        axis.text.y = element_text(size = 12),
        legend.text = element_text(size=12),
        legend.title = element_text(size=13))

a

ggsave(here("analysis", "figures", "figureS2.pdf"), device=cairo_pdf)

Year 2010, using main method, EXIOBASE product-by-product

# load data wrangling functions
source(here("analysis", "R", "si", "wrangler_functions_pxp.R"))

## load result data for EU deciles
eu_q_count = 10

# summary countries aggregated by country quintiles and eu ntile
dat_country_summary_by_cquint_and_euntile = get_country_summary_by_cquint_and_euntile(eu_q_count)
# pivot to long format for plotting and attach readable indicator names
cols_ex = c("year", "iso2", "quint", "eu_q_rank")
pdat_country_summary_by_cquint_and_euntile =
  pivot_results_longer_adorn(dat_country_summary_by_cquint_and_euntile, cols_ex)

# summary of countries by EU quantile without sectoral resolution
dat_country_summary_by_eu_ntile = get_country_summary_by_eu_ntile(eu_q_count)
# pivot to long format for plotting and attach readable indicator names
cols_ex = c("year", "iso2", "eu_q_rank")
pdat_country_summary_by_eu_ntile = 
  pivot_results_longer_adorn(dat_country_summary_by_eu_ntile, cols_ex)

# summary of countries by country quintile with aggregate sectoral resolution
dat_sector_summary_by_country_quintile = get_sector_summary_by_country_quintile(eu_q_count)
# pivot to long format for plotting and attach readable indicator names
cols_ex = c("year", "iso2", "quint", "eu_q_rank", "sector_agg_id")
pdat_sector_summary_by_country_quintile =
  pivot_results_longer_adorn(dat_sector_summary_by_country_quintile, cols_ex)

# summary of eu ntile with aggregate sectoral resolution
dat_sector_summary_by_eu_ntile = get_sector_summary_by_eu_ntile(eu_q_count)
# pivot to long format for plotting and attach readable indicator names
cols_ex = c("year", "eu_q_rank", "sector_agg_id")
pdat_sector_summary_by_eu_ntile =
  pivot_results_longer_adorn(dat_sector_summary_by_eu_ntile, cols_ex)

p1 = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2010, 
         indicator == "total_fd_me") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000001,
            eu_ntile_name = first(eu_ntile_name)) %>%
  ggplot(aes(x=eu_ntile_name, y=value)) +
    geom_col(position = position_dodge(), fill=pal[1]) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Expenditure (trn€)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p2 = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2010, 
         indicator == "total_energy_use_tj") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000001,
            eu_ntile_name = first(eu_ntile_name)) %>%
  ggplot(aes(x=eu_ntile_name, y=value)) +
    geom_col(position = position_dodge(), fill=pal[1]) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Energy footprint (EJ)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 


p3 = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2010, 
         indicator == "total_co2eq_kg") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000000001,
            eu_ntile_name = first(eu_ntile_name)) %>%
  ggplot(aes(x=eu_ntile_name, y=value)) +
    geom_col(position = position_dodge(), fill=pal[1]) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Carbon footprint (MtCO2eq)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p_top = p1 + p2 + p3

p1 = dat_country_summary_by_eu_ntile %>%
  filter(year == 2010) %>%
  ggplot(aes(x=factor(eu_q_rank), y=pe_co2eq_kg)) +
  geom_violin(aes(weight=total_fd_me), fill=pal[1], color=pal[1], alpha=0.5) +
  geom_point( alpha=0.3) +
  geom_segment(data=dat_country_summary_by_eu_ntile %>%
                 filter(year == 2010) %>%
                 group_by(eu_q_rank) %>%
                 summarise(pe_co2eq_kg = weighted.mean(pe_co2eq_kg,total_fd_me)),
               aes(y=pe_co2eq_kg, yend=pe_co2eq_kg, x=eu_q_rank-0.3, xend=eu_q_rank+0.3), size=1.5) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Carbon intensity per expenditure (kgCO2eq/€)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p2 = dat_country_summary_by_eu_ntile %>%
  filter(year == 2010) %>%
  ggplot(aes(x=factor(eu_q_rank), y=pe_energy_use_mj)) +
  geom_violin(aes(weight=total_fd_me), fill=pal[1], color=pal[1], alpha=0.5) +
  geom_point( alpha=0.3) +
  geom_segment(data=dat_country_summary_by_eu_ntile %>%
                 filter(year == 2010) %>%
                 group_by(eu_q_rank) %>%
                 summarise(pe_energy_use_mj = weighted.mean(pe_energy_use_mj,total_fd_me)),
               aes(y=pe_energy_use_mj, yend=pe_energy_use_mj, x=eu_q_rank-0.3, xend=eu_q_rank+0.3), size=1.5) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Energy intensity per expenditure (MJ/€)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

dat3 = dat_country_summary_by_eu_ntile %>%
  filter(year == 2010) %>%
  mutate(intensity_e_c = total_co2eq_kg*0.001/total_energy_use_tj)

p3 = dat3 %>%
  ggplot(aes(x=factor(eu_q_rank), y=intensity_e_c)) +
  geom_violin(aes(weight=total_energy_use_tj), fill=pal[1], color=pal[1], alpha=0.5) +
  geom_point( alpha=0.3) +
  geom_segment(data=dat3 %>%
                 filter(year == 2010) %>%
                 group_by(eu_q_rank) %>%
                 summarise(intensity_e_c = weighted.mean(intensity_e_c,total_energy_use_tj)),
               aes(y=intensity_e_c, yend=intensity_e_c, x=eu_q_rank-0.3, xend=eu_q_rank+0.3), size=1.5) +
    theme_minimal() +
    theme(text=element_text(family="Liberation Sans Narrow")) +
    labs(x="", y="Carbon intensity per energy (gCO2eq/TJ)") +
    theme(axis.text.x = element_text(angle = 90)) +
    scale_x_discrete(labels = c("D01","D02","D03","D04","D05","D06","D07","D08","D09","D10")) 

p_bottom = p2 + p1 + p3

# values in text

## inequality
exp = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2010, 
         indicator == "total_fd_me") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000001,
            eu_ntile_name = first(eu_ntile_name))

exp_total = (exp %>% summarise(value = sum(value)))$value

exp_10_10 = round((exp %>% filter(eu_q_rank == 10))$value/(exp %>% filter(eu_q_rank == 1))$value,digits = 1)

energy = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2010, 
         indicator == "total_energy_use_tj") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000001,
            eu_ntile_name = first(eu_ntile_name))

energy_total = (energy %>% summarise(value = sum(value)))$value

energy_10_10 = round((energy %>% filter(eu_q_rank == 10))$value/(energy %>% filter(eu_q_rank == 1))$value,digits = 1)

co2eq = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2010, 
         indicator == "total_co2eq_kg") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value)*0.000000001,
            eu_ntile_name = first(eu_ntile_name))

co2eq_total = (co2eq %>% summarise(value = sum(value)))$value

co2eq_10_10 = round((co2eq %>% filter(eu_q_rank == 10))$value/(co2eq %>% filter(eu_q_rank == 1))$value,digits = 1)

## total per decile

exp_bottom_decile = round((exp %>% filter(eu_q_rank == 1))$value, digits = 1)

exp_top_decile = round((exp %>% filter(eu_q_rank == 10))$value, digits = 1)

energy_bottom_decile = round((energy %>% filter(eu_q_rank == 1))$value, digits = 1)

energy_top_decile = round((energy %>% filter(eu_q_rank == 10))$value, digits = 1)

co2eq_bottom_decile = round((co2eq %>% filter(eu_q_rank == 1))$value, digits = 1)

co2eq_top_decile = round((co2eq %>% filter(eu_q_rank == 10))$value, digits = 1)


## per adult equivalent per decile

aeu = pdat_country_summary_by_eu_ntile %>%
  filter(year == 2010,
         indicator == "total_adult_eq") %>%
  group_by(eu_q_rank) %>%
  summarise(value = sum(value),
            eu_ntile_name = first(eu_ntile_name)) 

exp_pae = exp %>%
  rename(total_fd_me = value) %>%
  left_join(aeu, by = c("eu_q_rank", "eu_ntile_name")) %>%
  mutate(pae_fd_e = (total_fd_me/value)*1000000000000)

fd_pae_bottom_decile = round((exp_pae %>% filter(eu_q_rank == 1))$pae_fd_e, digits = 0)

fd_pae_top_decile = round((exp_pae %>% filter(eu_q_rank == 10))$pae_fd_e, digits = 0)

energy_pae = energy %>%
  rename(total_energy_use_tj = value) %>%
  left_join(aeu, by = c("eu_q_rank", "eu_ntile_name")) %>%
  mutate(pae_energy_use_gj = (total_energy_use_tj/value)*1000000000)

energy_pae_bottom_decile = round((energy_pae %>% filter(eu_q_rank == 1))$pae_energy_use_gj, digits = 1)

energy_pae_top_decile = round((energy_pae %>% filter(eu_q_rank == 10))$pae_energy_use_gj, digits = 1)

co2eq_pae = co2eq %>%
  rename(total_co2eq_kg = value) %>%
  left_join(aeu, by = c("eu_q_rank", "eu_ntile_name")) %>%
  mutate(pae_co2eq_t = (total_co2eq_kg/value)*1000000)

co2eq_pae_bottom_decile = round((co2eq_pae %>% filter(eu_q_rank == 1))$pae_co2eq_t, digits = 1)

co2eq_pae_top_decile = round((co2eq_pae %>% filter(eu_q_rank == 10))$pae_co2eq_t, digits = 1)


## intensities

mean_energy_intens = dat_country_summary_by_eu_ntile %>%
                 filter(year == 2010) %>%
                 group_by(eu_q_rank) %>%
                 summarise(pe_energy_use_mj = weighted.mean(pe_energy_use_mj,total_fd_me))

mean_energy_intens_bottom_decile = round((mean_energy_intens %>% filter(eu_q_rank == 1))$pe_energy_use_mj, digits = 1)

mean_energy_intens_top_decile = round((mean_energy_intens %>% filter(eu_q_rank == 10))$pe_energy_use_mj, digits = 1)

mean_co2eq_of_energy_intens = dat_country_summary_by_eu_ntile %>%
  filter(year == 2010) %>%
  mutate(intensity_e_c = total_co2eq_kg*0.001/total_energy_use_tj) %>%
  group_by(eu_q_rank) %>%
  summarise(intensity_e_c = weighted.mean(intensity_e_c,total_energy_use_tj))

mean_co2eq_of_energy_intens_bottom_decile = round((mean_co2eq_of_energy_intens %>% filter(eu_q_rank == 1))$intensity_e_c, digits = 1)

mean_co2eq_of_energy_intens_top_decile = round((mean_co2eq_of_energy_intens %>% filter(eu_q_rank == 10))$intensity_e_c, digits = 1)

In 2010 but using the product-by-product version of EXIOBASE, total household final demand expenditure was r exp_total trn€, the energy footprint r energy_total EJ, and the carbon footprint r co2eq_total MtCO2eq. We estimated the 10:10 ratios at r exp_10_10 for expenditure, r energy_10_10 for the energy footprint, and r co2eq_10_10 for the carbon footprint. Total expenditure ranged from r exp_bottom_decile trn€ to r exp_top_decile trn€ (or r fd_pae_bottom_decile€ to r fd_pae_top_decile€ per adult equivalent) across bottom and top decile, the energy footprint from r energy_bottom_decile EJ to r energy_top_decile EJ (or r energy_pae_bottom_decile GJ/ae to r energy_pae_top_decile GJ/ae), and the carbon footprint from r co2eq_bottom_decile MtCO2eq to r co2eq_top_decile MtCO2eq (or r co2eq_pae_bottom_decile tCO2eq/ae to r co2eq_pae_top_decile tCO2eq/ae). The average energy intensity of consumption was r mean_energy_intens_bottom_decile MJ/€ in the bottom decile and r mean_energy_intens_top_decile MJ/€ in the top decile. The carbon intensity of energy was r mean_co2eq_of_energy_intens_bottom_decile gCO2eq/TJ in the bottom decile, and r mean_co2eq_of_energy_intens_top_decile gCO2eq/TJ in the top decile.


a = p_top / p_bottom + plot_annotation(tag_levels = 'a') +
  plot_layout(guides = 'collect')  & 
  theme(plot.margin = unit(c(0.25,0.25,0.25,0.25), "cm"),
        legend.position = 'bottom',
        axis.title.y = element_text(size=13, hjust = 0.5),
        axis.text.x = element_text(size = 12),
        axis.text.y = element_text(size = 12),
        legend.text = element_text(size=12),
        legend.title = element_text(size=13))

a

ggsave(here("analysis", "figures", "figureS3.pdf"), device=cairo_pdf)

Year 2015, using alternative method, EXIOBASE industry-by-industry

There is relatively good agreement between the alternative method footprints and the EXIOBASE footprints, except in Bulgaria, where the alternative method footprint was around 3 times larger. Including Bulgaria, the alternative method footprints were on average 20% larger than the EXIOBASE footprints. With Bulgaria removed they were 10% larger on average. Eastern European countries especially had larger alternative method footprints due to high intensities in electricity production and hot water supply, and then more expenditure in CP045 multiplied by these intensities than the expenditure in EXIOBASE. This is why the figure shows such high footprints in the bottom European deciles compared to the method keeping EXIOBASE footprints the same (ms results).