## Monday, June 3, 2013

### GRAS (Generalized RAS) Example

 \$ontext     Generalized RAS method     THEO JUNIUS & JAN OOSTERHAVEN     The Solution of Updating or Regionalizing a Matrix     with both Positive and Negative Entries     Economic Systems Research, Vol. 15, No. 1, 2003     Lenzen, M., Wood, R. and Gallego, B. (2007)     Some comments on the GRAS method,     Economic Systems Research, 19, pp. 461–465 \$offtext table IO_0(*,*) 'Initial, old input–output table'               Goods  Services  Consumption  NetExports TotalOutput Goods           7      3            5         -3           12 Services        2      9            8          1           20 NetTaxes       -2      0            2          1            1 TotalUse        7     12           15         -1           33 ValueAdded      5      8            0          0           13 TotalInput     12     20           15         -1 ; table IO_1(*,*)  'Row and column totals of the new, to be updated, input–output table'               Goods  Services  Consumption  NetExports TotalOutput Goods                                                      15 Services                                                   26 NetTaxes                                                   -1 TotalUse        9     16           17         -2           40 ValueAdded      6     10            0          0           16 TotalInput     15     26           17         -2 ; sets   i /Goods,Services,NetTaxes/   j /Goods,Services,Consumption,NetExports/ ; parameter    a(i,j)  'old matrix'    u(i)    'new row sum'    v(j)    'new column sum'    e       '1 or exp(1) depending on paper' ; a(i,j) = IO_0(i,j); u(i) = IO_1(i,'TotalOutput'); v(j) = IO_1('TotalUse',j); * Junius/Oosterhaven: * e = 1; * Lenzen,e.a.: e = exp(1); display a,u,v; variables    z(i,j)   'note: z(i,j)=x(i,j)/a(i,j)'    obj ; equations    objective    rowsum(i)    colsum(j) ; objective.. obj =e= sum((i,j),abs(a(i,j))*z(i,j)*log(z(i,j)/e)); rowsum(i).. sum(j,a(i,j)*z(i,j)) =e= u(i); colsum(j).. sum(i,a(i,j)*z(i,j)) =e= v(j); z.L(i,j) = 1; z.lo(i,j) = 0.0001; model m /all/; solve m using nlp minimizing obj; IO_1(i,j) = z.l(i,j)*a(i,j); display IO_0,IO_1;

Notes:

• We can declare z(i,j)=x(i,j)/a(i,j) as a positive variable.
• This makes things sign preserving.
• z(i,j)’s will not be generated if a(i,j)=0. Some papers mention we should set z(i,j)=1 if a(i,j)=0 but here we just omit all these entries.
• In the results below GAMS is truncating labels while there is in fact enough room to print them completely (or: counting is difficult!). I even reported this little fact to the GAMS people.

Results:

 ----     89 PARAMETER IO_0  Initial, old input–output table                  Goods    Services  Consumpti~  NetExports  TotalOutp~ Goods            7.000       3.000       5.000      -3.000      12.000 Services         2.000       9.000       8.000       1.000      20.000 NetTaxes        -2.000                   2.000       1.000       1.000 TotalUse         7.000      12.000      15.000      -1.000      33.000 ValueAdded       5.000       8.000                              13.000 TotalInput      12.000      20.000      15.000      -1.000 ----     89 PARAMETER IO_1  Row and column totals of the new, to be updated, input–output table                  Goods    Services  Consumpti~  NetExports  TotalOutp~ Goods            8.976       3.743       5.722      -3.441      15.000 Services         2.799      12.257       9.992       0.952      26.000 NetTaxes        -2.776                   1.286       0.490      -1.000 TotalUse         9.000      16.000      17.000      -2.000      40.000 ValueAdded       6.000      10.000                              16.000 TotalInput      15.000      26.000      17.000      -2.000