# cesEst: Estimate a CES function In micEconCES: Analysis with the Constant Elasticity of Substitution (CES) function

## Description

Estimate a Constant-Elasticity-of-Substitution (CES) function with two exogenous variables or a nested Constant-Elasticity-of-Substitution (CES) function proposed by Sato (1967) with three or four exogenous variables by Least Squares. The functional forms are shown in the documentation of function `cesCalc`.

Warning: The econometric estimation of a CES function is (almost) always very problematic, because very different parameter vectors could result in very similar values of the objective function (sum of squared residuals). Hence, even if the optimizer reports that the nonlinear minimization has converged, there might be another rather different parameter vector that results in a lower sum of squared residuals.

## Usage

 ``` 1 2 3 4 5 6 7 8 9 10``` ```cesEst( yName, xNames, data, tName = NULL, vrs = FALSE, method = "LM", start = NULL, lower = NULL, upper = NULL, multErr = FALSE, rho1 = NULL, rho2, rho = NULL, returnGridAll = FALSE, random.seed = 123, rhoApprox = c( y = 5e-6, gamma = 5e-6, delta = 5e-6, rho = 1e-3, nu = 5e-6 ), ... ) ## S3 method for class 'cesEst' print( x, digits = max(3, getOption("digits") - 3), ... ) ```

## Arguments

 `yName` a string containing the name of the dependent variable. `xNames` a vector of two, three or four character strings containing the names of the independent variables. `data` data frame containing the data. `tName` optional character string specifying the name of the time variable (t). `vrs` logical. Allow for variable returns to scale? `method` character string indicationg the estimation method: either `"Kmenta"` for the Kmenta approximation or `"LM"`, `"NM"`, `"Nelder-Mead"`, `"BFGS"`, `"CG"`, `"L-BFGS-B"`, `"SANN"`, `"Newton"`, `"PORT"`, or `"DE"` for non-linear least-squares (see section ‘Details’). `start` optional numeric vector giving the starting values of the parameters in the non-linear estimations (see section ‘Details’). `lower` lower bounds of the parameters (see section ‘Details’). `upper` upper bounds of the parameters (see section ‘Details’). `multErr` logical. If `TRUE`, the error term is assumed to be multiplicative, i.e. y = yHat * exp( epsilon ). If `FALSE` (the default), the error term is assumed to be additive, i.e. y = yHat + epsilon. `rho1,rho2,rho` numeric scalar or vector at which the coefficients rho_1, rho_2, and/or rho should be fixed; if argument `rho1`, `rho2`, or `rho` is `NULL` (default), this coefficient is estimated together with the other parameters; if these arguments have more than one element, a grid search for rho_1, rho_2, and/or rho is performed (see section ‘Details’). `returnGridAll` logical value that indicates whether the estimates for all values of rho obtained during the grid search (not just the estimations with the ‘best’ rho) should be returned (ignored if argument `rho` is `NULL` or has only a single element). `random.seed` an integer used to seed R's random number generator. This is to ensure replicability when the `"SANN"` or `"DE"` method is used. Defaults to 123. `rhoApprox` numeric vector with exactly 5 elements; the endogenous variable of the CES and the derivatives with respect to its coefficients are calculated using a first-order Taylor series approximation at rho = 0 (non-nested CES) or by interpolation between rho, rho_1, or rho_2 equal to zero and rho, rho_1, or rho_2 equal to +/-`rhoApprox` (nested CES), if the absolute value of the coefficients rho, rho_1, or rho_2 is smaller than or equal to the corresponding element of this argument (see also argument `rhoApprox` of `cesCalc`); the first element determines the threshold for calculating the endogenous variable; the second element determines the threshold for calculating the derivatives with respect to gamma; the third element determines the threshold for calculating the derivatives with respect to delta_1, delta_2, and delta; the fourth element determines the threshold for calculating the derivatives with respect to rho, rho_1, and rho_2; the fifth element determines the threshold for calculating the derivatives with respect to nu. `x` an object of class `cesEst`. `digits` number of digits. `...` further arguments to `cesEst` are passed to `optim`, `nls.lm`, `nlm`, `nlminb`, or `DEoptim`; further arguments to `print.cesEst` are currently ignored.

## Details

