This release responds to feedback from Frank Cowell and Emmanuel Flachaire (personal communication, 1 May 2026) on the v0.1.0 release. Two gaps were flagged: confidence intervals were available only for the Gini, and the package rejected non-positive values for the Gini and the top shares. A follow-up internal audit produced several smaller fixes that ship together.
Bootstrap confidence intervals are now available on every inequality
function via ci = TRUE. Each function gains
ci, R, and level arguments
matching the existing Gini API. Results are returned in
ci_lower, ci_upper, and se fields
on the output object and shown by the print method.
Functions extended: iq_theil(),
iq_atkinson(), iq_sgini(),
iq_palma(), iq_hoover(),
iq_kolm(), iq_percentile_ratio(),
iq_polarisation(), iq_shares(),
iq_concentration(), iq_kakwani(), and
iq_poverty().
The bootstrap uses probability-proportional resampling, so survey weights flow through to the variance, not just the point estimate.
iq_compare()
runs one bootstrap loop, propagates CIs to every rowWhen ci = TRUE, iq_compare() now runs a
single resample loop and attaches ci_lower and
ci_upper columns to every row of the table. The old
gini_ci field is removed. The table now also covers S-Gini,
Kolm, and Wolfson (12 measures, up from 9).
negatives = "keep"Functions that are mathematically defined for distributions
containing negative values now accept
negatives = c("error", "keep"), with "error"
as the default for back-compatibility. With
negatives = "keep":
iq_gini() and iq_sgini() permit negatives;
the index is still computed by the standard formula but is no longer
bounded in [0, 1]. The print method emits a note when the input contains
negatives.iq_shares() permits negatives; segment shares may fall
outside [0, 1] and a warning is issued. If total income is non-positive,
the function returns NA shares with a warning.iq_palma(), iq_hoover(), and
iq_polarisation() similarly accept negatives.iq_kolm() already worked for negative values and is
unchanged.
iq_atkinson() and iq_theil() continue to
require strictly positive values: they involve log(x) or
x^(1 - epsilon) for which the formula is mathematically
undefined at zero or below. The error message now documents this
explicitly.
iq_kakwani() no longer takes the absolute value of
post-tax income before computing the post-tax Gini. Households whose
post-tax income is negative are now reflected honestly in the
Reynolds-Smolensky index.iq_palma() and iq_polarisation() now warn
rather than abort when the relevant denominator is non-positive
(returning NA).NA (with a warning) when
the population mean is non-positive. Previously the function returned
0 when mu == 0, which conflated “perfect
equality” with “undefined”. With negatives = "keep" set,
the user is pointed at normalised = TRUE for the Raffinetti
et al. (2017) bounded variant.x = 0
from the Watts sum (since log(line / 0) diverges) and emits
a one-time warning. FGT measures and the Sen index continue to include
all poor observations.iq_percentile_ratio() now warns when the lower
percentile is negative, since the resulting ratio sign-flips and has no
inequality interpretation.negatives = "keep", which those wrappers do not
expose. Instead the message points the user at measures that admit zero
or negative support.iq_gini() gains a normalised flag
implementing the Raffinetti, Siletti and Vernizzi (2017) Gini variant,
which is bounded in [-1, 1] for distributions containing negative
values.iq_compare() gains a negatives argument.
With negatives = "keep" it permits zero or negative input
and returns NA for the Theil and Atkinson rows (which are
mathematically undefined for non-positive values), while still computing
Gini, S-Gini, Kolm, Wolfson, Hoover, Palma and percentile-ratio
rows.iq_concentration() gains a
correction = "wagstaff" option for the Wagstaff (2005)
normalised concentration index, alongside the existing Erreygers (2009)
correction.?iq_theil now documents the convention difference vs
the legacy ineq package
(ineq::Theil(x, parameter = 0) corresponds to GE(1) / Theil
T here, not to GE(0) / Theil L).tests/testthat/test-axioms.R locks in scale
invariance, Kolm translation invariance, Pigou-Dalton transfer
principle, anonymity, parameter monotonicity, decomposition exactness,
the Erreygers and Wagstaff bounds, and bootstrap nominal coverage.tests/testthat/test-cross-package.R cross-checks
Gini, Theil, and Atkinson values against the legacy ineq
package on a fixed seed. Skipped when ineq is not installed
and on CRAN.Thanks to Frank Cowell and Emmanuel Flachaire for the careful read and the two-line list of gaps.
iq_gini(), following Davidson (2009).iq_sgini(), following Donaldson and Weymark
(1980).iq_theil(), following Theil (1967) and Shorrocks
(1980).iq_atkinson().iq_kolm().iq_palma().iq_hoover().iq_percentile_ratio().iq_lorenz().iq_decompose(), following Bourguignon
(1979).iq_shares().iq_concentration().iq_polarisation().iq_poverty().iq_growth_incidence(), following Ravallion and Chen
(2003).iq_kakwani().iq_compare().
Need a high-speed mirror for your open-source project?
Contact our mirror admin team at info@clientvps.com.
This archive is provided as a free public service to the community.
Proudly supported by infrastructure from VPSPulse , RxServers , BuyNumber , UnitVPS , OffshoreName and secure payment technology by ArionPay.