# ---- Arithmetic mean ----
# Carli
carli <- \(p1, p0, q1, q0) gmean(p1 / p0)
# Dutot
dutot <- \(p1, p0, q1, q0) gmean(p1 / p0, p0)
# Laspeyres
laspeyres <- \(p1, p0, q1, q0) gmean(p1 / p0, p0 * q0)
# Palgrave
palgrave <- \(p1, p0, q1, q0) gmean(p1 / p0, p1 * q1)
# Walsh-1
walsh1 <- \(p1, p0, q1, q0) gmean(p1 / p0, p0 * sqrt(q0 * q1))
# Marshall-Edgeworth
marshall_edgeworth <- \(p1, p0, q1, q0) gmean(p1 / p0, p0 * (q0 * q1))
# Geay-Khamis
geary_khamis <- \(p1, p0, q1, q0) gmean(p1 / p0, p0 / (1 / q0 + 1 / q1))
# Hybrid CSWD
hybrid_cswd <- \(p1, p0, q1, q0) gmean(p1 / p0, sqrt(p0 / p1))
# Martini
martini <- \(p1, p0, q1, q0, a) gmean(p1 / p0, p0 * q0 * (q1 / p0)^a)
# ---- Geometric mean ----
# Jevons
jevons <- \(p1, p0, q1, q0) gmean(p1 / p0, order = 0)
# Geometric Laspeyres (Jöhr)
geo_laspeyres <- \(p1, p0, q1, q0) gmean(p1 / p0, p0 * q0, order = 0)
# Geometric Paasche
geo_paasche <- \(p1, p0, q1, q0) gmean(p1 / p0, p1 * q1, order = 0)
# Walsh-2
walsh2 <- \(p1, p0, q1, q0) gmean(p1 / p0, sqrt(p0 * p1 * q0 * q1), order = 0)
# Theil
theil <- \(p1, p0, q1, q0) {
w0 <- scale_weights(p0 * q0)
w1 <- scale_weights(p1 * q1)
gmean(p1 / p0, ((w0 + w1) / 2 * w0 * w1)^(1 / 3), order = 0)
}
# Rao
rao <- \(p1, p0, q1, q0) {
w0 <- scale_weights(p0 * q0)
w1 <- scale_weights(p1 * q1)
gmean(p1 / p0, w0 * w1 / (w0 + w1), order = 0)
}
# Sato-Vartia
sato_vartia <- function(p1, p0, q1, q0) {
v0 <- scale_weights(p0 * q0)
v1 <- scale_weights(p1 * q1)
gmean(p1 / p0, emean(v0, v1), order = 0)
}
# ---- Harmonic mean ----
# Coggeshall
coggeshall <- \(p1, p0, q1, q0) gmean(p1 / p0, order = -1)
# Paasche
paasche <- \(p1, p0, q1, q0) gmean(p1 / p0, p1 * q1, order = -1)
# Harmonic Laspeyres
harm_laspeyres <- \(p1, p0, q1, q0) gmean(p1 / p0, p0 * q0, order = -1)
# ---- Generalized mean ----
# Lloyd-Moulton
lloyd_moulton <- \(p1, p0, q1, q0, sigma) {
gmean(p1 / p0, p0 * q0, order = 1 - sigma)
}
# ---- Nested means ----
# Drobisch (Sidgwick)
drobisch <- \(p1, p0, q1, q0) {
nested_gmean(p1 / p0, list(p0 * q0, p1 * q1), outer_order = 1)
}
# Unnamed
unnamed <- \(p1, p0, q1, q0) {
nested_gmean(
p1 / p0,
list(p0 * q0, p1 * q1),
order = c(1, 1),
outer_order = 1
)
}
# Törnqvist-Theil
tornqvist <- \(p1, p0, q1, q0) {
nested_gmean(
p1 / p0,
list(p0 * q0, p1 * q1),
order = c(0, 0)
)
}
# Fisher
fisher <- \(p1, p0, q1, q0) nested_gmean(p1 / p0, list(p0 * q0, p1 * q1))
# CSWD
cswd <- \(p1, p0, q1, q0) nested_gmean(p1 / p0)
# Balk-Walsh
balk_walsh <- \(p1, p0, q1, q0) nested_gmean(p1 / p0, order = c(0.5, -0.5))
# Geometric AG mean
ag_mean <- \(p1, p0, q1, q0, elasticity) {
nested_gmean(
p1 / p0,
list(p0 * q0, p0 * q0),
order = c(0, 1),
outer_weights = c(elasticity, 1 - elasticity)
)
}