***********************************************************************; * Version 3.1 July 20, 1994 *; ***********************************************************************; START _FITMOD_(DEPVARS,INDVARS, _ECODE_,_EPSL_,_OPT_,_MODNMS_,_PARM_, _SS_,_SUMSQ_,_VNAME_,_VTYPE_, _BETA_,_BPVAL_,_BSE_,_BT_,_SCORR_,_LINDEP_,_PARM1_, _SIGMA_,_STAT_, _XPXINV_, _XNAME_,_YNAME_, _PM1CNM_,_STRNM_ ); *This module fits a linear model by sweeping the appropriate elements of _SS_ as defined by DEPVARS and INDVARS Section 1 - Scans the DEPVARS and INDVARS vectors and creates a vector _VNEW1_ that indicates the desired condition of the variables Section 2 - Compares the current condition of the variables with _VNEW1_ and creates _SWEEP1_, indicating which variables are to be swept. Section 3 - Sweep the variables indicated in the order determined by the absolute value of the remaining pivots. Section 4 - Extract the desired elements from the swept _SS_ and calculate standard errors, P-Values, R-Squares, etc. Inputs DEPVARS,INDVARS, _ECODE_,_EPSL_,_OPT_,_PARM_, _SS_,_SUMSQ_,_VNAME_,_VTYPE_, Ouputs _ECODE_,_PARM_, _SS_, _VTYPE_, _BETA_,_BPVAL_,_BSE_,_BT_,_SCORR_,_LINDEP_,_PARM1_, _SIGMA_,_STAT_, _XPXINV_, _XNAME_,_YNAME_, _PM1CNM_,_STRNM_ ___________________________________________________________________*; FREE _BETA_ _BPVAL_ _BSE_ _BT_ _SCORR_ _LINDEP_ _PARM1_ _SIGMA_ _STAT_ _XPXINV_ _XNAME_ _YNAME_ _PM1CNM_ _STRNM_ ; * Some modest input validity checks; IF (NROW(_ECODE_)=0) | (NROW(_OPT_)=0) | (NROW(_EPSL_)=0) THEN DO; IF _OPT_(|1,6|)=0 THEN PRINT "One or more system matrix does not exist. " , "_ECODE_, _OPT_, and _EPSL_, were checked. " ,, "------------FITMODEL, LINMOD, and IML stopped.------------" , "------------FITMODEL, LINMOD, and IML stopped.------------" , "------------FITMODEL, LINMOD, and IML stopped.------------" ; STOP; END; IF (_OPT_(| 1 , 5 |)=0)&(_OPT_(|1,6|)=0) THEN PRINT "**************************************" , "** BEGIN FITMODEL **" , "**************************************" ; IF MAX( _ECODE_ ) > 7000 THEN DO; IF _OPT_(|1,6|)=0 THEN PRINT ,, "Error in previous module" , "Probably in MAKESS, or GETCORSS"; _ECODE_ (| 4 , 1 |) = 2001; RUN _EREXIT_(_ECODE_,_MODNMS_); END; _ECODE_ (| { 4 5 6 }, 1 |) = ( { 0 0 0 } )`; * Section 1: define model ; _VOLD1_=_VTYPE_; * Vectors show current & desired *; _VNEW1_=J(1,NCOL(_VOLD1_),0); * status of variables *; IF NCOL(DEPVARS) = 0 THEN DO; * Check if Dependent vars present *; _LOC_ = ( _VTYPE_ = -1 ); _LOC_ = LOC( _LOC_ ); IF NCOL(_LOC_)>0 THEN _YINDEX_=_LOC_; ELSE DO; IF (_OPT_(|1,6|)=0) THEN PRINT , "No DEPendent VARiablesS specified and none exist in VTYPE"; _ECODE_ (| 4 , 1 |) = 5001; END; END; ELSE DO; _BIG_ = _VNAME_; * Find location of DEPVARS in _SS_ *; _LITTLE_ = DEPVARS; _INDEX_ = _SCAN_( _BIG_, _LITTLE_); _YINDEX_ = _INDEX_; IF ANY( _YINDEX_ = .) THEN DO; _ECODE_ (| 4 , 1 |) = 5001; _LOC_ = ( _YINDEX_ = . ); _LOC_ = LOC( _LOC_ ); IF (_OPT_(|1,6|)=0) THEN PRINT , "The following DEPVARS do not exist in _SS_"; _MISS1_ = DEPVARS(| 1 , _LOC_ |); IF (_OPT_(|1,6|)=0) THEN PRINT , _MISS1_ (| FORMAT = $8. |); END; END; IF NCOL(INDVARS)=0 THEN DO; * Check if Independent vars present *; _LOC_ = ( _VTYPE_ = 1 ); _LOC_ = LOC( _LOC_ ); IF NCOL( _LOC_ ) > 0 THEN _XINDEX_ = _LOC_; ELSE DO; IF (_OPT_(|1,6|)=0) THEN PRINT , "No INDependent VARiableS specified and none exist in VTYPE"; _ECODE_ (| 4 , 1 |) = 5002; END; END; ELSE DO; _BIG_ = _VNAME_; * Find location of INDVARS in _SS_ *; _LITTLE_ = INDVARS; _INDEX_ = _SCAN_( _BIG_, _LITTLE_); _XINDEX_ = _INDEX_; IF ANY( _XINDEX_ = .) THEN DO; _ECODE_ (| 4 , 1 |) = 5002; _LOC_ = ( _XINDEX_ = . ); _LOC_ = LOC( _LOC_ ); IF (_OPT_(|1,6|)=0) THEN PRINT , "The following INDVARS do not exist in _SS_"; _MISS1_ = INDVARS(| 1 , _LOC_ |); IF (_OPT_(|1,6|)=0) THEN PRINT , _MISS1_ (| FORMAT = $8. |); END; END; IF _ECODE_(| 4 , 1 |) > 5000 THEN DO; * Print if error occured above *; IF (_OPT_(|1,6|)=0) THEN PRINT , "Variables in _SS_ are" , _VTYPE_ (| &_FMT1_ COLNAME=_VNAME_ |); RUN _EREXIT_(_ECODE_,_MODNMS_); END; _X1_ = J( 1, NCOL( _VTYPE_ ), 0 ); * Create index vectors for X & Y *; _Y1_ = _X1_; _X1_ (| 1 , _XINDEX_ |) = J( 1, NCOL( _XINDEX_ ), 1 ); _Y1_ (| 1 , _YINDEX_ |) = J( 1, NCOL( _YINDEX_ ), 1 ); IF ANY( _X1_ & _Y1_ ) THEN DO; * Check if any vars in X & Y *; _LOC_ = ( _X1_ & _Y1_ ) ; _LOC_ = LOC( _LOC_ ); _VARS_ = _VNAME_(| 1 , _LOC_ |); IF NCOL( INDVARS ) & NCOL( DEPVARS ) THEN DO; *Variable cannot be in both X & Y, if INDVARS & DEPVARS both provided; _ECODE_ (| 4 , 1 |) = 5005; NOTEF_1 = {" FITMODEL: ERROR 5005 - The following" , "variables were defined in both DEPVARS and INDVARS"}; IF (_OPT_(|1,6|)=0) THEN PRINT ,, NOTEF_1 , _VARS_ (| FORMAT = $8. |); RUN _EREXIT_(_ECODE_,_MODNMS_); RETURN; END; ELSE DO; *INDVARS or DEPVARS defaulted & @ least one var in X & Y; IF NCOL(INDVARS) = 0 THEN DO; *INDVARS was defaulted, user defined _YINDEX_ takes precedence; NOTEF_2={" FITMODEL WARNING - The following variables" , "were changed from Independent (X) to Dependent (Y)"}; IF (_OPT_(|1,6|)=0) THEN PRINT ,, NOTEF_2 , _VARS_ (| FORMAT = $8. |); _X1_(| 1,_LOC_ |)=J(1,NCOL(_LOC_),0); * Switch from X to Y; _LOC_ = _X1_; _LOC_ = LOC( _LOC_ ); IF NCOL(_LOC_)=0 THEN DO; *Make sure some X vars still left; _ECODE_ (| 4 , 1 |) = 5002; IF (_OPT_(|1,6|)=0) THEN PRINT , "No Independent variables remain"; RUN _EREXIT_(_ECODE_,_MODNMS_); END; _XINDEX_ = _LOC_; END; * end of INDVARS default ; IF NCOL(DEPVARS) = 0 THEN DO; *DEPVARS was defaulted, user defined _XINDEX_ takes precedence; NOTEF_3={" FITMODEL WARNING - The following variables" , "were changed from Dependent (Y) to Independent (X)"}; IF (_OPT_(|1,6|)=0) THEN PRINT ,, NOTEF_3 , _VARS_ (| FORMAT = $8. |); _Y1_(|1,_LOC_|)=J(1,NCOL(_LOC_),0); *Switch from Y to X; _LOC_ = _Y1_; _LOC_ = LOC( _LOC_ ); IF NCOL(_LOC_)=0 THEN DO; *Make sure some Y vars still left; _ECODE_ (| 4 , 1 |) = 5001; IF (_OPT_(|1,6|)=0) THEN PRINT , "No Dependent variables remain"; RUN _EREXIT_(_ECODE_,_MODNMS_); END; _YINDEX_ = _LOC_; END; * end of DEPVARS default ; END; * end of either DEP or IND default ; END; * end of vars in both X & Y ; * Set _VNEW1_ to indicate desired model *; _VNEW1_ (| 1 , _XINDEX_ |) = J( 1 , NCOL( _XINDEX_ ) , 1); _VNEW1_ (| 1 , _YINDEX_ |) = J( 1 , NCOL( _YINDEX_ ) ,-1); _LOC_ = ( _VNEW1_ = 0 ); * Create index vector for Z vars *; _LOC_ = LOC( _LOC_ ); _ZINDEX_ = .; IF NCOL( _LOC_) > 0 THEN _ZINDEX_ = _LOC_; ELSE FREE _ZINDEX_; * Sect 2: Indicate vars to be swept; _XNAME_ = _VNAME_(| 1 , _XINDEX_ |); *Get X, Y, Z names from _VNAME_; _YNAME_ = _VNAME_(| 1 , _YINDEX_ |); IF NCOL( _ZINDEX_ ) THEN _ZNAME_ = _VNAME_(| 1 , _ZINDEX_ |); * Create indicator vector to show which vars are to be swept * * +1 : variable to sweep into model * * -1 : variable to sweep out of model * * 0 : no sweep ( only X vars being swept ) *; _SWEEP1_ = ( _VNEW1_ = 1 ) - ( _VOLD1_ = 1 ); IF _OPT_(|4,1|)&(_OPT_(|1,6|)=0) THEN DO; *Input status of parms; PRINT "Status on entry to FITMODEL"; RUN _PRPARM_( _PARM_ ); RUN _PVTYPE_( _VTYPE_, _VNAME_ ); END; IF _OPT_(| 4 , 2 |) & (_OPT_(|1,6|)=0) THEN PRINT "Input _SS_ matrix" _SS_(| &_FMT2_ ROWNAME=_VNAME_ COLNAME=_VNAME_ |); * Section 3: do sweep operations; *Setting tolerance based on largest _SS_ in X variables; _DELTA_ = MAX( _SUMSQ_ # (_VNEW1_ = 1 )) * _EPSL_ ; IF _DELTA_ > _PARM_(| 1 , 5 |) THEN _PARM_(| 1, 5 |) = _DELTA_ ; _DELTA_ = _PARM_(| 1 , 5 |); * Rank of X variables in current _SS_ *; _RANK1_ = SUM(( VECDIAG( _SS_ )` > _DELTA_ ) # ( _VOLD1_ = 1 )) ; _SWEEP2_ = _SWEEP1_; DO _GROUP1_ = -1 TO 1 BY 2; *First time through loop--sweep vars out; _LOC_ = ( _SWEEP2_ = _GROUP1_ ); * next time - sweep vars in ; _LOC_ = LOC( _LOC_ ); IF (NCOL( _LOC_ ) > 0 ) THEN DO; * Any pivots of this type to sweep ; _SWEEP1_ = ( _SWEEP2_ = _GROUP1_ ); DO WHILE ( ANY( _SWEEP1_ )); _PIVOT1_ = _LOC_; _PIVOT1_(| 1 , RANK( VECDIAG( _SS_(| _LOC_, _LOC_ |))`) |)=_LOC_; _P1_ = _PIVOT1_(| 1 , 1 |); DO WHILE ( ( _SS_(| _P1_ , _P1_ |) < _DELTA_ ) & ( NCOL( _PIVOT1_ ) > 1 )); RUN _ZPIVOT_(_SS_,_DELTA_,_VOLD1_,_P1_); _VOLD1_(| 1 , _P1_ |) = ( _VOLD1_(| 1 , _P1_ |) < 1 ); _SWEEP1_(| 1 , _P1_ |) = 0; _PIVOT1_ = _PIVOT1_(| 1 , 2:NCOL( _PIVOT1_ ) |); _P1_ = _PIVOT1_(| 1 , 1 |); END; _P1_ = _PIVOT1_(| 1 , NCOL( _PIVOT1_ ) |); IF _SS_(| _P1_ , _P1_ |) >= _DELTA_ THEN DO; _SS_ = SWEEP( _SS_, _P1_ ); IF _OPT_(| 4 , 11 |)& (_OPT_(|1,6|)=0) THEN DO; * Print _SS_ after each sweep; PRINT "_SS_ matrix after sweeping variable _P1_"; _PNAME1_ = _VNAME_(| 1 , _P1_ |); PRINT _P1_ (| ROWNAME = _PNAME1_ |) _SS_ (| ROWNAME = _VNAME_ COLNAME = _VNAME_ |); END; END; ELSE RUN _ZPIVOT_(_SS_,_DELTA_,_VOLD1_,_P1_); _VOLD1_ (| 1 , _P1_ |) = _VOLD1_(| 1 , _P1_ |) < 1; _SWEEP1_ (| 1 , _P1_ |) = 0; IF NCOL( _PIVOT1_ ) > 1 THEN _LOC_ = _PIVOT1_(| 1, 1:(NCOL( _PIVOT1_ ) - 1 ) |) ; END; * end of sweep section ; END; * end of if (NCOL(_LOC_) > 0) then do; END; * end of do _GROUP1_ = -1 to 1 by 2 ; _LOCZ1_ = ( VECDIAG( _SS_ )` <= _DELTA_ ) # _VNEW1_ ; IF ANY( _LOCZ1_ ) THEN DO; _ECODE_ (| 4 , 1 |) = 1000; _LOC_ = ( _LOCZ1_ = -1 ); IF ANY( _LOC_ ) THEN DO; _ECODE_ (| 4 , 1 |) = _ECODE_(| 4 , 1 |) + 10; _LOC_ = LOC( _LOC_ ); _BIG_ = _YINDEX_; _LITTLE_ = _LOC_; _INDEX_ = _SCAN_( _BIG_, _LITTLE_); _ZEROY_ = _INDEX_; END; _LOC_ = _LOCZ1_ = 1; IF ANY( _LOC_ ) THEN DO; _ECODE_ (| 4 , 1 |) = _ECODE_(| 4 , 1 |) + 100; _LOC_ = LOC( _LOC_ ); _BIG_ = _XINDEX_; _LITTLE_ = _LOC_; _INDEX_ = _SCAN_(_BIG_, _LITTLE_); _ZEROX_ = _INDEX_; END; FREE _LOCZ1_ _BIG_ _LITTLE_ _INDEX_; END; IF _ECODE_(| 4 , 1 |) >= 1100 THEN DO; * Check if LTFR model is ok *; IF _OPT_(| 4 , 13 |) THEN DO; IF _OPT_(| 1 , 6|)=0 THEN PRINT ,, "NOTICE --- Model is less than FULL RANK"; END; ELSE DO; NOTEF_4 = { "ERROR -- Model is less than FULL RANK" , "LTFR option must be on to allow LTFR model" }; IF _OPT_(| 1 , 6|)=0 THEN PRINT ,, NOTEF_4 , ; _ECODE_ (| 4 , 1 |) = 5004; END; _P1_ = _LOC_; RUN _ZPIVOT_(_SS_,_DELTA_,_VOLD1_,_P1_); IF _OPT_(| 4 , 14 |) THEN DO; * Print dependent columns of _SS_ *; _LINDEP_ = _SS_(| _XINDEX_ , _LOC_ |); _NAME1_ = _VNAME_(| 1 , _LOC_ |); IF _OPT_(| 1 , 6|)=0 THEN PRINT ,, "Column coefficients indicate dependency structure" , _LINDEP_(| &_FMT3_ ROWNAME=_XNAME_ COLNAME=_VNAME_|); END; END; IF SUM( ( _VOLD1_ = 1 ) - ( _VNEW1_ = 1 ) ) = 0 THEN _VTYPE_ = _VNEW1_ ; ELSE DO; _ECODE_ (| 4 , 1 |) = 5006; IF _OPT_(| 1 , 6|)=0 THEN PRINT , "Error in sweep status" , _VOLD1_ , _VNEW1_ (| &_FMT1_ COLNAME=_VNAME_ |); END; _RANK2_ = SUM( ( VECDIAG( _SS_ )` > _DELTA_ ) # ( _VNEW1_ = 1 ) ); _PARM_ (| 1 , 3 |) = _PARM_(| 1 , 3 |) - _RANK1_ + _RANK2_; _PARM_ (| 1 , 2 |) = SUM( _VTYPE_ = -1 ); _PARM_ (| 1 , 4 |) = SUM( _VTYPE_ = 0 ); _DF_ = _PARM_(| 1 , 1 |) - _PARM_(| 1 , 3 |); IF _DF_ > 0 THEN _RECPDF_ = 1.0 / _DF_ ; * Computing Reciprocal *; ELSE _RECPDF_ = .; * Section 4: Extract Parameters ; IF _ECODE_(| 4 , 1|) > 5000 THEN RUN _EREXIT_(_ECODE_,_MODNMS_); * Print variables @ output status *; IF _OPT_(| 4 , 15 |)& (_OPT_(|1,6|)=0) THEN DO; NOBETAPR={1}-MAX( _OPT_(|4 , {3 7} |) ) ; IF NOBETAPR THEN PRINT , "The following model has been fitted"; IF _ECODE_(| 4 , 1|) >= 1100 THEN PRINT , "-- Model is LESS THAN FULL RANK --"; IF NOBETAPR THEN PRINT _YNAME_ , _XNAME_ (| FORMAT = $8. |); RUN _PRPARM_( _PARM_ ); IF NOBETAPR THEN RUN _PVTYPE_( _VTYPE_, _VNAME_ ); END; * Print _SS_ @ output *; IF _OPT_(| 4 , 12 |)&(_OPT_(|1,6|)=0) THEN PRINT , "_SS_ After fitting the model" _SS_ (| ROWNAME=_VNAME_ COLNAME=_VNAME_ &_FMT2_ |); * Create & print XPX inverse, Beta, model parameters , & error SS * * IF LTFR model, the columns and rows of variables with zero * * must be set to 0 to give the proper generalized XPXINV *; IF SUM( _OPT_(| 4, { 4 8 } |) ) THEN DO; _XPXINV_ = _SS_(| _XINDEX_ , _XINDEX_ |); IF _ECODE_(| 4 , 1 |) >= 1100 THEN DO; _ZERO1_ = VECDIAG( _XPINV_ ) > _DELTA_`; _ZERO1_ = _ZERO1_ * _ZERO1_`; _XPXINV_ = _XPXINV_ # _ZERO1_; FREE _ZERO1_; END; END; IF _OPT_(| 4 , 3 |) THEN DO; *----- BETA -----*; _BETA_ = _SS_(| _XINDEX_ , _YINDEX_ |); IF _OPT_(|1,6|)=0 THEN PRINT ,, "BETA - Matrix of Parameter Estimates" _BETA_ (| &_FMT4_ ROWNAME=_XNAME_ COLNAME=_YNAME_ |); END; IF _OPT_(| 4 , 4 |)&(_OPT_(|1,6|)=0) THEN PRINT ,, "X'X Inverse Matrix" _XPXINV_ (| &_FMT3_ ROWNAME=_XNAME_ COLNAME=_XNAME_ |); IF ( _DF_ <= 0 ) THEN DO; _ECODE_ (| 4 , 1 |) = 5007; IF _OPT_(|1,6|)=0 THEN PRINT , "FITMODEL : Error DF are <= ZERO (See _PARM_)."; RUN _EREXIT_(_ECODE_,_MODNMS_); END; IF _OPT_(| 4 , 5 |) THEN DO; *---- F TESTS ----*; _PARM1_ = _PARM_(| 1 , 1 |) || _PARM_(| 1 , 3 |) || _DF_; NOTEF_5={" Model Parameters and Univariate Statistics" , "(WARNING! The R Square values below are often not the" , "usual R Squares, i.e., they are not about the origin)"}; IF (_OPT_(|1,5|)=0)&(_OPT_(|1,6|)=0) THEN PRINT NOTEF_5 ; _PM1CNM_ = { "N" "Numer DF" "Denom DF" }; IF _OPT_(|1,6|)=0 THEN PRINT ,, _PARM1_ (| COLNAME = _PM1CNM_ |); _ESS_ = VECDIAG( _SS_(| _YINDEX_, _YINDEX_ |))`; _HSS_ = _SUMSQ_(| 1 , _YINDEX_ |) - _ESS_; _NDF_ = _PARM1_(| 1 , 2|); _STAT_ = ( _HSS_ # _DF_ ) / ( _NDF_ # _ESS_ ); _T1_ = J( 1, NCOL( _YINDEX_ ), 1 ); _STAT_ = _STAT_ // ( 1 - PROBF( _STAT_, _T1_#_NDF_, _T1_#_DF_ )); _STAT_ = _STAT_ // ( _HSS_ # ( J( 1 , NCOL(_YINDEX_), 1) / ( _HSS_ + _ESS_ ))); * Computing Reciprical of _HSS_ *; _STRNM_ = { "F Value" "p Value" "R Squared" }; IF _OPT_(|1,6|)=0 THEN PRINT _STAT_ (| ROWNAME = _STRNM_ COLNAME = _YNAME_ |); FREE _T1_; END; IF _OPT_(| 4 , 6 |) THEN DO; *--- COMPUTATION CHECK ---*; END; IF _OPT_(| 4 , 7 |) THEN DO; *----- EXPANDED BETA -----*; IF _OPT_(|1,6|)=0 THEN PRINT ,, "Expanded Columns of BETA"; _BSE_ = VECDIAG( _SS_ ); _BSE_ = SQRT(_BSE_(| _XINDEX_, 1 |)* (( _BSE_(| _YINDEX_, 1 |)`)*_RECPDF_)); IF _OPT_(| 4 , 3 |) = 0 THEN _BETA_ = _SS_(| _XINDEX_, _YINDEX_|); IF ( MIN( _BSE_ ) <= 0 ) THEN DO; IF _OPT_(|1,6|)=0 THEN PRINT , "(WARNING: 1 or more error terms are 0" , "so T values are set to missing"; IF _OPT_(|1,6|)=0 THEN IF _OPT_(| 4 , 13 |) THEN PRINT , "This is due to LTFR model.)"; ELSE PRINT , "Probable user error.)"; _BT_ = J( NCOL( _XINDEX_ ), NCOL( _YINDEX_ ), 1 ); DO _K1_ = 1 TO NROW( _BSE_ ); IF ( MIN( _BSE_(| _K1_, |) ) > 0 ) THEN _BT_(|_K1_, |) = BETA(|_K1_, |) # ( J( 1, NCOL(_BSE_),1 ) / (_BSE_(|_K1_, |)) ); * Computing reciprocal of _BSE_(| _K1_, |) *; ELSE _BT_(| _K1_, |) = .; END; END; ELSE _BT_=_BETA_ # ( J( NROW(_BSE_), NCOL(_BSE_),1 ) / _BSE_ ); _T1_ = J( NCOL( _XINDEX_ ), NCOL( _YINDEX_ ), 1 ); _BPVAL_ = ( _T1_ - PROBT( ABS( _BT_ ), _T1_ # _DF_ ) ) # 2 ; FREE _T1_; IF NCOL( _ZEROX_ ) THEN DO; * X LTFR, set rows to missing ; _BT_ (| _ZEROX_ , |) = J( NCOL(_ZEROX_), NCOL(_YINDEX_), . ); _BPVAL_ (| _ZEROX_ , |) = _BT_(| _ZEROX_ , |); END; IF NCOL( _ZEROY_ ) THEN DO; * Y LTFR, set columns to missing; _BT_ (| , _ZEROY_ |) = J( NCOL(_XINDEX_), NCOL(_ZEROY_), . ); _BPVAL_ (| , _ZEROY_ |) = _BT_(| , _ZEROY_ |); END; _BDTCNM_ = { "Y Var" "Std Err" "t Value" "2 Tail p" }; DO _L1_ = 1 TO NCOL( _YINDEX_ ); _BDATA_ = _BETA_(| , _L1_ |) || _BSE_(| , _L1_ |) || _BT_(| , _L1_ |) || _BPVAL_(| , _L1_ |); _BDTCNM_ (| 1 , 1 |) = _YNAME_(| 1 , _L1_ |); IF _OPT_(|1,6|)=0 THEN PRINT _BDATA_ (| ROWNAME=_XNAME_ COLNAME=_BDTCNM_ &_FMT4_|); END; FREE _K1_ _L1_; END; * end expanded beta ; IF _OPT_(| 4 , 8 |) THEN DO; *----- COVAR OF BETA -----*; _IJN1_ = { "I-th Col" "J-th Col" }; IF _OPT_(|1,6|)=0 THEN PRINT ,, "Covariance of I-th and J-th Columns of BETA"; DO _K1_ = 1 TO NCOL( _YINDEX_ ); DO _K2_ = 1 TO _K1_; _L1_ = _YINDEX_(| 1 , _K1_ |); _L2_ = _YINDEX_(| 1 , _K2_ |); _COV_ = _SS_(| _L1_ , _L2_ |) * _XPXINV_ * _RECPDF_; _IJ1_ = _YNAME_(| 1 , _K1_ |) || _YNAME_(| 1 , _K2_ |); _IJCNM_ = { "DEP VARS:" }; IF _OPT_(|1,6|)=0 THEN PRINT ,, _IJ1_ (| FORMAT=$8. COLNAME=_IJN1_ ROWNAME=_IJCNM_|) _COV_ (| &_FMT5_ COLNAME=_XNAME_ ROWNAME=_XNAME_ |); END; * end of j loop ; END; * end of i loop ; FREE _K1_ _K2_ _L1_ _L2_ _COV_; END; * end of if _opt_(| 4, 8 |) *; IF _OPT_(| 4 , 9 |) THEN DO; *----- SIGMA -----*; _SIGMA_ = _SS_(| _YINDEX_ , _YINDEX_ |) * _RECPDF_; IF _OPT_(|1,6|)=0 THEN PRINT ,, "Estimated SIGMA - Error Covariance Matrix" _SIGMA_ (| &_FMT5_ ROWNAME=_YNAME_ COLNAME=_YNAME_ |); END; IF _OPT_(| 4 , 10 |) THEN DO; *---- ERROR CORR ----*; _T1_ = SWEEP( SQRT( DIAG( _SS_(| _YINDEX_, _YINDEX_ |)))); _SCORR_ = _T1_ * _SS_(| _YINDEX_ , _YINDEX_ |) * _T1_; IF _OPT_(|1,6|)=0 THEN PRINT ,, "Estimated Error Correlation Matrix of SIGMA" , _SCORR_ (| &_FMT6_ ROWNAME=_YNAME_ COLNAME=_YNAME_ |); FREE _T1_; END; FINISH _FITMOD_ ;