~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 ~/============================================================================= ~/MATREG 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 matrix data for dependent and independent variables. ~/ ~/Usage: ~/ ~ [-x0 ] [ []] ~/ ~/where: ~/ : constraint matrix (/=none) ~/ : constraint interval (/=none) ~/ : matrix expression containing dependent variable Y ~/ -x0 : Option to redefine X0, which defaults to the constant 1 (opt.) ~/ : matrix expression containing first independent variable X1 ~/ : matrix expr. containing second independent variable X2 (opt.) ~/ : matrix expr. containing third independent variable X3 (opt.) ~/ ~/The scalars ms90 - ms99 are used to hold coefficients and statistics. ~/ ~x=%0% ~?x>3 / 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 type of matrix must be that implied by the matrix expressions ~/2) The dependent and independent variables can be any valid matrix ~/ or matrix expression (such as e.g. "ln(mf15/mo15/md15)"). ~/3) If constraint matrix and interval are provided, only the O-D pairs ~/ satisfying the constraint condition are used for the regression. ~/4) T-values for the coefficients are computed and displayed in result summary ~/5) This macro must be started at the level of the main menu. ~/6) This macro uses only the matrix calculator module 3.21. ~/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% ~t1=%1% ~t2=%2% ~t3=%3% ~t4=%4% ~?!t4=-x0 ~t0=%1% %2% %3% 1 %4% %5% %6% ~?t4=-x0 ~t0=%1% %2% %3% %5% %6% %7% %8% ~x=%0% ~x-3 ~/Constraint matrix: %1% interval: %2% ~/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: matreg %t8%' 3.21 / compute the various scalars 1 /---------------------------------------------------------------- y ms99 / YY=sum(Y*Y) y YY ~t9=matreg(%3%|%4%,%5%,%6%,%7%) ~t9=%t9.32% YY %t9% ~?q=1 y ~$>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 matrix expression! ~/Check expressions for dependent and independent variables! ~/ q ~$>end_of_macro ~:expression_okay %1% / constraint matrix ~?!e ~$>constraint_matrix_okay ~/ ~/Erroneous constraint matrix! ~/ q ~$>end_of_macro ~:constraint_matrix_okay ~?q=0 %2% / constraint interval ~?!e ~$>constraint_interval_okay ~/ ~/Erroneous constraint interval! ~/ q ~$>end_of_macro ~:constraint_interval_okay ~?q=1 no / no submatrix ~?q= + ~?q=0 + ~+|~?q=2|1|c 1 /---------------------------------------------------------------- y ms98 / Determinant of matrix (X'X) y DET DET %t9% ~?q=1 y ~?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 ~+|~?q=2|1|c ~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 /---------------------------------------------------------------- ~?!t2=0 y ms90 / regression coefficient A y A A %t9% ~?q=1 y ~?x=2 (get(2)*get(6)-get(5)*get(4))/ms98 ~?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)))/ms98 ~?!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)))) /ms98 ~:end_A4 ~+|~?q=2|1|c 1 /---------------------------------------------------------------- y ms91 / regression coefficient y B B %t9% ~?q=1 y ~?x=2 (get(3)*get(4)-get(2)*get(5))/ms98 ~?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)))/ms98 ~?!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)))) /ms98 ~:end_B4 ~+|~?q=2|1|c ~?x<3 ~$>end_of_coefficients 1 /---------------------------------------------------------------- y ms92 / C y C C %t9% ~?q=1 y ~?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)))/ms98 ~?!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)))) /ms98 ~:end_C4 ~+|~?q=2|1|c ~?x<4 ~$>end_of_coefficients 1 /---------------------------------------------------------------- y ms93 / D y D D %t9% ~?q=1 y (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)))) /ms98 ~+|~?q=2|1|c ~:end_of_coefficients 1 /---------------------------------------------------------------- y ms95 / SST y SST SST %t9% ~?q=1 y (ms99 ~t1=%4% ~?t1=1 -get(2)*get(2)/get(1) ) ~+|~?q=2|1|c 1 /---------------------------------------------------------------- y ms97 / SIGMA y SIGMA SIGMA %t9% ~?q=1 y sqrt((ms99 -ms90*get(2) ~?x>1 -ms91*get(4) ~?x>2 -ms92*get(7) ~?x>3 -ms93*get(11) )/(get(1)-%x%)) ~+|~?q=2|1|c ~?x>4 ~$>end_t_values 1 /---------------------------------------------------------------- y ms96 / T(A) y TA TA %t9% ~?q=1 y ms90/ms97/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))) /ms98) ~+|~?q=2|1|c ~t4=(t=%ms96%) 1 /---------------------------------------------------------------- y ms96 / T(B) y TB TB %t9% ~?q=1 y ms91/ms97/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))) /ms98) ~+|~?q=2|1|c ~t5=(t=%ms96%) ~?x<3 ~$>end_t_values 1 /---------------------------------------------------------------- y ms96 / T(C) y TC TC %t9% ~?q=1 y ms92/ms97/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))) /ms98) ~+|~?q=2|1|c ~t6=(t=%ms96%) ~?x<4 ~$>end_t_values 1 /---------------------------------------------------------------- y ms96 / T(D) y TD TD %t9% ~?q=1 y ms93/ms97/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))) /ms98) ~+|~?q=2|1|c ~t7=(t=%ms96%) ~:end_t_values 1 /---------------------------------------------------------------- y ms96 / ^2 y SSE SSE %t9% ~?q=1 y ms99 -ms90*get(2) ~?x>1 -ms91*get(4) ~?x>2 -ms92*get(7) ~?x>3 -ms93*get(11) ~+|~?q=2|1|c 1 /---------------------------------------------------------------- y ms98 / R^2 y R2 R2 %t9% ~?q=1 y 1-(ms99 -ms90*get(2) ~?x>1 -ms91*get(4) ~?x>2 -ms92*get(7) ~?x>3 -ms93*get(11) )/(ms99 ~t1=%4% ~?t1=1 -get(2)*get(2)/get(1) ) ~+|~?q=2|1|c 1 /---------------------------------------------------------------- y ms99 / N y N N %t9% ~?q=1 y get(1) ~+|~?q=2|1|c 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