~o|16 ~?!i&32768 ~o=295 ~$>end_of_copyright ~/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ~/Copyright (C) Heinz Spiess, CH-2558 Aegerten, 1994. All rights reserved. ~/ ~/The right to use this macro is granted to all EMME/2 users, provided the ~/following conditions are met: ~/ 1) The macro cannot be sold for a fee (but it can be used and distributed ~/ without charge within consulting projects). ~/ 2) The user is aware that this macro is not a part of the EMME/2 software ~/ licence and there is no explicit or implied warranty or support ~/ provided with this macro. ~/ 3) The comments in this macros must not be removed and any additions or ~/ modification must be appropriately identified as such and give at least ~/ date, name and the reason of the modification. ~/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ~:end_of_copyright ~/============================================================================= ~/NETREG 1.4 - (C) Heinz Spiess, EMME/2 Support Center, CH-2558 Aegerten, 1994 ~/ ~/Compute multiple linear regression Y=A*X0 + B*X1 [+C*X2 [+D*X3]] ~/using arbitrary network data for dependent and independent variables. ~/ ~/Usage: ~/ ~ [-x0 ] [ []] ~/ ~/where: ~/ : network expression containing dependent variable Y ~/ -x0 : Option to redefine X0, which defaults to the constant 1 (opt.) ~/ : network expression containing first independent variable X1 ~/ : network expr. containing second independent variable X2 (opt.) ~/ : network expr. containing third independent variable X3 (opt.) ~/ ~/The scalars ms90 - ms99 are used to hold coefficients and statistics. ~/ ~x=%0% ~?x>1 / check if enough parameters are provided ~$>start_macro ~t9=~*Do you want to see more detailed instructions? ~t9=%t9.1% ~?!t9=y ~$>end_of_macro ~/ ~/Temporary scalars used for regression: Y = A*X0 + B*X1 + C*X2 + D*X3 + eps ~/ ~/ms90: regression coefficient A ms91: regression coefficient B ~/ms92: regression coefficient C ms93: regression coefficient D ~/ms94: currently not used ms95: sum of squares for treatment SST ~/ms96: sum of squares for error SSE ms97: standard deviation SIGMA ~/ms98: R^2 value ms99: number of data points N ~/ ~/Notes: ~/1) The sub-network selection dialog is passed throught to the user ~/2) The dependent and independent variables can be any valid network ~/ attribute or expression (such as e.g. "(volau+volad)"). ~/3) T-values for the coefficients are computed and displayed in result summary ~/4) This macro must be started at the level of the main menu. ~/5) This macro uses only the network calculator module 2.41. ~/7) This macro should be run with EMME/2 Release 7 or higher. ~/8) If switch 15 is ON, dialog suppression is turned on and macro is run ~/ in ``fallback-to-debug'' mode. ~/9) See the copyright notice in macro file for details regarding the right to ~/ use, copy and modify this macro. ~$>end_of_macro ~:start_macro ~t8=%t0% ~t4=%2% ~?!t4=-x0 ~t0=X X %1% 1 %2% %3% %4% ~?t4=-x0 ~t0=X X %1% %3% %4% %5% %6% ~x=%0% ~x-3 ~/Dependent variable Y: %3% ~?t4=-x0 ~/Independent variable X0: %4% (No implicit constant term!) ~?x>1 ~/Independent variable X1: %5% ~?x>2 ~/Independent variable X2: %6% ~?x>3 ~/Independent variable X3: %7% ~/ ~p=50 ~?p=7 ~$>release_okay ~?p=8 ~$>release_okay ~?p=9 ~$>release_okay ~/Warning! This macro is intended for use with EMME/2 release 7, 8 or 9. ~t9=~*Current release level of data bank is %p%. Continue anyway? ~t9=%t9.1% ~?!t9=y ~$>end_of_macro ~:release_okay ~y=%i% / preserve state of switches in register y on=22 / set switch 22 (engineering notation) c='start macro: netreg %t8%' 2.41 / compute the various scalars 1 /---------------------------------------------------------------- n ~$>end_expression_explanation # The matrix # # / sumX0*Y | sumX0*X0 sumX0*X1 sumX0*X2 sumX0*X2 \ # | sumX1*Y | sumX1*X0 sumX1*X1 sumX0*X2 sumX0*X2 | # X'(Y|X)= | sumX2*Y | sumX2*X0 sumX2*X1 sumX0*X2 sumX0*X2 | # \ sumX3*Y | sumX3*X0 sumX3*X1 sumX0*X2 sumX0*X2 / # # is computed in the following expression using the put(get(..)) mechanism. # The element of the matrix are stored in get(I) as follows: # # / get(2) | get(3) get(5) get(8) get(12) \ # | get(4) | get(5) get(6) get(9) get(13) | # X'(Y|X)= | get(7) | get(8) get(9) get(10) get(14) | # \ get(11) | get(12) get(13) get(14) get(15) / # # Note that usually X0=1, i.e. X0 is used for the constant term in the # regression. The above matrix is arranged in such a way that, depending # the number of independent variables, only a part starting from the upper # left corner is used. # # Once this matrix is computed from the matrix expressions, only # scalar computations are needed for the remaining computations. # ~:end_expression_explanation (%3%)*(%3%) +0*( put(get(1)+1) +put(get(2)+(%3%)*(%4%)) +put(get(3)+(%4%)*(%4%)) +put(get(4)+(%3%)*(%5%)) +put(get(5)+(%4%)*(%5%)) +put(get(6)+(%5%)*(%5%)) ~?x<3 ~$>end_of_expression +put(get(7)+(%3%)*(%6%)) +put(get(8)+(%4%)*(%6%)) +put(get(9)+(%5%)*(%6%)) +put(get(10)+(%6%)*(%6%)) ~?x<4 ~$>end_of_expression +put(get(11)+(%3%)*(%7%)) +put(get(12)+(%4%)*(%7%)) +put(get(13)+(%5%)*(%7%)) +put(get(14)+(%6%)*(%7%)) +put(get(15)+(%7%)*(%7%)) ~:end_of_expression ) ~?!e ~$>expression_okay ~/ ~/Erroneous network expression! ~/Check expressions for dependent and independent variables! ~/ q ~$>end_of_macro ~:expression_okay ~z=%o% ~o|1024 ~o|3072 ~/%t9% ~t9= ~o|2048 ~t9=%t9% >> ~o=6 ~+|~*%%%t9%%%|~?e|~*|~t9=|~?q=0|~$ ~o=%z% ~/ ~/... computing coefficients and statistics ~t9=netreg(%3%|%4%,%5%,%6%,%7%) ~t9=%t9.32% 5 4 ms99 / YY=sum(Y*Y) YY YY %t9% r 1 /---------------------------------------------------------------- n / prime link selection for only first link in network 0*length all 5 2 ms96 I1 I node of first link ms97 J1 J node of first link r ~t2=link=%ms96%,%ms97% 1 /---------------------------------------------------------------- n / DET - determinant of matrix (X'X) ~?x=2 (get(3)*get(6)-get(5)*get(5)) ~?x=3 (get(3)*(get(6)*get(10)-get(9)*get(9)) ~?x=3 -get(5)*(get(5)*get(10)-get(9)*get(8))+get(8)*(get(5)*get(9)-get(6)*get(8))) ~?!x=4 ~$>end_DET4 (get(3)*(get(6)*(get(10)*get(15)-get(14)*get(14))-get(9)*(get(9)*get(15) -get(14)*get(13))+get(13)*(get(9)*get(14)-get(10)*get(13)))-get(5)*(get(5) *(get(10)*get(15)-get(14)*get(14))-get(8)*(get(9)*get(15)-get(14)*get(13)) +get(12)*(get(9)*get(14)-get(10)*get(13)))+get(8)*(get(5)*(get(9)*get(15) -get(13)*get(14))-get(8)*(get(6)*get(15)-get(13)*get(13))+get(12)*(get(6) *get(14)-get(9)*get(13)))-get(12)*(get(5)*(get(9)*get(14)-get(13)*get(10)) -get(8)*(get(6)*get(14)-get(13)*get(9))+get(12)*(get(6)*get(10)-get(9)*get(9)))) ~:end_DET4 %t2% ~?q=0 5 4 ms98 / Determinant of matrix (X'X) DET DET %t9% r ~t2=%ms98% ~?!t2=0 ~$>determinant_okay ~/ ~/Zero determinant of (X'X)! ~/Check for zero or colinear independent variables. ~/ q ~$>end_of_macro ~:determinant_okay 1 /---------------------------------------------------------------- n / regression coefficient A ~?x=2 (get(2)*get(6)-get(5)*get(4))/ms(98) ~?x=3 (get(2)*(get(6)*get(10)-get(9)*get(9))-get(5)*(get(4)*get(10)-get(9)*get(7)) ~?x=3 +get(8)*(get(4)*get(9)-get(6)*get(7)))/ms(98) ~?!x=4 ~$>end_A4 (get(2)*(get(6)*(get(10)*get(15)-get(14)*get(14))-get(9)*(get(9)*get(15) -get(14)*get(13))+get(13)*(get(9)*get(14)-get(10)*get(13)))-get(4)*(get(5) *(get(10)*get(15)-get(14)*get(14))-get(8)*(get(9)*get(15)-get(14)*get(13)) +get(12)*(get(9)*get(14)-get(10)*get(13)))+get(7)*(get(5)*(get(9)*get(15) -get(13)*get(14))-get(8)*(get(6)*get(15)-get(13)*get(13))+get(12)*(get(6) *get(14)-get(9)*get(13)))-get(11)*(get(5)*(get(9)*get(14)-get(13)*get(10)) -get(8)*(get(6)*get(14)-get(13)*get(9))+get(12)*(get(6)*get(10)-get(9)*get(9)))) /ms(98) ~:end_A4 5 4 ms90 / regression coefficient A A A %t9% r 1 /---------------------------------------------------------------- n / regression coefficient B ~?x=2 (get(3)*get(4)-get(2)*get(5))/ms(98) ~?x=3 (get(3)*(get(4)*get(10)-get(9)*get(7))-get(2)*(get(5)*get(10)-get(9)*get(8)) ~?x=3 +get(8)*(get(5)*get(7)-get(4)*get(8)))/ms(98) ~?!x=4 ~$>end_B4 (get(3)*(get(4)*(get(10)*get(15)-get(14)*get(14))-get(9)*(get(7)*get(15) -get(14)*get(11))+get(13)*(get(7)*get(14)-get(10)*get(11)))-get(5)*(get(2) *(get(10)*get(15)-get(14)*get(14))-get(8)*(get(7)*get(15)-get(14)*get(11)) +get(12)*(get(7)*get(14)-get(10)*get(11)))+get(8)*(get(2)*(get(9)*get(15) -get(13)*get(14))-get(8)*(get(4)*get(15)-get(13)*get(11))+get(12)*(get(4) *get(14)-get(9)*get(11)))-get(12)*(get(2)*(get(9)*get(14)-get(13)*get(10)) -get(8)*(get(4)*get(14)-get(13)*get(7))+get(12)*(get(4)*get(10)-get(9)*get(7)))) /ms(98) ~:end_B4 5 4 ms91 / regression coefficient B B %t9% r ~?x<3 ~$>end_of_coefficients 1 /---------------------------------------------------------------- n / regression coefficient C ~?x=3 (get(3)*(get(6)*get(7)-get(4)*get(9))-get(5)*(get(5)*get(7)-get(4)*get(8)) ~?x=3 +get(2)*(get(5)*get(9)-get(6)*get(8)))/ms(98) ~?!x=4 ~$>end_C4 (get(3)*(get(6)*(get(7)*get(15)-get(14)*get(11))-get(4)*(get(9)*get(15) -get(14)*get(13))+get(13)*(get(9)*get(11)-get(7)*get(13)))-get(5)*(get(5) *(get(7)*get(15)-get(14)*get(11))-get(2)*(get(9)*get(15)-get(14)*get(13)) +get(12)*(get(9)*get(11)-get(7)*get(13)))+get(8)*(get(5)*(get(4)*get(15) -get(13)*get(11))-get(2)*(get(6)*get(15)-get(13)*get(13))+get(12)*(get(6) *get(11)-get(4)*get(13)))-get(12)*(get(5)*(get(4)*get(14)-get(13)*get(7)) -get(2)*(get(6)*get(14)-get(13)*get(9))+get(12)*(get(6)*get(7)-get(4)*get(9)))) /ms(98) ~:end_C4 5 4 ms92 / C C C %t9% r ~?x<4 ~$>end_of_coefficients 1 /---------------------------------------------------------------- n / regression coefficient D (get(3)*(get(6)*(get(10)*get(11)-get(7)*get(14))-get(9)*(get(9)*get(11) -get(7)*get(13))+get(4)*(get(9)*get(14)-get(10)*get(13)))-get(5)*(get(5) *(get(10)*get(11)-get(7)*get(14))-get(8)*(get(9)*get(11)-get(7)*get(13)) +get(2)*(get(9)*get(14)-get(10)*get(13)))+get(8)*(get(5)*(get(9)*get(11) -get(4)*get(14))-get(8)*(get(6)*get(11)-get(4)*get(13))+get(2)*(get(6) *get(14)-get(9)*get(13)))-get(12)*(get(5)*(get(9)*get(7)-get(4)*get(10)) -get(8)*(get(6)*get(7)-get(4)*get(9))+get(2)*(get(6)*get(10)-get(9)*get(9)))) /ms(98) 5 4 ms93 / D D D %t9% r ~:end_of_coefficients 1 /---------------------------------------------------------------- n / SST (ms(99) ~t1=%4% ~?t1=1 -get(2)*get(2)/get(1) ) 5 4 ms95 / SST SST SST %t9% r 1 /---------------------------------------------------------------- n / SIGMA sqrt((ms(99) -ms(90)*get(2) ~?x>1 -ms(91)*get(4) ~?x>2 -ms(92)*get(7) ~?x>3 -ms(93)*get(11) )/(get(1)-%x%)) 5 4 ms97 / SIGMA SIGMA SIGMA %t9% r ~?x>4 ~$>end_t_values 1 /---------------------------------------------------------------- n / T(A) ms(90)/ms(97)/sqrt( ~?x=2 get(6) ~?x=3 (get(6)*get(10)-get(9)*get(9)) ~?x=4 (get(6)*(get(10)*get(15)-get(14)*get(14))-get(9)*(get(9)*get(15) ~?x=4 -get(14)*get(13))+get(13)*(get(9)*get(14)-get(10)*get(13))) /ms(98)) 5 4 ms96 / T(A) TA TA %t9% r ~t4=(t=%ms96%) 1 /---------------------------------------------------------------- n / T(B) ms(91)/ms(97)/sqrt( ~?x=2 get(3) ~?x=3 (get(3)*get(10)-get(8)*get(8)) ~?x=4 (get(3)*(get(10)*get(15)-get(14)*get(14))-get(8)*(get(8)*get(15) ~?x=4 -get(14)*get(12))+get(12)*(get(8)*get(14)-get(10)*get(12))) /ms(98)) 5 4 ms96 / T(B) TB TB %t9% r ~t5=(t=%ms96%) ~?x<3 ~$>end_t_values 1 /---------------------------------------------------------------- n / T(C) ms(92)/ms(97)/sqrt( ~?x=3 (get(3)*get(6)-get(5)*get(5)) ~?x=4 (get(3)*(get(6)*get(15)-get(13)*get(13))-get(5)*(get(5)*get(15) ~?x=4 -get(13)*get(12))+get(12)*(get(5)*get(13)-get(6)*get(12))) /ms(98)) 5 4 ms96 / T(C) TC TC %t9% r ~t6=(t=%ms96%) ~?x<4 ~$>end_t_values 1 /---------------------------------------------------------------- n / T(D) ms(93)/ms(97)/sqrt( ~?x=4 (get(3)*(get(6)*get(10)-get(9)*get(9))-get(5)*(get(5)*get(10) ~?x=4 -get(9)*get(8))+get(8)*(get(5)*get(9)-get(6)*get(8))) /ms(98)) 5 4 ms96 / T(D) TD TD %t9% r ~t7=(t=%ms96%) ~:end_t_values 1 /---------------------------------------------------------------- n / SSE ms(99) -ms(90)*get(2) ~?x>1 -ms(91)*get(4) ~?x>2 -ms(92)*get(7) ~?x>3 -ms(93)*get(11) 5 4 ms96 / SSE SSE SSE %t9% r 1 /---------------------------------------------------------------- n / R^2 1-(ms(99) -ms(90)*get(2) ~?x>1 -ms(91)*get(4) ~?x>2 -ms(92)*get(7) ~?x>3 -ms(93)*get(11) )/(ms(99) ~t1=%4% ~?t1=1 -get(2)*get(2)/get(1) ) 5 4 ms98 / R^2 R2 R2 %t9% r 1 /---------------------------------------------------------------- n / N get(1) 5 4 ms99 / N N N %t9% r q ~/ ~/=========================================================================== ~/ ~/ ms90: A = %ms90% %t4% ~/ ms91: B = %ms91% %t5% ~?x>2 ~/ ms92: C = %ms92% %t6% ~?x>3 ~/ ms93: D = %ms93% %t7% ~z=%ms99% ~?t1=1 ~z-1 ~/ ms95: SST = %ms95% (DF=%z%) ~z-%x% ~?t1=1 ~z+1 ~/ ms96: SSE = %ms96% (DF=%z%) ~/ ms97: SIGMA = %ms97% ~/ ms98: R2 = %ms98% ~/ ms99: N = %ms99% ~/ ~/Regression done: ~t9=*(%4%) ~?t9=*(1) ~t9= ~?x=2 ~/%3% ~= %ms90%%t9% + %ms91%*(%5%) ~?x=3 ~/%3% ~= %ms90%%t9% + %ms91%*(%5%) + %ms92%*(%6%) ~?x=4 ~/%3% ~= %ms90%%t9% + %ms91%*(%5%) + %ms92%*(%6%) + %ms93%*(%7%) ~:end_of_macro ~?!y&4194304 / reset switch 22 (engineering notation) if it was OFF off=22 ~/=========================================================================== ~o=6