GAMS code for Data Envelopment Analysis

Chapter 7 (Fig. 7.01) – The Mathematical formulation for MPI (Malmquist Productivity Index) and the corresponding GAMS code

$Title Chapter 7 (Fig. 7.1)
$Title Mathematical formulation for MPI (Malmquist Productivity Index) 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*DMU6/
        t years /Y2007, Y2008/
        g Inputs and Outputs /IN1, IN2, OUT1, OUT2/
        i(g)  Inputs /IN1, IN2/
        r(g) Outputs /OUT1, OUT2/;
        alias(jj,j);

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

                 IN1        IN2       OUT1       OUT2
DMU1.Y2007        15        2         14        3.5
DMU2.Y2007        40        7         14        21
DMU3.Y2007        32        12        42        10.5
DMU4.Y2007        52        20        28        42
DMU5.Y2007        35        12        19        30
DMU6.Y2007        32        7         14        38
DMU1.Y2008        10        1.5        17       2.5
DMU2.Y2008        45        5.6        16       22
DMU3.Y2008        35        11        40        10
DMU4.Y2008        50        27        28        30
DMU5.Y2008        30        14        19        25
DMU6.Y2008        38        9        13         12 ;


Variables theta1  � for D1 model
          theta2  � for D2 model
          theta3  � for D3 model
          theta4  � for D4 model;

Nonnegative variables
          l(j) dual weights (Lambda values);

Parameters DMU_data(g,t) slice of data
           D_1(j) calculated efficiency for mixed period t+1 and t
           D_2(j) calculated efficiency for mixed period t and t+1
           D_3(j) calculated efficiency for period t
           D_4(j) calculated efficiency for period t+1
           max_t max period of time
           Deff(j) Efficiency change for each DMU
           Dtech(j) Technical efficiency change for each DMU
           MPI(j) Malmquist Productivity Index for each DMU;

max_t = SMAX(t,ORD(t));

Equations  CON1(i,t) Input constraint for D1 model
           CON2(r,t) Output constraints for D1 model
           CON3(i,t) Input constraint for D2 model
           CON4(r,t) Output constraints for D2 model
           CON5(i,t) Input constraint for D3 model
           CON6(r,t) Output constraints for D3 model
           CON7(i,t) Input constraint for D4 model
           CON8(r,t) Output constraints for D4 model;

CON1(i,t)$(ORD(t)<max_t)..  SUM(j, l(j)*Data(j,t+1,i))=L=theta1*DMU_data(i,t);
CON2(r,t)$(ORD(t)<max_t)..  SUM(j, l(j)*Data(j,t+1,r))=G=DMU_data(r,t);

CON3(i,t)$(ORD(t)<max_t)..  SUM(j, l(j)*Data(j,t,i))=L=theta2*DMU_data(i,t+1);
CON4(r,t)$(ORD(t)<max_t)..  SUM(j, l(j)*Data(j,t,r))=G=DMU_data(r,t+1);

CON5(i,t)$(ORD(t)<max_t)..  SUM(j, l(j)*Data(j,t,i))=L=theta3*DMU_data(i,t);
CON6(r,t)$(ORD(t)<max_t)..  SUM(j, l(j)*Data(j,t,r))=G=DMU_data(r,t);

CON7(i,t)$(ORD(t)<max_t)..  SUM(j, l(j)*Data(j,t+1,i))=L=theta4*DMU_data(i,t+1);
CON8(r,t)$(ORD(t)<max_t)..  SUM(j, l(j)*Data(j,t+1,r))=G=DMU_data(r,t+1);

model D1 /CON1, CON2/;
model D2 /CON3, CON4/;
model D3 /CON5, CON6/;
model D4 /CON7, CON8/;

loop(jj,
   DMU_data(g,t) = Data(jj,t,g);
   solve D1 using LP minimizing theta1;
   D_1(jj) = theta1.l;
   solve D2 using LP minimizing theta2;
   D_2(jj) = theta2.l;
   solve D3 using LP minimizing theta3;
   D_3(jj) = theta3.l;
   solve D4 using LP minimizing theta4;
   D_4(jj) = theta4.l;
   Deff(jj) = D_4(jj)/D_3(jj);
   Dtech(jj) = ((D_2(jj)/D_4(jj))*(D_3(jj)/D_1(jj)))**(0.5);
   MPI(jj) = Deff(jj)*Dtech(jj);
 );

Display D_1,D_2,D_3,D_4, Deff, Dtech, MPI;

execute_unload