fpa_values: Recover private values from first-price auction bids

View source: R/fpa_values.R

fpa_valuesR Documentation

Recover private values from first-price auction bids

Description

Nonparametric inversion of the equilibrium bid function of a symmetric first-price sealed-bid auction through the quantile density of bids:

\hat v = b + \lambda^{-1}\{\psi(\hat u)\,\hat q(\hat u)\},\qquad \hat u = \hat G(b),

where \hat q is a quantile density estimate ([qdf()]), \psi is the copula multiplier (equal to u/(n-1) under independent private values, so that \psi q = G/\{(n-1)g\} and the formula is that of Guerre, Perrigne and Vuong 2000), and \lambda^{-1} accounts for risk aversion (Guerre, Perrigne and Vuong 2009): the identity for risk-neutral bidders and y \mapsto (1-\eta) y for CRRA utility U(t) = t^{1-\eta}.

'method = "zincenko"' gives the kernel estimator of Zincenko (2024): a triweight kernel for \hat G and \hat g with normal-reference bandwidths, and linear extrapolation of the inverse bid function within h_g^{0.99} of the boundaries instead of trimming; the implementation is adapted from code provided by F. Zincenko. 'method = "gpv"' gives the conventional benchmark \hat v = b + \hat G(b)/\{(n-1)\hat g(b)\} with a Gaussian kernel and Sheather–Jones bandwidth for \hat g; '"gpv_bc"' renormalises a triweight kernel by its mass inside the bid support (a simple boundary correction; the Hickman–Hubbard correction is provided by 'fpa_density()').

Usage

fpa_values(
  bids,
  n = NULL,
  method = "indirect_poisson",
  bandwidth = "bcv",
  eta = 0,
  family = "independence",
  theta = NULL,
  u_scheme = c("i/(n+1)", "i/n"),
  monotone = c("none", "spline", "isotonic"),
  trim = 0.1,
  replace = c("all", "boundary"),
  df = 6,
  psi_bw = NULL,
  ...
)

Arguments

bids

numeric vector of pooled bids, or an 'L' by 'n' matrix (one row per auction). A matrix is required for 'family != "independence"' with 'theta = NULL', so that the copula parameter can be estimated from within-auction pairs.

n

number of bidders per auction (taken from 'ncol(bids)' for a matrix).

method

quantile-density estimator passed to [qdf()], or '"gpv"', '"gpv_bc"', '"zincenko"' for the kernel benchmarks.

bandwidth

passed to [qdf()]: a selector name, the rule '"sqrt"' (m = \lceil\sqrt{N}\rceil for 'method = "bernstein"', as in Doosti 2026b), or a numeric bandwidth.

eta

CRRA risk-aversion parameter in [0, 1); '0' is risk neutrality.

family

copula family of the private values: '"independence"', '"clayton"', '"gumbel"', '"frank"' (see [copula_psi()]), or '"nonparametric"' for the flexible copula multiplier of [copula_psi_np()] (the CopQDF-F estimator of Doosti 2026a). With 'method = "gpv"' and a parametric family the inversion is the semiparametric estimator of Hubbard, Li and Paarsch (2012): a kernel bid density combined with a parametric copula.

theta

copula parameter; 'NULL' estimates it by [copula_fit()].

u_scheme

scores \hat u attached to the sorted bids: '"i/(n+1)"' (Hazen ranks, default) or '"i/n"'.

monotone

'"none"', '"spline"' or '"isotonic"'.

trim

tail share excluded from the spline fit (default 0.1, i.e. the central 80 percent is used).

replace

for 'monotone = "spline"': '"all"' or '"boundary"'.

df

degrees of freedom of the natural spline (default 6).

psi_bw

beta-kernel bandwidth for 'family = "nonparametric"'; see [copula_psi_np()].

...

further arguments to [qdf()] (e.g. 'kernel', 'H', 'j0', 'm_range', 'grid', 'zero_at_origin'). In particular 'zero_at_origin = FALSE' switches the Bernstein estimator to the \hat Q(0) = X_{(1)} anchor; with 'method = "bernstein"', 'bandwidth = "sqrt"', 'u_scheme = "i/(n+1)"', 'monotone = "none"' and 'trim = 0' this reproduces the pseudo-values of the revenue estimator of Doosti (2026b) exactly.

Value

An object of class '"fpa_values"': a list with

bids, u

sorted pooled bids and their scores

q, psi, markup

the quantile density, the copula multiplier and the estimated markup \lambda^{-1}(\psi q) at each bid

values_raw, values

pseudo-values before and after the monotonicity step (identical when 'monotone = "none"')

values_mat

when 'bids' is a matrix, 'values' rearranged to the original 'L' by 'n' layout

qdf

the fitted [qdf()] object (or 'NULL' for the kernel benchmarks)

copula

the copula specification / fit

Monotonicity

The equilibrium bid function is increasing, so \hat v should be increasing in b. Departures occur mostly near the boundaries. 'monotone = "spline"' follows Doosti, Dewan and Talebian (2025): a natural cubic spline of \hat v on b is fitted to the central 1 - 2\,\mathrm{trim} share of the bids and its fitted values replace \hat v either everywhere ('replace = "all"', the published implementation) or only in the trimmed tails ('replace = "boundary"'). 'monotone = "isotonic"' applies the pool-adjacent-violators rearrangement ([stats::isoreg()]). '"none"' returns the raw pseudo-values.

References

Guerre, E., Perrigne, I. and Vuong, Q. (2000). Optimal nonparametric estimation of first-price auctions. *Econometrica*, 68, 525–574.

Guerre, E., Perrigne, I. and Vuong, Q. (2009). Nonparametric identification of risk aversion in first-price auctions under exclusion restrictions. *Econometrica*, 77, 1193–1227.

Doosti, H., Dewan, I. and Talebian, M. (2025). *Economics Letters*, 257, 112670.

Doosti, H. (2026a). *Economics Letters*, 261, 112837.

Examples

set.seed(1)
sim <- fpa_simulate(20, 5, Q = function(u) qgamma(u, 2, 10))
fit <- fpa_values(sim$bids, method = "bernstein", bandwidth = "bcv")
fit
plot(fit, true = sim$values)
# risk-averse bidders with CRRA eta = 0.25
fit_ra <- fpa_values(sim$bids, method = "bernstein", bandwidth = 0.05, eta = 0.25)
# affiliated values, Clayton copula estimated from the data

sim2 <- fpa_simulate(50, 3, Q = function(u) 1 + 2 * u^2, family = "clayton", theta = 2)
fit2 <- fpa_values(sim2$bids, method = "indirect_poisson", family = "clayton")
fit2$copula$theta


qdfauction documentation built on Nov. 10, 2026, 5:07 p.m.