Estimation method
Argument `method` determines the estimation method. If it is `"Kmenta"`, the CES is estimated by ordinary least squares using the Kmenta approximation; otherwise, it is estimated by non-linear least-squares. Several different optimizers can be used for the non-linear estimation. The optimization method `LM` (Levenberg-Marquardt, see Moré 1978) uses `nls.lm` for the optimization. The optimization methods `NM` or `Nelder-Mead` (Nelder and Mead 1965), `BFGS` (Broyden 1970, Fletcher 1970, Goldfarb 1970, Shanno 1970), `CG` (Conjugate Gradients based on Fletcher and Reeves 1964), `L-BFGS-B` (with box-constraints, Byrd, Lu, Nocedal, and Zhu 1995), and `SANN` (Simulated Annealing, Bélisle 1992) use `optim` for the optimization. The optimization method `Newton` (Newton-type, see Dennis and Schnabel 1983 and Schnabel, Koontz, and Weiss 1985) uses `nlm` for the optimization. The optimization method `PORT` (PORT routines, see Gay 1990) uses `nlminb` for the optimization. The optimization method `DE` (Differential Evolution, see Storn and Price 1997) uses `DEoptim` for the optimization. Analytical gradients are used in the `LM`, `BFGS`, `CG`, `L-BFGS-B`, `Newton`, and `PORT` method.

Starting values
Argument `start` should be a numeric vector. The order must be as described in the documentation of argument `coef` of function `cesCalc`. However, names of the elements are ignored. If argument `start` is `NULL`, pre-defined starting values are used. The starting value of lambda (if present) is set to 0.015; the starting values of delta_1, delta_2, and delta (if present) are set to 0.5, the starting values of rho_1, rho_2, and rho (if present and required) are set to 0.25 (i.e.\ elasticity of substitution = 0.8 in the two-input case), the starting value of nu (if present) is set to 1, and the starting value of gamma is set to a value so that the mean of the error term is zero. Hence, in case of an additive error term (i.e. argument `multErr` is set to `FALSE`, the default) gamma is set to `mean( y ) / mean( CES( X, start1 ) )` and in case of a multiplicative error term (i.e. argument `multErr` is set to `TRUE`) gamma is set to `mean( log( y ) ) - mean( log( CES( X, start1 ) ) )`, where `y` is the dependent variable (defined by argument `yName`), `X` is the set of covariates (defined by arguments `xNames` and `tName`), `CES()` defines the (nested) CES function, and `start1` is a coefficient vector with gamma = 1 and all other coefficients having the starting values described above.

Lower and upper bounds
Arguments `lower` and `upper` can be used to set lower and upper bounds for the estimated parameters. If these arguments are `-Inf` and `Inf`, respectively, the parameters are estimated without unconstraints. By default, arguments `lower` and `upper` are both `NULL`, which means that the bounds are set automatically depending on the estimation method: In case of the `L-BFGS-B`, `PORT`, and `DE` method, the lower bound is `0` for gamma, delta_1, delta_2, and delta (if present), `-1` for rho_1, rho_2, and rho (if present), and eventually `0` for nu. In case of the `L-BFGS-B` and `PORT` method, the upper bound is infinity for gamma, `1` for delta_1, delta_2, and delta (if present), infinity for rho_1, rho_2, and rho (if present), and eventually infinity for nu. Since the ‘Differential Evulation’ algorithm requires finit bounds, the upper bounds for the `DE` method are set to `1e10` for gamma, `1` for delta_1, delta_2, and delta (if present), `10` for rho_1, rho_2, and rho (if present), and eventually `10` for nu. In case of all other estimation methods, the lower and upper bounds are set to `-Inf` and `Inf`, respectively, because these methods do not support parameter constraints. Of course, the user can specify own lower and upper bounds by setting arguments `lower` and `upper` to numeric vectors that should have the same format as argument `start` (see above).

Grid search for rho
If arguments `rho1`, `rho2`, and/or `rho` have more than one element, a one-dimensional, two-dimensional, or three-dimensionsl grid search for rho_1, rho_2, and/or rho is performed. The remaining (free) parameters of the CES are estimated by least-squares, where rho_1, rho_2, and/or rho are fixed consecutively at each value defined in arguments `rho1`, `rho2`, and `rho`, respectively. Finally the estimation with the rho_1, rho_2, and/or rho that results in the smallest sum of squared residuals is chosen (and returned).

Random numbers
The ‘state’ (or ‘seed’) of R's random number generator is saved at the beginning of the `cesEst` function and restored at the end of this function so that this function does not affect the generation of random numbers although the random seed is set to argument `random.seed` and the ‘SANN’ and ‘DE’ algorithms use random numbers.

