Description
Data Envelopment Analysis (DEA) is a technique for measuring the relative performance of organizational units where presence of multiple inputs and outputs makes comparison difficult. efficiency = weighted sum of output / weighted sum of input Find weights that maximize the efficiency for one unit while ensuring that no other units has an efficiency < 1 using these weights. A primal and dual formulation is presented.
Small Model of Type : LP
Category : GAMS Model library
Main file : dea.gms
$title Data Envelopment Analysis - DEA (DEA,SEQ=192)
$onText
Data Envelopment Analysis (DEA) is a technique for measuring the relative
performance of organizational units where presence of multiple inputs and
outputs makes comparison difficult.
efficiency = weighted sum of output / weighted sum of input
Find weights that maximize the efficiency for one unit while ensuring
that no other units has an efficiency < 1 using these weights. A primal
and dual formulation is presented.
Dyson, Thanassoulis, and Boussofiane, A DEA Tutorial.
Warwick Business School. http://www.deazone.com/tutorial/
Keywords: linear programming, data envelopment analysis, statistics
$offText
Set
i 'units'
is(i) 'selected unit'
j 'inputs and outputs'
ji(j) 'inputs'
jo(j) 'outputs';
Parameter
data(i,j) 'unit input output'
vlo 'v lower bound'
ulo 'u lower bound'
norm 'normalizing constant';
Variable
v(ji) 'input weights'
u(jo) 'output weights'
eff 'efficiency'
var 'dual convexity'
lam(i) 'dual weights'
vs(ji) 'input duals'
us(jo) 'output duals'
z;
Positive Variable u, v, vs, us, lam;
Equation
defe(i) 'efficiency definition - weighted output'
denom(i) 'weighted input'
lime(i) 'output / input < 1'
dii(i,ji) 'input duals'
dio(i,jo) 'output dual'
defvar 'variable return to scale'
dobj 'dual objective';
* primal model
defe(is).. eff =e= sum(jo, u(jo)*data(is,jo)) - 1*var;
denom(is).. sum(ji, v(ji)*data(is,ji)) =e= norm;
lime(i).. sum(jo, u(jo)*data(i,jo)) =l= sum(ji, v(ji)*data(i,ji)) + var;
* dual model
dii(is,ji).. sum(i, lam(i)*data(i,ji)) + vs(ji) =e= z*data(is,ji);
dio(is,jo).. sum(i, lam(i)*data(i,jo)) - us(jo) =e= data(is,jo);
defvar.. sum(i, lam(i)) =e= 1;
dobj.. eff =e= norm*z - vlo*sum(ji, vs(ji)) - ulo*sum(jo, us(jo));
Model
deap 'primal' / defe, denom, lime /
deadc 'dual with CRS' / dobj, dii, dio /
deadv 'dual with VRS' / dobj, dii, dio, defvar /;
Set
i 'units' / Depot1*Depot20 /
j 'inputs and outputs' / stock, wages, issues, receipts, reqs /
ji(j) 'inputs' / stock, wages /
jo(j) 'outputs' / issues, receipts, reqs /;
Table data(i,j)
stock wages issues receipts reqs
Depot1 3 5 40 55 30
Depot2 2.5 4.5 45 50 40
Depot3 4 6 55 45 30
Depot4 6 7 48 20 60
Depot5 2.3 3.5 28 50 25
Depot6 4 6.5 48 20 65
Depot7 7 10 80 65 57
Depot8 4.4 6.4 25 48 30
Depot9 3 5 45 64 42
Depot10 5 7 70 65 48
Depot11 5 7 45 65 40
Depot12 2 4 45 40 44
Depot13 5 7 65 25 35
Depot14 4 4 38 18 64
Depot15 2 3 20 50 15
Depot16 3 6 38 20 60
Depot17 7 11 68 64 54
Depot18 4 6 25 38 20
Depot19 3 4 45 67 32
Depot20 3 6 57 60 40;
$eolCom //
option limCol = 0 // no column listing
limRow = 0 // no row listing
solveOpt = replace; // don't keep old var and equ values
var.fx = 0; // to run CRS with the primal model
*var.lo = -inf; // to run VRS with the primal model
*var.up = +inf; // to run VRS with the primal model
vlo = 1e-4;
ulo = 1e-4;
norm = 100;
v.lo(ji) = vlo;
u.lo(jo) = ulo;
*deadc.solPrint = %solPrint.quiet%;
*deadv.solPrint = %solPrint.quiet%;
*deap.solPrint = %solPrint.quiet%;
Set ii(i) 'set of units to analyze' / depot1, depot2, depot18 /;
*ii(i) = yes; // use to run all depots
is(i) = no;
Parameter rep 'summary report';
loop(ii,
is(ii) = yes;
solve deap us lp max eff;
rep(i,ii) = sum(jo, u.l(jo)*data(i,jo))/sum(ji, v.l(ji)*data(i,ji));
rep('MStat-p',ii) = deap.modelStat;
solve deadc us lp min eff;
rep('MStat-d',ii) = deadc.modelStat;
rep('obj-check',ii) = deadc.objVal - deap.objVal;
is(ii) = no;
);
rep(i,'Min') = smin(ii, rep(i,ii));
rep(i,'Max') = smax(ii, rep(i,ii));
rep(i,'Avg') = sum(ii, rep(i,ii))/card(ii);
display rep;