price_indexes | R Documentation |
Calculate a variety of price indexes using information on prices and quantities at two points in time.
arithmetic_index(type)
geometric_index(type)
harmonic_index(type)
laspeyres_index(p1, p0, q0, na.rm = FALSE)
paasche_index(p1, p0, q1, na.rm = FALSE)
jevons_index(p1, p0, na.rm = FALSE)
lowe_index(p1, p0, qb, na.rm = FALSE)
young_index(p1, p0, pb, qb, na.rm = FALSE)
fisher_index(p1, p0, q1, q0, na.rm = FALSE)
hlp_index(p1, p0, q1, q0, na.rm = FALSE)
lm_index(elasticity)
cswd_index(p1, p0, na.rm = FALSE)
cswdb_index(p1, p0, q1, q0, na.rm = FALSE)
bw_index(p1, p0, na.rm = FALSE)
stuvel_index(a, b)
arithmetic_agmean_index(elasticity)
geometric_agmean_index(elasticity)
lehr_index(p1, p0, q1, q0, na.rm = FALSE)
type |
The name of the index. See details for the possible types of indexes. |
p1 |
Current-period prices. |
p0 |
Base-period prices. |
q0 |
Base-period quantities. |
na.rm |
Should missing values be removed? By default missing values for prices or quantities return a missing value. |
q1 |
Current-period quantities. |
qb |
Period-b quantities for the Lowe/Young index. |
pb |
Period-b prices for the Lowe/Young index. |
elasticity |
The elasticity of substitution for the Lloyd-Moulton and AG mean indexes. |
a , b |
Parameters for the generalized Stuvel index. |
The arithmetic_index()
, geometric_index()
, and
harmonic_index()
functions return a function to calculate a given
type of arithmetic, geometric (logarithmic), and harmonic index. Together,
these functions produce functions to calculate the following indexes.
Arithmetic indexes
Carli
Dutot
Laspeyres
Palgrave
Unnamed index (arithmetic mean of Laspeyres and Palgrave)
Drobisch (or Sidgwick, arithmetic mean of Laspeyres and Paasche)
Walsh-I (arithmetic Walsh)
Marshall-Edgeworth
Geary-Khamis
Lowe
Young
Hybrid-CSWD
Geometric indexes
Jevons
Geometric Laspeyres (or Jöhr)
Geometric Paasche
Geometric Young
Törnqvist (or Törnqvist-Theil)
Montgomery-Vartia / Vartia-I
Sato-Vartia / Vartia-II
Walsh-II (geometric Walsh)
Theil
Rao
Harmonic indexes
Coggeshall (equally weighted harmonic index)
Paasche
Harmonic Laspeyres
Harmonic Young
Along with the lm_index()
function to calculate the Lloyd-Moulton
index, these are just convenient wrappers for
generalized_mean()
and index_weights()
.
The Laspeyres, Paasche, Jevons, Lowe, and Young indexes are among the most
common price indexes, and so they get their own functions. The
laspeyres_index()
, lowe_index()
, and young_index()
functions correspond to setting the appropriate type
in
arithmetic_index()
; paasche_index()
and jevons_index()
instead come from the harmonic_index()
and geometric_index()
functions.
In addition to these indexes, there are also functions for calculating a
variety of indexes not based on generalized means. The Fisher index is the
geometric mean of the arithmetic Laspeyres and Paasche indexes; the Harmonic
Laspeyres Paasche (or Harmonic Paasche Laspeyres) index is the harmonic
analog of the Fisher index (8054 on Fisher's list). The
Carruthers-Sellwood-Ward-Dalen and Carruthers-Sellwood-Ward-Dalen-Balk
indexes are sample analogs of the Fisher
index; the Balk-Walsh index is the sample analog of the Walsh index. The AG
mean index is the arithmetic or geometric mean of the geometric and
arithmetic Laspeyres indexes, weighted by the elasticity of substitution.
The stuvel_index()
function returns a function to calculate a Stuvel
index of the given parameters. The Lehr index is an alternative to the
Geary-Khamis index, and is the implicit price index for Fisher's index 4153.
arithmetic_index()
, geometric_index()
, harmonic_index()
, and
stuvel_index()
each return a function to compute the relevant price
indexes; lm_index()
, arithmetic_agmean_index()
, and
geometric_agmean_index()
each return a function to calculate the
relevant index for a given elasticity of substitution. The others return a
numeric value giving the change in price between the base period and current
period.
There are different ways to deal with missing values in a price index,
and care should be taken when relying on these functions to remove missing
values. Setting na.rm = TRUE
removes price relatives with missing
information, either because of a missing price or a missing weight, while
using all available non-missing information to make the weights.
Certain properties of an index-number formula may not work as expected when
removing missing values if there is ambiguity about how to remove missing
values from the weights (as in, e.g., a Törnqvist or Sato-Vartia index). The
balanced()
operator may be helpful, as it balances the removal of missing
values across prices and quantities prior to making the weights.
Balk, B. M. (2008). Price and Quantity Index Numbers. Cambridge University Press.
Fisher, I. (1922). The Making of Index Numbers. Houghton Mifflin Company.
IMF, ILO, Eurostat, UNECE, OECD, and World Bank. (2020). Consumer Price Index Manual: Concepts and Methods. International Monetary Fund.
von der Lippe, P. (2007). Index Theory and Price Statistics. Peter Lang.
von der Lippe, P. (2015). Generalized Statistical Means and New Price Index Formulas, Notes on some unexplored index formulas, their interpretations and generalizations. Munich Personal RePEc Archive paper no. 64952.
Selvanathan, E. A. and Rao, D. S. P. (1994). Index Numbers: A Stochastic Approach. MacMillan.
generalized_mean()
for the generalized mean that powers
most of these functions.
contributions()
for calculating percent-change contributions.
quantity_index()
to remap the arguments in these functions for a
quantity index.
price6()
for an example of how to use these functions with more
than two time periods.
The piar package has more functionality working with price indexes for multiple groups of products over many time periods.
Other price index functions:
geks()
,
index_weights()
,
splice_index()
p0 <- price6[[2]]
p1 <- price6[[3]]
q0 <- quantity6[[2]]
q1 <- quantity6[[3]]
pb <- price6[[1]]
qb <- quantity6[[1]]
#---- Calculating price indexes ----
# Most indexes can be calculated by combining the appropriate weights
# with the correct type of mean
geometric_index("Laspeyres")(p1, p0, q0)
geometric_mean(p1 / p0, index_weights("Laspeyres")(p0, q0))
# Arithmetic Laspeyres index
laspeyres_index(p1, p0, q0)
arithmetic_mean(p1 / p0, index_weights("Laspeyres")(p0, q0))
# Harmonic calculation for the arithmetic Laspeyres
harmonic_mean(p1 / p0, index_weights("HybridLaspeyres")(p1, q0))
# Same as transmuting the weights
all.equal(
scale_weights(index_weights("HybridLaspeyres")(p1, q0)),
transmute_weights(1, -1)(p1 / p0, index_weights("Laspeyres")(p0, q0))
)
# This strategy can be used to make more exotic indexes, like the
# quadratic-mean index (von der Lippe, 2007, p. 61)
generalized_mean(2)(p1 / p0, index_weights("Laspeyres")(p0, q0))
# Or the exponential mean index (p. 62)
log(arithmetic_mean(exp(p1 / p0), index_weights("Laspeyres")(p0, q0)))
# Or the arithmetic hybrid index (von der Lippe, 2015, p. 5)
arithmetic_mean(p1 / p0, index_weights("HybridLaspeyres")(p1, q0))
contraharmonic_mean(p1 / p0, index_weights("Laspeyres")(p0, q0))
# Unlike its arithmetic counterpart, the geometric Laspeyres can
# increase when base-period prices increase if some of these prices
# are small
gl <- geometric_index("Laspeyres")
p0_small <- replace(p0, 1, p0[1] / 5)
p0_dx <- replace(p0_small, 1, p0_small[1] + 0.01)
gl(p1, p0_small, q0) < gl(p1, p0_dx, q0)
#---- Price updating the weights in a price index ----
# Chain an index by price updating the weights
p2 <- price6[[4]]
laspeyres_index(p2, p0, q0)
I1 <- laspeyres_index(p1, p0, q0)
w_pu <- update_weights(p1 / p0, index_weights("Laspeyres")(p0, q0))
I2 <- arithmetic_mean(p2 / p1, w_pu)
I1 * I2
# Works for other types of indexes, too
harmonic_index("Laspeyres")(p2, p0, q0)
I1 <- harmonic_index("Laspeyres")(p1, p0, q0)
w_pu <- factor_weights(-1)(p1 / p0, index_weights("Laspeyres")(p0, q0))
I2 <- harmonic_mean(p2 / p1, w_pu)
I1 * I2
#---- Percent-change contributions ----
# Percent-change contributions for the Tornqvist index
w <- index_weights("Tornqvist")(p1, p0, q1, q0)
(con <- geometric_contributions(p1 / p0, w))
all.equal(sum(con), geometric_index("Tornqvist")(p1, p0, q1, q0) - 1)
#---- Missing values ----
# NAs get special treatment
p_na <- replace(p0, 6, NA)
# Drops the last price relative
laspeyres_index(p1, p_na, q0, na.rm = TRUE)
# Only drops the last period-0 price
sum(p1 * q0, na.rm = TRUE) / sum(p_na * q0, na.rm = TRUE)
#---- von Bortkiewicz decomposition ----
paasche_index(p1, p0, q1) / laspeyres_index(p1, p0, q0) - 1
wl <- scale_weights(index_weights("Laspeyres")(p0, q0))
pl <- laspeyres_index(p1, p0, q0)
ql <- quantity_index(laspeyres_index)(q1, q0, p0)
sum(wl * (p1 / p0 / pl - 1) * (q1 / q0 / ql - 1))
# Similar decomposition for geometric Laspeyres/Paasche
wp <- scale_weights(index_weights("Paasche")(p1, q1))
gl <- geometric_index("Laspeyres")(p1, p0, q0)
gp <- geometric_index("Paasche")(p1, p0, q1)
log(gp / gl)
sum(scale_weights(wl) * (wp / wl - 1) * log(p1 / p0 / gl))
#---- Consistency in aggregation ----
p0a <- p0[1:3]
p0b <- p0[4:6]
p1a <- p1[1:3]
p1b <- p1[4:6]
q0a <- q0[1:3]
q0b <- q0[4:6]
q1a <- q1[1:3]
q1b <- q1[4:6]
# Indexes based on the generalized mean with value share weights are
# consistent in aggregation
lm_index(0.75)(p1, p0, q0)
w <- index_weights("LloydMoulton")(p0, q0)
Ia <- generalized_mean(0.25)(p1a / p0a, w[1:3])
Ib <- generalized_mean(0.25)(p1b / p0b, w[4:6])
generalized_mean(0.25)(c(Ia, Ib), c(sum(w[1:3]), sum(w[4:6])))
# Agrees with group-wise indexes
all.equal(lm_index(0.75)(p1a, p0a, q0a), Ia)
all.equal(lm_index(0.75)(p1b, p0b, q0b), Ib)
# Care is needed with more complex weights, e.g., Drobisch, as this
# doesn't fit Balk's (2008) definition (p. 113) of a generalized-mean
# index (it's the arithmetic mean of a Laspeyres and Paasche index)
arithmetic_index("Drobisch")(p1, p0, q1, q0)
w <- index_weights("Drobisch")(p1, p0, q1, q0)
Ia <- arithmetic_mean(p1a / p0a, w[1:3])
Ib <- arithmetic_mean(p1b / p0b, w[4:6])
arithmetic_mean(c(Ia, Ib), c(sum(w[1:3]), sum(w[4:6])))
# Does not agree with group-wise indexes
all.equal(arithmetic_index("Drobisch")(p1a, p0a, q1a, q0a), Ia)
all.equal(arithmetic_index("Drobisch")(p1b, p0b, q1b, q0b), Ib)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.