## Value

`cesEst` returns a list of class `cesEst` that has following components:

 `coefficients` estimated coefficients/parameters of the CES (including a possible fixed rho). `ela` constant elasticity/elasticities of substitution. `iter` number of iterations (only for non-linear least-squares estimations). `convergence` logical value indicating if the non-linear estimation has converged (only for non-linear least-squares estimations with solvers that have a convergence criterion). `message` additional information from the optimizer (only if a message was returned by `optim` or `nls.lm`. `vcov` approximate covariance matrix of the estimated parameters calculated from the parameters of the linearized model by the Delta method (only if argument `method` is `"Kmenta"`). `cov.unscaled` unscaled covariance matrix of the estimated parameters (including a possible fixed rho), i.e. the inverse of the cross-product of the gradient matrix evaluated at the estimated parameters. `fitted.values` the fitted values (yHat). `residuals` the residuals (i.e. y - yHat if argument `multErr` is `FALSE` (the default), and log( y ) - log( yHat ) if argument `multErr` is `TRUE`). `rss` the sum of the squared residuals (i.e. the value of the objective function of the non-linear least-squares estimation evaluated at the estimated parameters). `call` the matched call. `method` argument `method`. `multErr` argument `multErr`. `start` starting values for the non-linear estimation (not for the `Kmenta` and `DE` method). `lower` lower bounds of the parameters. `upper` upper bounds of the parameters. `rho` argument `rho`. `nls.lm` object returned by `nls.lm` (only if argument `method` is `"LM"`). `optim` object returned by `optim` (only if argument `method` is `"NM"`, `"Nelder-Mead"`, `"BFGS"`, `"CG"`, `"L-BFGS-B"`, or `"SANN"`)). `nlm` object returned by `nlm` (only if argument `method` is `"Newton"`). `nlminb` object returned by `nlminb` (only if argument `method` is `"PORT"`). `DEoptim` object returned by `DEoptim` (only if argument `method` is `"DE"`). `translog` estimation results of the (unrestricted) translog model returned by `translogEst` (only if argument `method` is `"Kmenta"`). `kmenta` estimation results of the Kmenta approximation (a restricted translog model) returned by `systemfit` (only if argument `method` is `"Kmenta"`). `testKmenta` test of the restrictions implied by the Kmenta approximation (including constant returns to scale if argument `vrs` is `FALSE`) in the unrestricted translog model returned by `linear.hypothesis` (only if argument `method` is `"Kmenta"`). `allRhoSum` data frame with summary results of the estimations with all values of rho used in the grid search (only if a grid search was performed); this data frame has follwing columns: `rho` = the value of rho, `rss` = the corresponding sum of squared residuals, and (if appropriate for the method used for the estimation) `convergence` = logical value indicating whether the estimation converged. `allRhoFull` list of estimation results returned by `cesEst` for all values of rho used in the grid search (only if a grid search was performed and argument `returnGridAll` is set to `TRUE`). `rho1Values,rho2Values,rhoValues` numeric vectors giving the values that are used in the grid search for the coefficients rho_1 and rho, respectively (only if a grid search was performed). `rssArray` matrix or array of the RSS values obtained by a two-dimensional or three-dimensional grid search for the coefficients rho_1 (first dimension, e.g. rows of a matrix), rho_2, and rho (last dimension, e.g. columns of a matrix) (only if a two-dimensional or threedimensional grid search was performed).

## Author(s)

Arne Henningsen and Geraldine Henningsen

## References

Bélisle, C.J.P. (1992): Convergence theorems for a class of simulated annealing algorithms on Rd, Journal of Applied Probability 29, p. 885-895.

Broyden, C.G. (1970): The Convergence of a Class of Double-rank Minimization Algorithms, Journal of the Institute of Mathematics and Its Applications 6, p. 76-90.

Byrd, R.H., Lu, P., Nocedal, J. and Zhu, C. (1995): A limited memory algorithm for bound constrained optimization, SIAM J. Scientific Computing 16, p. 1190-1208.

Dennis, J.E. and Schnabel, R.B. (1983): Numerical Methods for Unconstrained Optimization and Nonlinear Equations, Prentice-Hall, Englewood Cliffs, NJ.

Fletcher, R. (1970): A New Approach to Variable Metric Algorithms, Computer Journal 13, p. 317-322.

