tfp_index: Fare-Primont and Lowe TFP Indexes with a Metafrontier...

View source: R/tfp_index.R

tfp_indexR Documentation

Fare-Primont and Lowe TFP Indexes with a Metafrontier Decomposition

Description

Computes multiplicatively complete and transitive total factor productivity (TFP) indexes, the Fare-Primont and the Lowe index, and decomposes TFP efficiency following O'Donnell (2012), both against each group's technology and against the metatechnology (all groups pooled).

Usage

tfp_index(
  formula,
  data,
  group,
  time,
  id,
  index = c("fare-primont", "lowe"),
  orientation = c("output", "input"),
  rts = c("vrs", "crs"),
  tech = c("contemporaneous", "sequential"),
  output_prices = NULL,
  input_prices = NULL
)

Arguments

formula

a formula with the outputs on the left and the inputs on the right, e.g. cbind(y1, y2) ~ x1 + x2. Quantities must be non-negative (levels, not logs).

data

a data frame.

group, time, id

column names in data (or vectors of length nrow(data)) identifying the technology group, the period and the unit.

index

"fare-primont" (default) or "lowe".

orientation

"output" (default) or "input": which efficiency components the TFP efficiency is decomposed into.

rts

returns to scale of the technologies: "vrs" (default) or "crs".

tech

"contemporaneous" (default; the technology of period t is formed from the observations of period t) or "sequential" (from all observations up to period t, so no technical regress).

output_prices, input_prices

column names of the output and input prices, in the order of the outputs and inputs in formula. Required for the Lowe index, which aggregates with their sample means; ignored for the Fare-Primont index.

Details

Output and input aggregates are linear, Q(y) = p'y and X(x) = w'x, with the same weights for every observation, so TFP = Q/X is a level and the index between any two observations, the ratio of their TFP levels, is transitive. The Fare-Primont weights are the normalised shadow prices of the output and input distance functions at the sample-mean observation, evaluated against the pooled data (O'Donnell, 2012); the Lowe weights are the sample means of the observed prices.

TFP efficiency is TFPE = TFP / TFP*, where TFP* is the maximum TFP attainable in the reference technology. With output orientation it is decomposed as TFPE = OTE x OME x ROSE = OTE x OSE x RME (technical, mix, residual scale, scale and residual mix efficiency), with scale-mix efficiency OSME = OME x ROSE; with input orientation as TFPE = ITE x IME x RISE = ITE x ISE x RME, with ISME = IME x RISE.

Each component is computed against the technology of the unit's group (suffix _group) and against the metatechnology formed from all groups (suffix _meta). The TFP metatechnology ratio is MTR = TFP*_group / TFP*_meta, in (0, 1], so that TFPE_meta = TFPE_group x MTR.

Programmes that are infeasible give NA and are counted in a single warning.

Value

An object of class "tfp_meta": a list with

levels

one row per observation: id, group, time, the aggregates AO and AI, TFP, and for each reference (_group, _meta) TFP_star, TFPE and the efficiency components, plus MTR

changes

one row per unit and pair of consecutive periods of the sample in which it is observed in both: the ratio (period_to over period_from) of every level column, prefixed with d

weights

the output and input aggregation weights

settings, groups, periods, n_infeasible, call

settings and metadata

References

O'Donnell, C.J. (2012). Nonparametric estimates of the components of productivity and profitability change in U.S. agriculture. American Journal of Agricultural Economics, 94(4), 873–890. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1093/ajae/aas023")}

O'Donnell, C.J. (2018). Productivity and Efficiency Analysis. Springer. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1007/978-981-13-2984-5")}

See Also

malmquist_meta

Examples

set.seed(1)
d <- expand.grid(firm = 1:6, year = 1:3)
d$region <- ifelse(d$firm <= 3, "A", "B")
d$x1 <- runif(nrow(d), 1, 10)
d$x2 <- runif(nrow(d), 1, 10)
d$y <- d$x1^0.5 * d$x2^0.3 * runif(nrow(d), 0.6, 1)
tfp <- tfp_index(y ~ x1 + x2, data = d, group = "region",
                 time = "year", id = "firm")
tfp
head(tfp$levels[, c("firm", "year", "TFP", "TFPE_meta", "MTR")])


metafrontier documentation built on Oct. 28, 2026, 5:13 p.m.