pgt: Data Envelopment Analysis for Pollution-Generating Technologies

pgt implements nonparametric efficiency analysis for pollution-generating technologies under the materials-balance principle. It packages the competing axiom systems for modelling bad outputs behind one interface, with an enforced materials-balance identity, a pre-estimation feasibility audit, metafrontier decompositions, bad-output shadow prices, marginal abatement cost curves, a productivity index and subsampling inference.

The materials-balance principle goes back to Ayres and Kneese (1969); Lauwers (2009) makes the case for building it into frontier models, and Dakpo, Jeanneaux and Latruffe (2016) survey the modelling landscape. Existing R packages handle undesirable outputs by data translation (deaR’s Seiford-Zhu undesirable-output models) or by weak disposability and directional distances (Benchmarking::dea.direct, nonparaeff’s directional-distance routines), but, to our knowledge, no maintained package in R or any other major statistical ecosystem ships materials-balance-constrained DEA; applied studies implement these estimators in ad-hoc optimisation code. pgt packages them behind one coherent API.

Scope

Each technology has one good output; several pollutants (with their own materials-balance accounts) and DMU-specific material flow coefficients are supported. The efficiency estimators treat the rows as an independent cross-section: panel structure enters only through pgt_ml()’s pooled global frontier, and boot_pgt() warns when a panel technology is subsampled.

Installation

# development version
remotes::install_github("iik1/pgt")
# the peer-reviewed snapshot
remotes::install_github("iik1/pgt@v0.4.1")

Cite the package with citation("pgt").

Quick start

library(pgt)
data(steeldemo)   # synthetic steel-plant panel shipped with the package

# 1. Build the technology: inputs in CO2-potential units (u = 1),
#    v = carbon retained in the product.
tech <- pgt_tech(
  x = steeldemo[, c("coal_coke", "other_fuel", "raw_material", "flux")],
  y = steeldemo$production,
  b = steeldemo$emissions,
  v = 0.01467,
  group = steeldemo$route,
  id = steeldemo$plant
)

# 2. Audit the materials-balance identity before estimating.
mb_check(tech)

# 3. Fit the weak-G-disposability model (Rodseth 2025, Eq. 6).
fit <- pgt(tech, model = "wgd")
summary(fit)

# 4. Decompose environmental efficiency across production routes.
summary(pgt_decompose(tech, type = "envelope"))

# 5. Shadow prices and the marginal abatement cost curve.
head(shadow_prices(fit))
plot(mac_curve(fit, price = 550))

# 6. Compare competing axiom systems on the same data.
compare_models(tech, models = c("wgd", "byprod", "mb_cost", "wd"))

Models

Function What it does
pgt_tech() Technology constructor: inputs, good/bad outputs, material flow coefficients u, v, abatement a, technology groups, panel period
mb_check() Audit of u'x - v y >= b per DMU and pollutant
pgt(model = "wgd") Rodseth (2025) weak-G-disposability LP
pgt(model = "envelope") Eq. 6 with inputs free: convex lower (y, b) envelope
pgt(model = "fdmo") Rodseth (2025) directional representation, Eq. 13 (alias "ddf")
pgt(model = "mb_cost") Coelli et al. (2007) materials-balance cost model, EE = TE x EAE
pgt(model = "byprod") Murty-Russell-Levkoff (2012) by-production intersection technology
pgt(model = "wd") Kuosmanen (2005) weak-disposability reference model
pgt_decompose() Metafrontier decompositions (envelope WR x TGR; staged Rodseth)
compare_models() Competing axiom systems on identical data, with rank agreement
pgt_ml() Global Malmquist-Luenberger productivity index (Oh 2010; experimental)
boot_pgt() Subsampling inference for scores and group means (heuristic intervals)
shadow_prices(), mac_curve() Constraint duals and marginal abatement cost curves

DMU-specific material flow coefficients and multiple pollutants are supported: pass u as a matrix or list and b as a matrix.

Validation

Validation runs as unit tests on every check, at three levels of strength.

The vignettes reproduce the published-table replications in the open: vignette("replication", "pgt").

Vignettes

References