Fletcher, R. and Reeves, C.M. (1964): Function minimization by conjugate gradients, Computer Journal 7, p. 148-154.

Gay, D.M. (1990): Usage Summary for Selected Optimization Routines, Computing Science Technical Report No. 153, AT&T Bell Laboratories, Murray Hill NJ, http://netlib.bell-labs.com/cm/cs/cstr/153.pdf.

Goldfarb, D. (1970): A Family of Variable Metric Updates Derived by Variational Means, Mathematics of Computation 24, p. 23-26.

Moré, J.J. (1978): The Levenberg-Marquardt algorithm: implementation and theory, in G.A. Watson (Ed.), Lecture Notes in Mathematics 630: Numerical Analysis, pp. 105-116, Springer-Verlag: Berlin.

Nelder, J.A. and Mead, R. (1965): A simplex algorithm for function minimization, Computer Journal 7, p. 308-313.

Schnabel, R.B., Koontz, J.E. and Weiss, B.E. (1985): A modular system of algorithms for unconstrained minimization, ACM Trans. Math. Software, 11, pp. 419-440.

Shanno, D.F. (1970): Conditioning of Quasi-Newton Methods for Function Minimization, Mathematics of Computation 24, p. 647-656.

Storn, R. and Price, K. (1997): Differential Evolution - A Simple and Efficient Heuristic for Global Optimization over Continuous Spaces, Journal of Global Optimization, 11(4), p. 341-359.

`summary.cesEst` for the `summary` method, `plot.cesEst` for plotting the results of the grid search for rho, `coef.cesEst` for several further methods, `cesCalc` for calculations or simulations with the CES, `translogEst` for estimating translog functions, and `quadFuncEst` for estimating quadratic functions.
 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55``` ``` data( germanFarms, package = "micEcon" ) # output quantity: germanFarms\$qOutput <- germanFarms\$vOutput / germanFarms\$pOutput # quantity of intermediate inputs germanFarms\$qVarInput <- germanFarms\$vVarInput / germanFarms\$pVarInput ## CES: Land & Labor (Levenberg-Marquardt algorithm) cesLandLabor <- cesEst( "qOutput", c( "land", "qLabor" ), germanFarms ) # variable returns to scale, increased max. number of iter. (LM algorithm) cesLandLaborVrs <- cesEst( "qOutput", c( "land", "qLabor" ), germanFarms, vrs = TRUE, control = nls.lm.control( maxiter = 1000 ) ) # using the Nelder-Mead optimization method cesLandLaborNm <- cesEst( "qOutput", c( "land", "qLabor" ), germanFarms, method = "NM" ) # using the BFGS optimization method cesLandLaborBfgs <- cesEst( "qOutput", c( "land", "qLabor" ), germanFarms, method = "BFGS" ) # using the L-BFGS-B optimization method with constrained parameters cesLandLaborBfgsCon <- cesEst( "qOutput", c( "land", "qLabor" ), germanFarms, method = "L-BFGS-B" ) # using the CG optimization method cesLandLaborSann <- cesEst( "qOutput", c( "land", "qLabor" ), germanFarms, method = "CG" ) # using the SANN optimization method # (with decreased number of iteration to decrease execution time) cesLandLaborSann <- cesEst( "qOutput", c( "land", "qLabor" ), germanFarms, method = "SANN", control = list( maxit = 1000 ) ) # using the Kmenta approximation cesLandLaborKmenta <- cesEst( "qOutput", c( "land", "qLabor" ), germanFarms, method = "Kmenta" ) # using the PORT optimization routine with unconstrained parameters cesLandLaborPortCon <- cesEst( "qOutput", c( "land", "qLabor" ), germanFarms, vrs = TRUE, method = "PORT", lower = -Inf, upper = Inf ) # using the PORT optimization routine with constrained parameters and VRS cesLandLaborPortCon <- cesEst( "qOutput", c( "land", "qLabor" ), germanFarms, vrs = TRUE, method = "PORT" ) # using the Differential Evolution optimization method # (with decreased number of iteration to decrease execution time) cesLandLaborDe <- cesEst( "qOutput", c( "land", "qLabor" ), germanFarms, method = "DE", control = DEoptim.control( itermax = 50 ) ) ## estimation with a grid search for rho (using the LM algorithm) cesLandInt <- cesEst( "qOutput", c( "land", "qLabor" ), data = germanFarms, rho = seq( from = -0.6, to = 0.9, by = 0.3 ) ) ```