GAMS code for Data Envelopment Analysis

Chapter 4 (Fig. 4.18) – The mathematical formulation of MSBM for negative data (inputs/outputs)

$Title Chapter 4 (Fig. 4.18)
$Title Mathematical formulation of MSBM for negative data (inputs/outputs) and the corresponding GAMS code

$onText

If using this code, please cite:

---------------------------------------------------------------------------------
Emrouznejad, A., P. Petridis, and V. Charles (2023). Data Envelopment Analysis
with GAMS: A Handbook on Productivity Analysis, and Performance Measurement,
Springer, ISBN: 978-3-031-30700-3.
---------------------------------------------------------------------------------

Website: https://dataenvelopment.com/GAMS/

$offText

Sets    j DMUs /DMU1*DMU10/
        g Inputs and Outputs /ProdCost, TrnCost, HoldInv, SatDem, Rev/
        i(g)  Inputs /ProdCost, TrnCost, HoldInv/
        r(g) Outputs /SatDem, Rev/;
        alias(jj,j);
        alias(jj,kk);

Table Data(j,g) Data for inputs and outputs

           ProdCost     TrnCost      HoldInv     SatDem      Rev
DMU1        0.255        0.161        0.373        20       -2.64
DMU2        0.98         0.248        0.606        6        -5.29
DMU3        0.507        0.937        0.749        17       -2.43
DMU4        0.305        0.249        0.841        2        -8.99
DMU5        0.659        0.248        0.979        19       -2.94
DMU6        0.568        0.508        0.919        17       -0.75
DMU7        0.583        0.628        0.732        17       -6.36
DMU8        0.627        0.675        0.738        10       -7.2
DMU9        0.772        0.657        0.486        9        -2.16
DMU10       0.917        0.639        0.234        8        -7.3;


Parameters

Rplus(j,r), Rminus(j,i), max_y(r), min_x(i), dmu_data(g), Rmin(i), Rpl(r), res_eff(j), Lamres(j,j), stat(j);

max_y(r) = smax(j,Data(j,r));
min_x(i) = smax(j,Data(j,i));

loop(jj,
   Rplus(jj,r) =  max_y(r) - Data(jj,r);
   Rminus(jj,i) =  Data(jj,i) - min_x(i);
   );

Rplus(jj,r)$(Rplus(jj,r)=0)=10**3;
Rminus(jj,i)$(Rminus(jj,i)=0)=10**3;

parameters w(i), v(r);

w(i) = 1/CARD(i);
v(r) = 1/CARD(r);

variables tau efficiency measure;
nonnegative variables lambda(j) peers of DMU j,
                      t auxiliary variable,
                      sminus(i) slack variable for inputs,
                      splus(r) slack variable for outputs;

EQUATIONS


OBJ  Objective function
CON1(i) Inputs constraint
CON2(r) Outputs constraint
CON3
CON4;


OBJ..    tau =E=t-SUM(i,(sminus(i)*w(i))/Rmin(i));
CON1(i).. SUM(j,lambda(j)*Data(j,i))+sminus(i)=E=dmu_data(i)*t;
CON2(r).. SUM(j,lambda(j)*Data(j,r))-splus(r)=E=dmu_data(r)*t;
CON3..    SUM(r,(v(r)*splus(r))/Rpl(r))+t=E=1;
CON4..    SUM(j,lambda(j))=E=t;

Model MSBM/All/

loop(jj,
    dmu_data(g) = Data(jj,g);
    Rmin(i) = Rminus(jj,i);
    Rpl(r) =  Rplus(jj,r);
    Solve MSBM min tau using LP;
    res_eff(jj) = tau.l;
    stat(jj) = MSBM.modelstat;
   loop(kk,
      Lamres(jj,kk)=Lambda.l(kk);
    );
 );

display res_eff, lamres;

execute_unload