Documentation scoping and validation hardening after a full paper-code audit; no estimator changes.
mb_check()’s
count of accounts with a strictly negative closure gap is renamed from
n_exact to n_negative — the old name read as a
count of exactly closing accounts, the opposite of what it counts. The
tolerance-flagged count n_violations is unchanged.?uscoal documents the SO2 measurement provenance (eGRID
values are stack measurements only for CAMD-reporting units, and
emission-factor estimates built from EIA heat input elsewhere, with a
CHP plant’s SO2 allocated to electricity) and the total-fuel basis of
coal, which at combined-heat-and-power plants tilts
accounts toward looser closure.pgt() documents the directional model’s open-account
warning threshold (relative closure gap above 1e-6),
mb_cost’s status 2 without a solver call for units with no
pollutant-bearing inputs, and that "wd" reports no output
duals; the documented boot_pgt() default m
gains its max(2, .) floor.wgd convention for the implied
uncontrolled emission on deliberately open accounts: z_star
is the peer mix of accounting caps sum lambda (u'x - v'y),
which equals sum lambda (b + a) only when the peers’
accounts close.Faithful weak-G-disposability, several intended outputs, and the five-component decomposition of Rodseth (2025), from a close reading of the published paper.
pgt(model = "wgd") now implements Rodseth (2025) Eq.
6/7 as printed: only the intended outputs are held at the evaluated
unit’s levels; inputs are decision variables. The reduced form minimises
sum lambda (b_l + v_i'y_l) - v_i'y_i over
output-constrained peer mixes. The programme is always self-feasible,
scores lie in (0, 1] on any data, and materials-balance violations no
longer affect it (they remain a data audit in mb_check()).
When an abatement output is observed the fit reports the projection’s
implied uncontrolled emission z_star and abatement
a_star, the quantities of the paper’s Table 2, which the
test suite now replicates. Output duals are total derivatives and can be
negative under large retained content. Scores on any data with
v > 0 differ from 0.5.x.model = "wgd_input_fixed" (briefly
named wgd_anchored in unreleased development commits),
documented as the package’s own current-input benchmark rather than Eq.
6. It keeps the cap, mb_headroom, infeasibility confined to
violators, and the per-pollutant cap rows.pgt_tech() accepts y as an L x M matrix
with named columns and v in per-output shapes up to an L x
M x P array; every historical single-output shape still works. All
estimators except fdmo and pgt_ml handle M
> 1 (those two stop with a clear error, since their directions are
defined for a single output). Fits carry one column per output and
per-output duals; mac_curve() requires a single-output
fit.pgt_decompose(type = "rodseth") is now the
five-component decomposition of Rodseth (2025, Eq. 11), built on stage
programmes of the extended representation (Eq. 9): TE production,
Quality (producer-specific coefficients), AE production, TE abatement
(observed abatement output) and AE abatement (dedicated
pollution-control inputs). Components collapse to exactly 1 when the
data cannot separate them, and their product telescopes to the wgd
efficiency. Technology groups are no longer required for this type. The
stage programmes use measurement-consistent uncontrolled emissions
z = b + a, which coincide with the paper’s accounting when
accounts close.x_abate is now functional: it partitions the inputs for
the two abatement stages, and the recorded-but-unused warning is
gone.lp_solve scalings, each attempt
time-limited: with the default scaling alone, self-feasible stages on
large-magnitude data (emissions of order 1e7) were reported as
numerically failed for a handful of units.pgt_ml() now defaults to
technology = "wd", the weak-disposability reference under
which Oh (2010) defines the index, and the input-keeping exploratory
option is named "input_envelope" (previously
"wgd"): it keeps the input rows of the pre-0.6.0 programme,
so after the wgd redefinition its old label no longer matched the
estimating model of the same name. No technology label is now shared
with a pgt() model whose programme differs.inst/simulations/coverage.R writes its results next to
the script when the package-source path is absent, so a sourced
installed copy no longer fails at the final write.boot_pgt() returns NA bounds and standard
error for a DMU whose feasible replicates fall below half of
B, instead of an interval resting on the remainder;
n_ok still reports the count.print.pgt_tech() separates the dimension counts with
semicolons and wraps the DMU-specific-coefficient and audit lines within
a 76-character console.b_star warning of
model = "mb_cost" no longer attributes the sign to
DMU-specific coefficients, which need not be present; any positive
retained-content coefficient permits it.uscoal: 212 US coal-fired power plants
(2022) with a measured sulfur-dioxide materials-balance account, built
from EIA-923 and EPA eGRID2022 (construction in
data-raw/uscoal.R). Producer-specific sulfur-based
coefficients, an FGD sorbent pollution-control input for
x_abate, an FGD/no-FGD group, and 8 genuinely violating
accounts for the audit. ?uscoal documents that
sorbent is 0 both without SO2 controls and at the 36 FGD
plants that report no sorbent quantity, so fgd, not a zero
sorbent, is the scrubbing indicator.plot.pgt_compare() varies line type as well as colour,
so the series stay readable in greyscale, and labels the y axis
“Principal score (b*/b; EE for mb_cost)” when mb_cost is
among the compared models: its EE is a material-inflow ratio, not an
emission ratio. Passing lty, col,
xlab or ylab overrides the defaults.mean_eff (previously fgl): the column is a
plain average, not the Fare-Grosskopf-Lovell hyperbolic graph measure,
and its old name invited the confusion.status column is documented as the
lp_solve solver code (0 solved, 2 infeasible, 5 numerically
failed), and the directional model’s documentation warns that rescaling
y or b changes its implicit direction
weighting, not merely the reported number.efficiency
column is called the principal environmental-efficiency score throughout
the documentation and printed output; the internal helper was renamed
accordingly.Revisions from a full peer review of the package as a software submission.
boot_pgt() no longer forces the evaluated DMU into
every subsample: each unit is scored against the subsample frontier
alone, so frontier units carry genuine resampling variation instead of a
degenerate zero-width interval. Replicates with an infeasible programme
surface as NA; the new per_dmu$n_ok column
counts feasible replicates and a warning fires when they run thin.
Interval endpoints truncate to [0, max(1, estimate)],
respecting above-1 violator scores.kappa for model = "byprod" now
uses the polluting-input dimension of the T2 sub-programme;
boot_pgt() warns when a panel technology is subsampled as a
cross-section; group-mean intervals are documented as a descriptive
stability band (the aggregate theory of Kneip, Simar and Wilson 2015 is
not implemented).boot_pgt_sensitivity() reports the implied rate
exponent kappa_hat from the Politis-Romano-Wolf log-spread
regression, so the borrowed DEA rate is checkable, plus the median over
strictly positive widths.inst/simulations/coverage.R; its results are reported in
the productivity vignette.pgt_ml() gains technology = "wd": the
weak-disposability directional distance in the Kuosmanen form, the
technology under which Chung, Fare and Grosskopf (1997) and Oh (2010)
define the index, making it the faithful Oh (2010) comparator. The
free-disposal semantics of the default "wgd" and
"envelope" options are now stated plainly and the claim
that they coincide with the weak-disposability index when the cap does
not bind has been removed (it was not what the kernel computed).models states every estimating
programme in full, and multiple-pollutants demonstrates
multi-pollutant technologies, DMU-specific coefficients and the staged
decomposition.compare_models() documents that the models’ principal
scores are different quantities (EE for mb_cost) and that only
rank-based statistics are strictly comparable; mac_curve()
documents which margin the curve prices; foundational and origin
literature is cited (Ayres and Kneese 1969; Lauwers 2009; Dakpo,
Jeanneaux and Latruffe 2016; Chung, Fare and Grosskopf 1997; Chambers,
Chung and Fare 1996; Kuosmanen and Podinovski 2009; O’Donnell, Rao and
Battese 2008; Hampf 2014; Fare, Grosskopf, Lovell and Yaisawarng 1993),
every vignette carries a reference list, and DOIs are attached
throughout.inst/CITATION added; a package overview with a scope
statement replaces the empty pgt-package help page; the
README states the package’s scope and labels the experimental and
heuristic modules.Fixes from a whole-package review.
boot_pgt() now builds proper subsampling intervals
(Politis and Romano 1994): the subsample distribution is recentred at
the point estimate and rescaled by the relative convergence rate
(m/L)^kappa, so intervals extend downward from the
estimate, matching the direction of the frontier bias. Previous versions
built percentile intervals from the raw subsample distribution, which
lies entirely at or above the point estimate. The reported
se is rescaled the same way. A new kappa
argument controls the rate exponent, defaulting to the DEA rate for the
model’s effective dimension.boot_pgt() restores the caller’s RNG state on exit
instead of permanently reseeding the session.pgt(model = "wgd") now enforces every
pollutant’s materials-balance cap on the peer mix, as documented;
earlier versions constrained only the selected pollutant.pgt(model = "fdmo") warns when material accounts do not
close exactly (u'x - v y != b + a): the model imposes the
identity as an equality, so open accounts either make the LP infeasible
or shift the closure gap into the scores. mb_check()
reports the equality residual in a new closure column when
abatement is observed.pgt(model = "byprod") or
"mb_cost" now sets every score of that DMU to
NA, so status != 0 always means the scores are
NA, matching the warning text and
boot_pgt().pgt(model = "mb_cost") warns when the implied minimal
emission b_star is negative (possible under DMU-specific
coefficients).pgt() and pgt_decompose() warn that
x_abate is recorded but not yet used by any estimator.pgt_tech() rejects an ambiguous v whose
length equals both the number of DMUs and the number of pollutants, and
rejects duplicated (id, period) pairs, which
pgt_ml() silently mismatched before.compare_models() recognises the documented aliases:
wgd_rodseth is accepted, and ddf now yields
the clear directional-model rejection instead of a misleading
unknown-model error. Duplicated entries are ignored with a warning, and
the largest-disagreement line no longer reports a model’s
self-correlation.mac_curve() and shadow_prices() now error
clearly for models without output duals (fdmo,
byprod, mb_cost, wd); earlier
versions returned an empty curve reporting zero exclusions.print() on a subset of an mb_check() audit
reports counts for the printed rows, not the full table.summary() of a pgt_ml fit no longer errors
when transitions contain NA; failed distance LPs are
counted and warned about.envelope) and by summary() as well.pgt(pollutant = <character vector>) gives a clear
error instead of an internal condition-length failure.boot_pgt()).Benchmarking dropped from Suggests (never
used).Panel productivity measurement and inference.
pgt_ml(): the global Malmquist-Luenberger productivity
index (Oh
GML = EC x BPC). The global reference frontier removes the
cross-period infeasibility of the adjacent-period index. Marked
experimental: the index under a materials-balance technology is not yet
settled in the literature.boot_pgt() and boot_pgt_sensitivity():
subsampling (m out of n) confidence intervals for per-DMU scores and
group means, with a subsample-size sensitivity check. The intervals are
heuristic; the documentation states why.pgt_tech() gains a period argument for
panel data.pgt_ml and
pgt_boot.Competing axiom systems and a comparison harness.
pgt(model = "byprod"): the by-production intersection
technology of Murty, Russell and Levkoff (2012). Reports output
efficiency, emission efficiency and their graph average. Unit tests
reproduce the analytic scores of the paper’s Example 1.pgt(model = "mb_cost"): the materials-balance cost
model of Coelli, Lauwers and Van Huylenbroeck (2007), with the
EE = TE x EAE decomposition into technical and
environmental-allocative efficiency.pgt(model = "wd"): the weak-disposability model
(Kuosmanen 2005 correct VRS formulation) as a reference axiom
system.compare_models(): fits the efficiency-scored models on
one technology and reports Spearman rank agreement, worst-quartile
overlap and the largest ranking disagreement.pgt_tech() gains a polluting argument
marking the emission-causing inputs of the by-production model.The directional representation and richer material accounting.
pgt(model = "fdmo"): the factorially determined
multi-output (directional) representation of Rodseth (2025), Eq. 13 with
abatement fixed at each DMU’s own level (alias "ddf").
Jointly expands the good output and contracts the bad output; returns
good-output, bad-output and gross efficiency. Unit tests reproduce the
paper’s Table 3.u may be an
L x N matrix and v a length-L
vector, so material or output quality can vary across units (Eder 2022,
Rodseth 2025).b may be an
L x P matrix, with u a named list and
v a vector or matrix; each pollutant carries its own
materials-balance identity, and a pollutant argument
selects the one to estimate.pgt_tech() gains an a (abatement output)
argument, required by the directional model.Initial release: the Rodseth (2025) weak-G-disposability slice.
pgt_tech(): pollution-generating technology constructor
with materials-balance metadata (material flow coefficients
u, v).mb_check(): pre-estimation audit of the
materials-balance identity u'x - v y >= b.pgt(): per-DMU minimum-bad-output estimation; models
"wgd" (Rodseth 2025, Eq. 6 reduced form, alias
"wgd_rodseth") and "envelope" (Eq. 6 with
inputs free: the convex lower (y, b) envelope); VRS/CRS; pooled or group
reference sets.pgt_decompose(): metafrontier decompositions of
environmental efficiency; "envelope" (Total = WR x TGR,
exact identity, no feasibility screen) and "rodseth" (TE x
Technology x AE from staged relaxations of the full WGD program).shadow_prices() and mac_curve():
constraint duals and marginal abatement cost curves.print, summary, plot,
as.data.frame methods; synthetic steeldemo
panel; testthat suite with hand-computed LP checks and a cross-check
against an independent reference implementation of the reduced-form
program.pigfarms data: the numerical example of Rodseth (2025),
Table 1. Unit tests replicate the paper’s Table 2 minimal controlled
emissions (16, 16, 16, 20, 16) and recover its abatement column from the
mb_check() closure gap.