price_indexes {gpindex} | R Documentation |
Price indexes
Description
Calculate a variety of price indexes using information on prices and quantities at two points in time.
Usage
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)
Arguments
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. |
Details
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 (arithmetic mean of Laspeyres and Paasche)
Walsh-I (arithmetic Walsh)
Marshall-Edgeworth
Geary-Khamis
Lowe
Young
-
Geometric indexes
Jevons
Geometric Laspeyres
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 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.
Value
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.
Note
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.
References
Balk, B. M. (2008). Price and Quantity Index Numbers. Cambridge University Press.
Fisher, I. (1922). The Making of Index Numbers. Houghton Mifflin Company.
ILO, IMF, OECD, Eurostat, UN, and World Bank. (2020). Consumer Price Index Manual: Theory and Practice. International Monetary Fund.
von der Lippe, P. (2001). Chain Indices: A Study in Price Index Theory, Spectrum of Federal Statistics vol. 16. Federal Statistical Office, Wiesbaden.
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.
See Also
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()
Examples
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)),
scale_weights(
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, 2001, p. 71)
generalized_mean(2)(p1 / p0, index_weights("Laspeyres")(p0, q0))
# Or the exponential mean index (p. 64)
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)