Fits the extended stochastic frontier model of Hafner, Manner and Simar (2018), in which one parameter \(\gamma\) carries both the scale of inefficiency (its size) and the direction of skewness (its sign), so a wrongly skewed sample gives a well-defined non-degenerate fit instead of collapsing.
esfm(formula, data, dist = c("halfnormal", "exponential"), inefdec = TRUE,
start = NULL)symmetry_test(object)
An object of class "esfm" (and "sfareg"), whose out
matrix reports gamma, sigv and the frontier coefficients, with
Efficiency holding \(E[\exp(-U) \mid W]\) for each firm.
Model and data, as for sfm.
Base density for the inefficiency term.
TRUE for a production frontier, FALSE for cost.
Optional numeric start, c(gamma, sigma_v, beta).
An "esfm" fit.
The classical frontier implies a negatively skewed composed error. When the
sample skewness comes out positive -- common at small \(n\) or large
\(\sigma_v/\sigma_u\), and a small-sample accident rather than evidence
against the model -- the MLE collapses: \(\sigma_u\) is exactly zero, every
firm is fully efficient, and the fit is uninformative. That is the Type I
failure skewness_test reports.
This model keeps the frontier and widens the distribution of \(u\). For \(\gamma > 0\), \(u\) has the classical density with scale \(|\gamma|\); for \(\gamma < 0\) that density is mirrored about zero, shifted right by \(B = a_0|\gamma|\) and truncated to \([0, B]\), giving negative skewness for \(u\) and so positive skewness for the composed error. The truncation constant \(a_0\) is fixed, not estimated: it is chosen so \(E[u] = k_1|\gamma|\) whichever sign \(\gamma\) takes, which keeps the model a one-parameter scale family and avoids the identification difficulties of bounded-inefficiency models. \(a_0 = 1.3892032925\) for the half-normal and \(1.5936242600\) for the exponential.
The classical model is nested at \(\gamma > 0\), and \(\gamma = 0\)
is an interior point rather than a boundary. So the likelihood ratio
test of \(H_0: \gamma = 0\) -- no inefficiency, symmetric errors -- is an
ordinary \(\chi^2(1)\), not the chi-bar-square mixture that
inefficiency_test needs for the classical model.
What it does on a wrongly skewed sample. On a 50-observation draw with
positive residual skewness, sfm(model_name = "NHN") returns
\(\sigma_u = 0.0003\) and mean efficiency 0.99976 -- every firm on the
frontier. esfm() returns \(\hat\gamma = -0.57\) with slopes still
near their true values.
Size of the LR test, 2000 replications against the paper's 100,000, on its design (\(\sigma_v = 1\), \(\gamma = 0\)):
| \(n\) | 50 | 100 | 200 | 500 | 1000 |
| this package, 5% | 0.178 | 0.082 | 0.054 | 0.061 | 0.058 |
| paper, 5% | 0.152 | 0.076 | 0.061 | 0.054 | 0.053 |
The test is badly oversized below \(n = 100\) and usable from \(n = 200\), which is the paper's own conclusion.
Efficiency bias, and a caveat. The paper reports smaller bias in mean efficiency than the classical model even when the population skewness has the correct sign. That reproduces when inefficiency is not small: at \(\gamma = 0.5\), \(\sigma_v = 0.25\) the bias in \(E[\exp(-U)]\) is -0.0001 at \(n = 100\) against the classical model's +0.021. But at \(\gamma = 0.3\), where 22% of samples are wrongly skewed, this model overshoots the other way: bias -0.040 against the classical +0.036, and it is the larger of the two at \(n = 50\) (-0.080 against +0.044). A small true \(\gamma\) lets the extended model fit sizeable inefficiency of either sign to noise. It is the better choice when the wrong skewness is the problem, not a free improvement everywhere.
Hafner, C. M., Manner, H. and Simar, L. (2018). The “wrong skewness” problem in stochastic frontier models: A new approach. Econometric Reviews 37(4), 380--400.
Almanidis, P., Qian, J. and Sickles, R. C. (2014). Stochastic frontier models with bounded inefficiency. In Festschrift in Honor of Peter Schmidt.
skewness_test, inefficiency_test, sfm
set.seed(3)
n <- 200
lx1 <- rnorm(n, 1.5, 0.3); lx2 <- rnorm(n, 1.8, 0.3)
y <- 0.9 + 0.6 * lx1 + 0.5 * lx2 + rnorm(n, 0, 0.25) - abs(rnorm(n, 0, 0.5))
d <- data.frame(y, lx1, lx2)
f <- esfm(y ~ lx1 + lx2, data = d)
f
symmetry_test(f)
Run the code above in your browser using DataLab