Presentation is loading. Please wait.

Presentation is loading. Please wait.

Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long Westat, Durham,

Similar presentations


Presentation on theme: "Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long Westat, Durham,"— Presentation transcript:

1 Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov Jeff Abolafia, Rho Inc, Chapel Hill, NC Lawrence Park, Chapel Hill, NC

2 SAS tools for automating the generation of customized reports

3 Output Delivery System (ODS)

4 SAS tools for automating the generation of customized reports Output Delivery System (ODS) SAS Macro facility

5 Customized Reports Customized Reports

6 Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Standard Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) ----------------------------------------------------------------------------------------- Years lived on farm 36.21 0.08 28166 0.030 0.001 0.021 0.002 Acres planted crops 47.03 0.04 28209 0.022 0.001 0.024 0.002 Customized Reports Customized Reports

7 Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Standard Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) ----------------------------------------------------------------------------------------- Years lived on farm 36.21 0.08 28166 0.030 0.001 0.021 0.002 Acres planted crops 47.03 0.04 28209 0.022 0.001 0.024 0.002 Customized Reports PROC MEANS

8 Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Standard Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) ----------------------------------------------------------------------------------------- Years lived on farm 36.21 0.08 28166 0.030 0.001 0.021 0.002 Acres planted crops 47.03 0.04 28209 0.022 0.001 0.024 0.002 Customized Reports Crude PROC GLM

9 Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Standard Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) ----------------------------------------------------------------------------------------- Years lived on farm 36.21 0.08 28166 0.030 0.001 0.021 0.002 Acres planted crops 47.03 0.04 28209 0.022 0.001 0.024 0.002 Customized Reports Adjusted PROC GLM

10 Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Standard Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) ----------------------------------------------------------------------------------------- Years lived on farm 36.21 0.08 28166 0.030 0.001 0.021 0.002 Acres planted crops 47.03 0.04 28209 0.022 0.001 0.024 0.002 Customized Reports Additional Descriptive Information

11 ODS ODS Additional Descriptive Information PROC MEANS

12 ODS ODS Additional Descriptive Information PROC MEANS AHS43300.sas 09:30 Thursday, February 28, 2008 1120 The MEANS Procedure Analysis Variable : years_on_farm Years lived or worked on farm Mean N Std Error Std Dev ----------------------------------------------------- 36.2130062 53482 0.0789519 18.2585612 -----------------------------------------------------

13 ODS ODS Additional Descriptive Information PROC MEANS Crude PROC GLM AHS43300.sas 09:30 Thursday, February 28, 2008 1120 The MEANS Procedure Analysis Variable : years_on_farm Years lived or worked on farm Mean N Std Error Std Dev ----------------------------------------------------- 36.2130062 53482 0.0789519 18.2585612 -----------------------------------------------------

14 ODS ODS Additional Descriptive Information PROC MEANS Crude PROC GLM AHS43300.sas 09:30 Thursday, February 28, 2008 1120 The MEANS Procedure Analysis Variable : years_on_farm Years lived or worked on farm Mean N Std Error Std Dev ----------------------------------------------------- 36.2130062 53482 0.0789519 18.2585612 ----------------------------------------------------- AHS43300.sas 09:30 Thursday, February 28, 2008 1121 Phase 1 Release: P1REL0506 Phase 2 Release: P2REL0612.03 Phase 3 Release: Interim release P3REL0707.01 Spouses - Frequencies of Part 3: super-controls The GLM Procedure Number of Observations Read 84742 Number of Observations Used 49624 AHS43300.sas 09:30 Thursday, February 28, 2008 1124 The GLM Procedure Dependent Variable: bmi Body Mass Index Sum of Sum of Source DF Squares Mean Square F Value Pr > F Model 1 14626.311 14626.311 695.33 <.0001 Error 49622 1043803.927 21.035 Corrected Total 49623 1058430.238 R-Square Coeff Var Root MSE bmi Mean 0.013819 17.55976 4.586404 26.11883 Source DF Type I SS Mean Square F Value Pr > F years_on_farm 1 14626.31136 14626.31136 695.33 <.0001 Source DF Type III SS Mean Square F Value Pr > F years_on_farm 1 14626.31136 14626.31136 695.33 <.0001 Standard Standard Parameter Estimate Error t Value Pr > |t| Intercept 25.02571119 0.04628587 540.68 <.0001 years_on_farm 0.02987844 0.00113309 26.37 <.0001

15 ODS ODS Additional Descriptive Information PROC MEANS AHS43300.sas 09:30 Thursday, February 28, 2008 1120 The MEANS Procedure Analysis Variable : years_on_farm Years lived or worked on farm Mean N Std Error Std Dev ----------------------------------------------------- 36.2130062 53482 0.0789519 18.2585612 ----------------------------------------------------- Crude PROC GLM AHS43300.sas 09:30 Thursday, February 28, 2008 1121 Phase 1 Release: P1REL0506 Phase 2 Release: P2REL0612.03 Phase 3 Release: Interim release P3REL0707.01 Spouses - Frequencies of Part 3: super-controls The GLM Procedure Number of Observations Read 84742 Number of Observations Used 49624 AHS43300.sas 09:30 Thursday, February 28, 2008 1124 The GLM Procedure Dependent Variable: bmi Body Mass Index Sum of Sum of Source DF Squares Mean Square F Value Pr > F Model 1 14626.311 14626.311 695.33 <.0001 Error 49622 1043803.927 21.035 Corrected Total 49623 1058430.238 R-Square Coeff Var Root MSE bmi Mean 0.013819 17.55976 4.586404 26.11883 Source DF Type I SS Mean Square F Value Pr > F years_on_farm 1 14626.31136 14626.31136 695.33 <.0001 Source DF Type III SS Mean Square F Value Pr > F years_on_farm 1 14626.31136 14626.31136 695.33 <.0001 Standard Standard Parameter Estimate Error t Value Pr > |t| Intercept 25.02571119 0.04628587 540.68 <.0001 years_on_farm 0.02987844 0.00113309 26.37 <.0001 Adjusted PROC GLM

16 ODS ODS Additional Descriptive Information PROC MEANS AHS43300.sas 09:30 Thursday, February 28, 2008 1120 The MEANS Procedure Analysis Variable : years_on_farm Years lived or worked on farm Mean N Std Error Std Dev ----------------------------------------------------- 36.2130062 53482 0.0789519 18.2585612 ----------------------------------------------------- Crude PROC GLM AHS43300.sas 09:30 Thursday, February 28, 2008 1121 Phase 1 Release: P1REL0506 Phase 2 Release: P2REL0612.03 Phase 3 Release: Interim release P3REL0707.01 Spouses - Frequencies of Part 3: super-controls The GLM Procedure Number of Observations Read 84742 Number of Observations Used 49624 AHS43300.sas 09:30 Thursday, February 28, 2008 1124 The GLM Procedure Dependent Variable: bmi Body Mass Index Sum of Sum of Source DF Squares Mean Square F Value Pr > F Model 1 14626.311 14626.311 695.33 <.0001 Error 49622 1043803.927 21.035 Corrected Total 49623 1058430.238 R-Square Coeff Var Root MSE bmi Mean 0.013819 17.55976 4.586404 26.11883 Source DF Type I SS Mean Square F Value Pr > F years_on_farm 1 14626.31136 14626.31136 695.33 <.0001 Source DF Type III SS Mean Square F Value Pr > F years_on_farm 1 14626.31136 14626.31136 695.33 <.0001 Standard Standard Parameter Estimate Error t Value Pr > |t| Intercept 25.02571119 0.04628587 540.68 <.0001 years_on_farm 0.02987844 0.00113309 26.37 <.0001 Adjusted PROC GLM AHS43300.sas 09:30 Thursday, February 28, 2008 1125 The GLM Procedure Class Level Information Class Level Information Class Levels Values race 5 1) White 2) Black 3) Native American 4) Asian/Pacific Islander 5) Other Islander 5) Other gender 2 1) Male 2) Female Number of Observations Read 84742 Number of Observations Used 31807 AHS43300.sas 09:30 Thursday, February 28, 2008 1126 The GLM Procedure Dependent Variable: bmi Body Mass Index Sum of Sum of Source DF Squares Mean Square F Value Pr > F Model 8 25809.3778 3226.1722 140.96 <.0001 Error 31798 727766.1040 22.8872 Corrected Total 31806 753575.4818 R-Square Coeff Var Root MSE bmi Mean 0.034249 18.68216 4.784053 25.60760 Source DF Type I SS Mean Square F Value Pr > F race 4 5150.08 1287.520119 56.26 <.0001 gender 1 3862.26 3862.260203 168.75 <.0001 height 1 7980.70 7980.705357 348.70 <.0001 age 1 7564.74 7564.740140 330.52 <.0001 years_on_farm 1 1251.59 1251.591649 54.69 <.0001 Source DF Type III SS Mean Square F Value Pr > F race 4 4126.20 1031.551901 45.07 <.0001 gender 1 9300.84 9300.847470 406.38 <.0001 height 1 5814.95 5814.952222 254.07 <.0001 age 1 1974.05 1974.050855 86.25 <.0001 years_on_farm 1 1251.59 1251.591649 54.69 <.0001

17 ODS ODS Additional Descriptive Information PROC MEANS Crude PROC GLM AHS43300.sas 09:30 Thursday, February 28, 2008 1121 Phase 1 Release: P1REL0506 Phase 2 Release: P2REL0612.03 Phase 3 Release: Interim release P3REL0707.01 Spouses - Frequencies of Part 3: super-controls The GLM Procedure Number of Observations Read 84742 Number of Observations Used 49624 AHS43300.sas 09:30 Thursday, February 28, 2008 1124 The GLM Procedure Dependent Variable: bmi Body Mass Index Sum of Sum of Source DF Squares Mean Square F Value Pr > F Model 1 14626.311 14626.311 695.33 <.0001 Error 49622 1043803.927 21.035 Corrected Total 49623 1058430.238 R-Square Coeff Var Root MSE bmi Mean 0.013819 17.55976 4.586404 26.11883 Source DF Type I SS Mean Square F Value Pr > F years_on_farm 1 14626.31136 14626.31136 695.33 <.0001 Source DF Type III SS Mean Square F Value Pr > F years_on_farm 1 14626.31136 14626.31136 695.33 <.0001 Standard Standard Parameter Estimate Error t Value Pr > |t| Intercept 25.02571119 0.04628587 540.68 <.0001 years_on_farm 0.02987844 0.00113309 26.37 <.0001 Adjusted PROC GLM AHS43300.sas 09:30 Thursday, February 28, 2008 1125 The GLM Procedure Class Level Information Class Level Information Class Levels Values race 5 1) White 2) Black 3) Native American 4) Asian/Pacific Islander 5) Other Islander 5) Other gender 2 1) Male 2) Female Number of Observations Read 84742 Number of Observations Used 31807 AHS43300.sas 09:30 Thursday, February 28, 2008 1126 The GLM Procedure Dependent Variable: bmi Body Mass Index Sum of Sum of Source DF Squares Mean Square F Value Pr > F Model 8 25809.3778 3226.1722 140.96 <.0001 Error 31798 727766.1040 22.8872 Corrected Total 31806 753575.4818 R-Square Coeff Var Root MSE bmi Mean 0.034249 18.68216 4.784053 25.60760 Source DF Type I SS Mean Square F Value Pr > F race 4 5150.08 1287.520119 56.26 <.0001 gender 1 3862.26 3862.260203 168.75 <.0001 height 1 7980.70 7980.705357 348.70 <.0001 age 1 7564.74 7564.740140 330.52 <.0001 years_on_farm 1 1251.59 1251.591649 54.69 <.0001 Source DF Type III SS Mean Square F Value Pr > F race 4 4126.20 1031.551901 45.07 <.0001 gender 1 9300.84 9300.847470 406.38 <.0001 height 1 5814.95 5814.952222 254.07 <.0001 age 1 1974.05 1974.050855 86.25 <.0001 years_on_farm 1 1251.59 1251.591649 54.69 <.0001 Data set

18 ODS ODS Additional Descriptive Information PROC MEANS Crude PROC GLM Adjusted PROC GLM AHS43300.sas 09:30 Thursday, February 28, 2008 1125 The GLM Procedure Class Level Information Class Level Information Class Levels Values race 5 1) White 2) Black 3) Native American 4) Asian/Pacific Islander 5) Other Islander 5) Other gender 2 1) Male 2) Female Number of Observations Read 84742 Number of Observations Used 31807 AHS43300.sas 09:30 Thursday, February 28, 2008 1126 The GLM Procedure Dependent Variable: bmi Body Mass Index Sum of Sum of Source DF Squares Mean Square F Value Pr > F Model 8 25809.3778 3226.1722 140.96 <.0001 Error 31798 727766.1040 22.8872 Corrected Total 31806 753575.4818 R-Square Coeff Var Root MSE bmi Mean 0.034249 18.68216 4.784053 25.60760 Source DF Type I SS Mean Square F Value Pr > F race 4 5150.08 1287.520119 56.26 <.0001 gender 1 3862.26 3862.260203 168.75 <.0001 height 1 7980.70 7980.705357 348.70 <.0001 age 1 7564.74 7564.740140 330.52 <.0001 years_on_farm 1 1251.59 1251.591649 54.69 <.0001 Source DF Type III SS Mean Square F Value Pr > F race 4 4126.20 1031.551901 45.07 <.0001 gender 1 9300.84 9300.847470 406.38 <.0001 height 1 5814.95 5814.952222 254.07 <.0001 age 1 1974.05 1974.050855 86.25 <.0001 years_on_farm 1 1251.59 1251.591649 54.69 <.0001 Data set

19 ODS ODS Additional Descriptive Information PROC MEANS Crude PROC GLM Adjusted PROC GLM Data set

20 ODS ODS Additional Descriptive Information PROC MEANS Crude PROC GLM Adjusted PROC GLM Composite Data set

21 SAS Macro Facility SAS Macro Facility Additional Descriptive Information PROC MEANS Crude PROC GLM Adjusted PROC GLM Composite Data set

22 SAS Macro Facility SAS Macro Facility Additional Descriptive Information PROC MEANS Crude PROC GLM Adjusted PROC GLM Data set Composite Data set

23 SAS Macro Facility SAS Macro Facility Additional Descriptive Information PROC MEANS Crude PROC GLM Adjusted PROC GLM Composite Data set

24 SAS Macro Facility SAS Macro Facility Additional Descriptive Information PROC MEANS Crude PROC GLM Adjusted PROC GLM Data set Composite Data set

25 SAS Macro Facility SAS Macro Facility Additional Descriptive Information PROC MEANS Crude PROC GLM Adjusted PROC GLM Composite Data set

26 SAS Macro Facility SAS Macro Facility Additional Descriptive Information PROC MEANS Crude PROC GLM Adjusted PROC GLM Data set Composite Data set

27 SAS Macro Facility SAS Macro Facility Additional Descriptive Information PROC MEANS Crude PROC GLM Adjusted PROC GLM Composite Data set

28 SAS Macro Facility SAS Macro Facility Additional Descriptive Information PROC MEANS Crude PROC GLM Adjusted PROC GLM Data set Composite Data set

29 SAS Macro Facility SAS Macro Facility Additional Descriptive Information PROC MEANS Crude PROC GLM Adjusted PROC GLM Composite Data set

30 SAS Macro Facility SAS Macro Facility Additional Descriptive Information PROC MEANS Crude PROC GLM Adjusted PROC GLM Data set Composite Data set

31 SAS Macro Facility SAS Macro Facility Additional Descriptive Information PROC MEANS Crude PROC GLM Adjusted PROC GLM Composite Data set

32 The programmer must identify the main tasks required to complete this analysis

33 1.Initialize the Base Data Set The programmer must identify the main tasks required to complete this analysis

34 The programmer must identify the main tasks required to complete this analysis 1.Initialize the Base Data Set 2.Produce a Summary Data Set of Mean Statistics

35 The programmer must identify the main tasks required to complete this analysis 1.Initialize the Base Data Set 2.Produce a Summary Data Set of Mean Statistics 3.Produce a Summary Data Set of Crude Model Estimates

36 The programmer must identify the main tasks required to complete this analysis 1.Initialize the Base Data Set 2.Produce a Summary Data Set of Mean Statistics 3.Produce a Summary Data Set of Crude Model Estimates 4.Produce a Summary Data Set of Adjusted Model Estimates

37 The programmer must identify the main tasks required to complete this analysis 1.Initialize the Base Data Set 2.Produce a Summary Data Set of Mean Statistics 3.Produce a Summary Data Set of Crude Model Estimates 4.Produce a Summary Data Set of Adjusted Model Estimates 5.Append the Summary Data Sets to the Base Data Set

38 The programmer must identify the main tasks required to complete this analysis 1.Initialize the Base Data Set 2.Produce a Summary Data Set of Mean Statistics 3.Produce a Summary Data Set of Crude Model Estimates 4.Produce a Summary Data Set of Adjusted Model Estimates 5.Append the Summary Data Sets to the Base Data Set 6.Create a Supervisory Macro to Delegate these Tasks through Invocations of other Macro Modules

39 Secondary Tasks are Required to Support these Main Tasks 1.Initialize the Base Data Set 2.Produce a Summary Data Set of Mean Statistics 3.Produce a Summary Data Set of Crude Model Estimates 4.Produce a Summary Data Set of Adjusted Model Estimates 5.Append the Summary Data Sets to the Base Data Set 6.Create a Supervisory Macro to Delegate these Tasks through Invocations of other Macro Modules

40 1.Initialize the Base Data Set 2.Produce a Summary Data Set of Mean Statistics 3.Produce a Summary Data Set of Crude Model Estimates 4.Produce a Summary Data Set of Adjusted Model Estimates 5.Append the Summary Data Sets to the Base Data Set 6.Create a Supervisory Macro to Delegate these Tasks through Invocations of other Macro Modules 7.Validate the User Supplied Information Secondary Tasks are Required to Support these Main Tasks

41 1.Initialize the Base Data Set 2.Produce a Summary Data Set of Mean Statistics 3.Produce a Summary Data Set of Crude Model Estimates 4.Produce a Summary Data Set of Adjusted Model Estimates 5.Append the Summary Data Sets to the Base Data Set 6.Create a Supervisory Macro to Delegate these Tasks through Invocations of other Macro Modules 7.Validate the User Supplied Information 8.Specify the Covariates for the Adjusted Model Secondary Tasks are Required to Support these Main Tasks

42 1.Initialize the Base Data Set 2.Produce a Summary Data Set of Mean Statistics 3.Produce a Summary Data Set of Crude Model Estimates 4.Produce a Summary Data Set of Adjusted Model Estimates 5.Append the Summary Data Sets to the Base Data Set 6.Create a Supervisory Macro to Delegate these Tasks through Invocations of other Macro Modules 7.Validate the User Supplied Information 8.Specify the Covariates for the Adjusted Model 9.Create an Analysis Data Set Secondary Tasks are Required to Support these Main Tasks

43 1.Initialize the Base Data Set 2.Produce a Summary Data Set of Mean Statistics 3.Produce a Summary Data Set of Crude Model Estimates 4.Produce a Summary Data Set of Adjusted Model Estimates 5.Append the Summary Data Sets to the Base Data Set 6.Create a Supervisory Macro to Delegate these Tasks through Invocations of other Macro Modules 7.Validate the User Supplied Information 8.Specify the Covariates for the Adjusted Model 9.Create an Analysis Data Set 10.Generate the Summary Report Secondary Tasks are Required to Support these Main Tasks

44 Initialize the Base Data Set

45 Create a data set that contains all the desired variables.Create a data set that contains all the desired variables.

46 Initialize the Base Data Set Create a data set that contains all the desired variables.Create a data set that contains all the desired variables. Pre-assign attributes for these variables.Pre-assign attributes for these variables.

47 Initialize the Base Data Set Create a data set that contains all the desired variables.Create a data set that contains all the desired variables. Pre-assign attributes for these variables.Pre-assign attributes for these variables. Remove the initial observation from this data set: Resulting in a data set containing zero observations.Remove the initial observation from this data set: xxxxResulting in a data set containing zero observations.

48 Initialize the Base Data Set %MACRO %MACRO initbase;

49 MACRO %MACRO initbase(base = ); DATA &base; MACRO %MACRO initbase(base = ); DATA &base; Initialize the Base Data Set

50 MACRO %MACRO initbase(base = ); OPTIONS NONOTES OPTIONS NONOTES; DATA &base; MACRO %MACRO initbase(base = ); OPTIONS NONOTES OPTIONS NONOTES; DATA &base; Assign Attributes to Unitialized Variables

51 MACRO %MACRO initbase(base = ); OPTIONS NONOTES OPTIONS NONOTES; DATA DATA &base; MACRO %MACRO initbase(base = ); OPTIONS NONOTES OPTIONS NONOTES; DATA DATA &base;

52 Assign Length Attributes MACRO %MACRO initbase(base = ); OPTIONS NONOTES OPTIONS NONOTES; DATA DATA &base; LENGTH LENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; MACRO %MACRO initbase(base = ); OPTIONS NONOTES OPTIONS NONOTES; DATA DATA &base; LENGTH LENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.;

53 Assign Label Attributes MACRO %MACRO initbase(base = ); OPTIONS NONOTES OPTIONS NONOTES; DATA DATA &base; LENGTH LENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent Variable" stddev ="PROC MEANS: Standard Deviation of Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" MACRO %MACRO initbase(base = ); OPTIONS NONOTES OPTIONS NONOTES; DATA DATA &base; LENGTH LENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent Variable" stddev ="PROC MEANS: Standard Deviation of Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable"

54 OPTIONS NONOTES OPTIONS NONOTES; DATA DATA &base; LENGTH LENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: ParamaterEstimate OPTIONS NONOTES OPTIONS NONOTES; DATA DATA &base; LENGTH LENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: ParamaterEstimate

55 DATA DATA &base; LENGTH LENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" DATA DATA &base; LENGTH LENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate"

56 LENGTH LENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of LENGTH LENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of

57 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate"

58 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter

59 crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate"

60 crude_stderr adjusted_stderr 8.; LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error crude_stderr adjusted_stderr 8.; LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error

61 LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" LABEL"" LABEL key_var ="Name of Independent Variable" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate"

62 "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" "" key_label ="Label of Independent Variable" "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates"

63 "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; "" response_var ="Name of Response Variable" "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates";

64 "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 "" response_label ="Label of Response Variable" " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4

65 " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; " mean ="PROC MEANS: Mean of Independent " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3;

66 " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; " Variable" " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN;

67 " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; " n ="PROC MEANS: N of Independent " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN;

68 " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; " Variable" " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES;

69 " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; " stddev ="PROC MEANS: Standard Deviation of " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES;

70 " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; DATA &base; " Independent Variable" stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; DATA &base;

71 stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; DATA &base; SET &base; stderror ="PROC MEANS: Standard Error of Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; DATA &base; SET &base;

72 Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; DATA &base; SET &base; STOP; Independent Variable" crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; DATA &base; SET &base; STOP;

73 crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; DATA &base; SET &base; STOP; RUN; crude_estimate ="Crude PROC GLM: Paramater Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; DATA &base; SET &base; STOP; RUN;

74 Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; DATA &base; SET &base; STOP; RUN; Estimate" crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; DATA &base; SET &base; STOP; RUN;

75 crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; DATA &base; SET &base; STOP; RUN; %MEND initbase; crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; DATA &base; SET &base; STOP; RUN; %MEND initbase;

76 Assign Format Attributes crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; DATA &base; SET &base; STOP; RUN; %MEND initbase; crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; DATA &base; SET &base; STOP; RUN; %MEND initbase;

77 Assign Format Attributes crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMATPVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 ODDSR8.3 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; DATA &base; SET &base; STOP; RUN; %MEND initbase; crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMATPVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 ODDSR8.3 crude_stderr adjusted_stderr ODDSR8.3; RUN; OPTION NOTES; DATA &base; SET &base; STOP; RUN; %MEND initbase;

78 Do Not Output the Observation crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMATPVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 ODDSR8.3 crude_stderr adjusted_stderr ODDSR8.3; DELETE DELETE; RUN; RUN;; OPTION NOTES; DATA &base; SET &base; STOP; RUN; %MEND initbase; crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMATPVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 ODDSR8.3 crude_stderr adjusted_stderr ODDSR8.3; DELETE DELETE; RUN; RUN;; OPTION NOTES; DATA &base; SET &base; STOP; RUN; %MEND initbase;

79 Resume NOTES to the SAS Log crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMATPVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 ODDSR8.3 crude_stderr adjusted_stderr ODDSR8.3; DELETE DELETE; RUN; RUN; OPTION NOTES OPTION NOTES; MEND %MEND initbase; crude_stderr ="Crude PROC GLM: Standard Error of Estimate" adjusted_estimate="Adjusted PROC GLM: Parameter Estimate" adjusted_stderr ="Adjusted PROC GLM: Standard Error of Estimate" class_vars ="Class Covariates" continuous_vars ="Continuous Covariates"; FORMATPVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 ODDSR8.3 crude_stderr adjusted_stderr ODDSR8.3; DELETE DELETE; RUN; RUN; OPTION NOTES OPTION NOTES; MEND %MEND initbase;

80 Invoke the INITBASE( ) Macro Module %IF %SYSFUNC(EXIST(&outfile) NE 1 %THEN %initbase(base=&outfile); %IF %SYSFUNC(EXIST(&outfile) NE 1 %THEN %initbase(base=&outfile);

81 Invoke the INITBASE( ) Macro Module Only if the BASE data set does not exist IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile) NE 1 %THEN %initbase(base=&outfile); IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile) NE 1 %THEN %initbase(base=&outfile);

82 The CONTENTS Procedure (abbreviated) 0 Data Set Name WORK.GLM_SUMMARY Observations 0 # Variable Type Len Format Label 1 key_var Char 32 Name of Independent Variable 2 response_var Char 32 Name of Response Variable 3 key_label Char 40 Label of Independent Variable 4 response_label Char 40 Label of Response Variable 5 class_vars Char 200 Adjusted PROC GLM: Class covariates 6 continuous_vars Char 200 Adjusted PROC GLM: Continuous covariates 7 mean Num 8 PROC MEANS: Mean of Independent Variable 8 stddev Num 8 PROC MEANS: Standard Deviation of Independent Variable 9 stderror Num 8 PROC MEANS: Standard Error of Independent Variable 10 n Num 8 PROC MEANS: N of Independent Variable 11 crude_estimate Num 8 PVALUE6.4 Crude PROC GLM: Parameter Estimate 12 adjusted_estimate Num 8 PVALUE6.4 Adjusted PROC GLM: Parameter Estimate 13 crude_stderr Num 8 ODDSR8.3 Crude PROC GLM: Standard Error of Estimate 14 adjusted_stderr Num 8 ODDSR8.3 Adjusted PROC GLM: Standard Error of Estimate Produces the Following Data Set with Zero Observations

83 Design a Macro Module to Produce a Data Set Containing a Mean Statistic

84 Design a Macro Module to Produce a Data Set Containing a Mean Statistic Add Labels for Reporting Purposes

85 1.One Major task per module Design a Macro Module to Produce a Data Set Containing a Mean Statistic

86 1.One Major task per module 2.Keep the coding as simple as possible Design a Macro Module to Produce a Data Set Containing a Mean Statistic

87 1.One Major task per module 2.Keep the coding as simple as possible 3.Should the Module be a. Customized a. Customized Design a Macro Module to Produce a Data Set Containing a Mean Statistic

88 1.One Major task per module 2.Keep the coding as simple as possible 3.Should the Module be a. Customized a. Customized b. Portable b. Portable Design a Macro Module to Produce a Data Set Containing a Mean Statistic

89 Decide How You Want to Produce a Data Set that Contains a Mean Statistic

90 PROC MEANSPROC MEANS Decide How You Want to Produce a Data Set that Contains a Mean Statistic

91 PROC MEANSPROC MEANS Decide How You Want to Produce a Data Set that Contains a Mean Statistic Requires 2 VARS for Labels to Output

92 PROC MEANSPROC MEANS PROC UNIVARIATEPROC UNIVARIATE Decide How You Want to Produce a Data Set that Contains a Mean Statistic

93 PROC MEANSPROC MEANS PROC UNIVARIATEPROC UNIVARIATE Decide How You Want to Produce a Data Set that Contains a Mean Statistic No Labels

94 PROC MEANSPROC MEANS PROC UNIVARIATEPROC UNIVARIATE PROC SUMMARYPROC SUMMARY Decide How You Want to Produce a Data Set that Contains a Mean Statistic

95 PROC MEANSPROC MEANS PROC UNIVARIATEPROC UNIVARIATE PROC SUMMARYPROC SUMMARY Decide How You Want to Produce a Data Set that Contains a Mean Statistic Need to Massage Output Data Sets

96 PROC MEANSPROC MEANS PROC UNIVARIATEPROC UNIVARIATE PROC SUMMARYPROC SUMMARY DATA Step ProcessingDATA Step Processing Decide How You Want to Produce a Data Set that Contains a Mean Statistic

97 PROC MEANSPROC MEANS Decide How You Want to Produce a Data Set that Contains a Mean Statistic Requires 2 VARS for Labels to Output

98 PROC MEANS Produces the following Contents PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm; VAR years_on_farm; RUN; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm; VAR years_on_farm; RUN;

99 PROC MEANS Produces the following Contents ODS OUTPUT ODS OUTPUT summary=summary_means; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm; VAR years_on_farm; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS OUTPUT ODS OUTPUT summary=summary_means; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm; VAR years_on_farm; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE;

100 PROC MEANS Produces the following Data Set ODS OUTPUT ODS OUTPUT summary=summary_means; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm; VAR years_on_farm; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS OUTPUT ODS OUTPUT summary=summary_means; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm; VAR years_on_farm; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; years_on_farm_ years_on_farm_ years_on_farm_ years_on_farm_ Mean N StdErr StdDev 36.213 53482 0.079 18.259

101 PROC MEANS Produces the following Contents ODS OUTPUT ODS OUTPUT summary=summary_means; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm; VAR years_on_farm; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS OUTPUT ODS OUTPUT summary=summary_means; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm; VAR years_on_farm; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; PROC CONTENTS(abbreviated) # Variable Type Len Format Label ----------------------------------------------------------------------------- 1 years_on_farm_Mean Num 8 BEST12. Mean 2 years_on_farm_N Num 8 BEST5. N 3 years_on_farm_StdDev Num 8 BEST12. Std Dev 4 years_on_farm_StdErr Num 8 BEST12. Std Error

102 PROC MEANS Produces the following Contents ODS OUTPUT ODS OUTPUT summary=summary_means; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm bmi; VAR years_on_farm bmi; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS OUTPUT ODS OUTPUT summary=summary_means; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm bmi; VAR years_on_farm bmi; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE;

103 PROC MEANS Produces the following Contents PROC CONTENTS(abbreviated) # Variable Type Len Format Label ----------------------------------------------------------------------------- 1 VName_years_on_farm Char 13 Variable 2 Label_years_on_farm Char 29 Label 3 years_on_farm_Mean Num 8 BEST12. Mean 4 years_on_farm_N Num 8 BEST5. N 5 years_on_farm_StdDev Num 8 BEST12. Std Dev 6 years_on_farm_StdErr Num 8 BEST12. Std Error 7 VName_bmi Char 3 Variable 8 Label_bmi Char 15 Label 8 Label_bmi Char 15 Label 9 bmi_Mean Num 8 BEST12. Mean 10 bmi_N Num 8 BEST5. N 11 bmi_StdDev Num 8 BEST12. Std Dev 12 bmi_StdErr Num 8 BEST12. Std Error

104 PROC MEANS Drop BMI statistics PROC CONTENTS(abbreviated) # Variable Type Len Format Label ----------------------------------------------------------------------------- 1 VName_years_on_farm Char 13 Variable 2 Label_years_on_farm Char 29 Label 3 years_on_farm_Mean Num 8 BEST12. Mean 4 years_on_farm_N Num 8 BEST5. N 5 years_on_farm_StdDev Num 8 BEST12. Std Dev 6 years_on_farm_StdErr Num 8 BEST12. Std Error 7 VName_bmi Char 3 Variable 8 Label_bmi Char 15 Label

105 PROC MEANS Rename the Variables PROC CONTENTS(abbreviated) # Variable Type Len Format Label ----------------------------------------------------------------------------- 1 key_var Char 13 Variable 2 key_label Char 29 Label 3 Mean Num 8 BEST12. Mean 4 N Num 8 BEST5. N 5 StdDev Num 8 BEST12. Std Dev 6 StdError Num 8 BEST12. Std Error 7 response_var Char 3 Variable 8 response_label Char 15 Label

106 PROC MEANS ODS OUTPUT ODS OUTPUT summary=summary_means; (DROP=bmi:) RENAME=(vname_bmi = response_var label_bmi = response_label vname_years_on_farm = key_var label_years_on_farm = key_label years_on_farm_mean = mean years_on_farm_n = n years_on_farm_stderr= stderror years_on_farm_stddev= stddev )) ; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm bmi; VAR years_on_farm bmi; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS OUTPUT ODS OUTPUT summary=summary_means; (DROP=bmi:) RENAME=(vname_bmi = response_var label_bmi = response_label vname_years_on_farm = key_var label_years_on_farm = key_label years_on_farm_mean = mean years_on_farm_n = n years_on_farm_stderr= stderror years_on_farm_stddev= stddev )) ; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm bmi; VAR years_on_farm bmi; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE;

107 PROC MEANS Drop Response Variable Statistics ODS OUTPUT ODS OUTPUT summary=summary_means DROP (DROP=bmi:); RENAME=(vname_bmi = response_var label_bmi = response_label vname_years_on_farm = key_var label_years_on_farm = key_label years_on_farm_mean = mean years_on_farm_n = n years_on_farm_stderr= stderror years_on_farm_stddev= stddev )) ; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm bmi; VAR years_on_farm bmi; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS OUTPUT ODS OUTPUT summary=summary_means DROP (DROP=bmi:); RENAME=(vname_bmi = response_var label_bmi = response_label vname_years_on_farm = key_var label_years_on_farm = key_label years_on_farm_mean = mean years_on_farm_n = n years_on_farm_stderr= stderror years_on_farm_stddev= stddev )) ; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm bmi; VAR years_on_farm bmi; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE;

108 PROC MEANS Rename Output to Match BASE Data Set ODS OUTPUT ODS OUTPUT summary=summary_means DROP (DROP=bmi:) RENAME RENAME=(vname_bmi = response_var label_bmi = response_label vname_years_on_farm = key_var label_years_on_farm = key_label years_on_farm_mean = mean years_on_farm_n = n years_on_farm_stderr= stderror years_on_farm_stddev= stddev )); ; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm bmi; VAR years_on_farm bmi; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS OUTPUT ODS OUTPUT summary=summary_means DROP (DROP=bmi:) RENAME RENAME=(vname_bmi = response_var label_bmi = response_label vname_years_on_farm = key_var label_years_on_farm = key_label years_on_farm_mean = mean years_on_farm_n = n years_on_farm_stderr= stderror years_on_farm_stddev= stddev )); ; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm bmi; VAR years_on_farm bmi; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE;

109 PROC CONTENTS(abbreviated) # Variable Type Len Format Label ----------------------------------------------------------------------- 1 key_var Char 13 Variable 2 key_label Char 29 Label 3 Mean Num 8 BEST12. Mean 4 N Num 8 BEST5. N 5 StdDev Num 8 BEST12. Std Dev 6 StdError Num 8 BEST12. Std Error 7 response_var Char 3 Variable 8 response_label Char 15 Label PROC MEANS Contents of Final Summary Data Set

110 Attributes after Appending to BASE Data Set PROC CONTENTS(abbreviated) # Variable Type Len Format Label ----------------------------------------------------------------------------- 1 key_var Char 32 Name of Independent Variable 2 key_label Char 40 Label of Independent Variable 3 Mean Num 8 BEST12. PROC MEANS: Mean 4 N Num 8 BEST5. PROC MEANS: N 5 StdDev Num 8 BEST12. PROC MEANS: Standard Deviation 6 StdError Num 8 BEST12. PROC MEANS: Standard Error 7 7 response_var Char 32 Name of Response Variable 8 response_label Char 40 Label of Response Variable

111 PROC MEANS PROC MEANS (macrotize) %MACRO procmeans(data= var1= var2= ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT summary=summary_means DROP (DROP=bmi: ) RENAME RENAME=(vname_bmi =response_var label_bmi =response_label vname_years_on_farm =key_var label_years_on_farm =key_label years_on_farm_mean =mean years_on_farm_n =n years_on_farm_stderr=stderror years_on_farm_stddev=stddev )); ; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm bmi ; VAR years_on_farm bmi ; RUN; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; %MEND procmeans; %MACRO procmeans(data= var1= var2= ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT summary=summary_means DROP (DROP=bmi: ) RENAME RENAME=(vname_bmi =response_var label_bmi =response_label vname_years_on_farm =key_var label_years_on_farm =key_label years_on_farm_mean =mean years_on_farm_n =n years_on_farm_stderr=stderror years_on_farm_stddev=stddev )); ; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm bmi ; VAR years_on_farm bmi ; RUN; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; %MEND procmeans;

112 PROC MEANS (macrotize) %MACRO procmeans(data= var1= var2= ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT summary=summary_means DROP=&var1 (DROP=&var1:) RENAME_&var1 =response_var RENAME=(vname_&var1 =response_var label_&var1 =response_label label_&var1 =response_label vname_&var2 =key_var vname_&var2 =key_var label_&var2 =key_label label_&var2 =key_label &var2._mean =mean &var2._mean =mean &var2._n =n &var2._n =n &var2._stderr =stderror &var2._stderr =stderror &var2._ &var2._stddev =stddev )); ; PROC MEANS DATA &data MEAN N STDERR STD; PROC MEANS DATA = &data MEAN N STDERR STD; VAR &var2 &var1; VAR &var2 &var1; RUN; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; %MEND procmeans; %MACRO procmeans(data= var1= var2= ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT summary=summary_means DROP=&var1 (DROP=&var1:) RENAME_&var1 =response_var RENAME=(vname_&var1 =response_var label_&var1 =response_label label_&var1 =response_label vname_&var2 =key_var vname_&var2 =key_var label_&var2 =key_label label_&var2 =key_label &var2._mean =mean &var2._mean =mean &var2._n =n &var2._n =n &var2._stderr =stderror &var2._stderr =stderror &var2._ &var2._stddev =stddev )); ; PROC MEANS DATA &data MEAN N STDERR STD; PROC MEANS DATA = &data MEAN N STDERR STD; VAR &var2 &var1; VAR &var2 &var1; RUN; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; %MEND procmeans;

113 PROC MEANS (macrotize) %MACRO %MACRO procmeans(data= var1= var2= ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT summary=summary_means DROP (DROP=&var1:) RENAME =response_var RENAME=(vname_&var1 =response_var label =response_label label_&var1 =response_label vname_&var2 =key_var vname_&var2 =key_var label_&var2 =key_label label_&var2 =key_label &var2._mean =mean &var2._mean =mean &var2._n =n &var2._n =n &var2._stderr =stderror &var2._stderr =stderror &var2._stddev &var2._stddev =stddev )); ; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = &data MEAN N STDERR STD; VAR ; VAR &var2 &var1; RUN; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procmeans; %MACRO %MACRO procmeans(data= var1= var2= ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT summary=summary_means DROP (DROP=&var1:) RENAME =response_var RENAME=(vname_&var1 =response_var label =response_label label_&var1 =response_label vname_&var2 =key_var vname_&var2 =key_var label_&var2 =key_label label_&var2 =key_label &var2._mean =mean &var2._mean =mean &var2._n =n &var2._n =n &var2._stderr =stderror &var2._stderr =stderror &var2._stddev &var2._stddev =stddev )); ; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = &data MEAN N STDERR STD; VAR ; VAR &var2 &var1; RUN; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procmeans;

114 PROC MEANS (macrotize) %MACRO %MACRO procmeans(data= var1= var2= ); ODS LISTING CLOSE ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT summary=summary_means DROP (DROP=&var1:) RENAME RENAME=(vname_&var1 =response_var label_&var1 =response_label vname_&var2 =key_var label_&var2 =key_label &var2._mean =mean &var2._n =n &var2._stderr =stderror &var2._stddev =stddev )); ; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = &data MEAN N STDERR STD; VAR ; VAR &var2 &var1; RUN; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING ODS LISTING; MEND %MEND procmeans; %MACRO %MACRO procmeans(data= var1= var2= ); ODS LISTING CLOSE ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT summary=summary_means DROP (DROP=&var1:) RENAME RENAME=(vname_&var1 =response_var label_&var1 =response_label vname_&var2 =key_var label_&var2 =key_label &var2._mean =mean &var2._n =n &var2._stderr =stderror &var2._stddev =stddev )); ; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = &data MEAN N STDERR STD; VAR ; VAR &var2 &var1; RUN; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING ODS LISTING; MEND %MEND procmeans;

115 PROC MEANS (invoke) %MACRO%procmeans(data = mydata var1 = bmi var2 = years_on_farm ); ODS LISTING CLOSE; ODS OUTPUT summary=summary_means (DROP=&var1:) RENAME=(vname_&var1 =response_va %procmeans(data = mydata var1 = bmi var2 = years_on_farm ); &var2._mean =mean &var2._n =n &var2._stderr =stderror &var2._stddev =stddev )); ; PROC MEANS DATA = &data MEAN N STDERR STD; VAR &var2 &var1; RUN; ODS OUTPUT CLOSE; ODS LISTING; %MEND procmeans; %MACRO%procmeans(data = mydata var1 = bmi var2 = years_on_farm ); ODS LISTING CLOSE; ODS OUTPUT summary=summary_means (DROP=&var1:) RENAME=(vname_&var1 =response_va %procmeans(data = mydata var1 = bmi var2 = years_on_farm ); &var2._mean =mean &var2._n =n &var2._stderr =stderror &var2._stddev =stddev )); ; PROC MEANS DATA = &data MEAN N STDERR STD; VAR &var2 &var1; RUN; ODS OUTPUT CLOSE; ODS LISTING; %MEND procmeans;

116 PROC MEANS Contents after Appending PROC CONTENTS(abbreviated) # Variable Type Len Format Label ----------------------------------------------------------------------------- 1 key_var Char 32 Name of Independent Variable 2 key_label Char 40 Label of Independent Variable 3 Mean Num 8 BEST12. PROC MEANS: Mean 4 N Num 8 BEST5. PROC MEANS: N 5 StdDev Num 8 BEST12. PROC MEANS: Standard Deviation 6 StdError Num 8 BEST12. PROC MEANS: Standard Error 7 7 response_var Char 32 Name of Response Variable 8 response_label Char 40 Label of Response Variable

117 Create a Data Set with Crude Model Estimates And Standard Errors

118 %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates=summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROCGLMDATA PROC GLM DATA=mydata; MODEL MODEL bmi = years_on_farm; QUIT QUIT; ODS LISTING; %MEND procglm; %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates=summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROCGLMDATA PROC GLM DATA=mydata; MODEL MODEL bmi = years_on_farm; QUIT QUIT; ODS LISTING; %MEND procglm; PROC GLM PROC GLM(macrotize)

119 %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates=summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA&data PROC GLM DATA=&data; MODEL&response&independent MODEL &response = &independent ; QUIT QUIT; ODS OUTPUT CLOSE; %MEND procglm; %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates=summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA&data PROC GLM DATA=&data; MODEL&response&independent MODEL &response = &independent ; QUIT QUIT; ODS OUTPUT CLOSE; %MEND procglm; PROC GLM(macrotize)

120 MACRO %MACRO procglm (data =, response =, independent = ); independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates=summary_glm; (DROP = dependent probt tvalue RENAME = (Parameter = Key_var = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; MODEL&response = &independent MODEL &response = &independent ; QUIT QUIT; ODS LISTING; MEND %MEND procglm; MACRO %MACRO procglm (data =, response =, independent = ); independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates=summary_glm; (DROP = dependent probt tvalue RENAME = (Parameter = Key_var = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; MODEL&response = &independent MODEL &response = &independent ; QUIT QUIT; ODS LISTING; MEND %MEND procglm; PROC GLM(macrotize)

121 MACRO %MACRO procglm (data =, response =, independent = ); independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUTsummary_glm ODS OUTPUT parameterestimates=summary_glm; (DROP = dependent probt tvalue RENAME = (Parameter = Key_var = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; MODEL&response = &independent MODEL &response = &independent ; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; MEND %MEND procglm; MACRO %MACRO procglm (data =, response =, independent = ); independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUTsummary_glm ODS OUTPUT parameterestimates=summary_glm; (DROP = dependent probt tvalue RENAME = (Parameter = Key_var = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; MODEL&response = &independent MODEL &response = &independent ; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; MEND %MEND procglm; Route Output to a SAS Data Set

122 %MACRO procglm (data =, response =, independent = ); independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates=summary_glm; %procglm (data = mydata, response = bmi, independent = years_on_farm); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA=&data; MODEL &response = &independent ; QUIT; ODS OUTPUT CLOSE; %MEND procglm; %MACRO procglm (data =, response =, independent = ); independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates=summary_glm; %procglm (data = mydata, response = bmi, independent = years_on_farm); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA=&data; MODEL &response = &independent ; QUIT; ODS OUTPUT CLOSE; %MEND procglm; Invoke the PROCGLM( ) Module

123 PROC PRINT of the Data Set SUMMARY_GLM Obs Dependent Parameter Estimate StdErr tValue Probt 1 bmi Intercept 25.039 0.0463 540.68 <.0001 2 bmi years_on_farm 0.0299 0.0011 26.37 <.0001

124 PROC PRINT of the Data Set SUMMARY_GLM Remove Unwanted information Obs Dependent Parameter Estimate StdErr tValue Probt 1 bmi Intercept 25.039 0.0463 540.68 <.0001 2 bmi years_on_farm 0.0299 0.0011 26.37 <.0001

125 PROC PRINT of the Data Set SUMMARY_GLM Remove Unwanted information Obs Parameter Estimate StdErr 1 Intercept 25.039 0.0463 2 years_on_farm 0.0299 0.0011

126 PROC PRINT of the Data Set SUMMARY_GLM Keep Only the Row for years_on_farm Obs Parameter Estimate StdErr 1 Intercept 25.039 0.0463 2 years_on_farm 0.0299 0.0011

127 PROC PRINT of the Data Set SUMMARY_GLM Keep Only the Row for years_on_farm Obs Parameter Estimate StdErr 2 years_on_farm 0.0299 0.0011

128 PROC PRINT of the Data Set SUMMARY_GLM Create the key_var Obs Parameter Estimate StdErr 2 years_on_farm 0.0299 0.0011

129 PROC PRINT of the Data Set SUMMARY_GLM Create the key_var Obs key_var Estimate StdErr 2 years_on_farm 0.0299 0.0011

130 MACRO %MACRO procglm (data =, response =, independent = ); independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm; (DROP = dependent probt tvalue RENAME = (Parameter = Key_var = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; MODEL&response = &independent MODEL &response = &independent ; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm; MACRO %MACRO procglm (data =, response =, independent = ); independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm; (DROP = dependent probt tvalue RENAME = (Parameter = Key_var = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; MODEL&response = &independent MODEL &response = &independent ; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm;

131 MACRO %MACRO procglm (data =, response =, independent = ); independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm DROPdependent probt tvalue (DROP = dependent probt tvalue); RENAME = (Parameter = Key_var = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; MODEL MODEL &response = &independent ; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm; MACRO %MACRO procglm (data =, response =, independent = ); independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm DROPdependent probt tvalue (DROP = dependent probt tvalue); RENAME = (Parameter = Key_var = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; MODEL MODEL &response = &independent ; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm;

132 MACRO %MACRO procglm (data =, response =, independent = ); independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var)); = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; MODEL MODEL &response = &independent ; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm; MACRO %MACRO procglm (data =, response =, independent = ); independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var)); = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; MODEL MODEL &response = &independent ; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm;

133 MACRO %MACRO procglm (data =, response =, independent = ); independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; MODEL MODEL &response = &independent ; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm; MACRO %MACRO procglm (data =, response =, independent = ); independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; MODEL MODEL &response = &independent ; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm;

134 Create a Data Set with Adjusted Model Estimates And Standard Errors

135 MACRO %MACRO procglm (data =, response =, independent = ); class_vars =,independent =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; MODEL MODEL &response = &independent ; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm; MACRO %MACRO procglm (data =, response =, independent = ); class_vars =,independent =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; MODEL MODEL &response = &independent ; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm;

136 MACRO %MACRO procglm (data =, response =, independent =, class_vars class_vars =,independent =, continuous_vars continuous_vars = ); continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; MODEL MODEL &response = &independent ; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm; MACRO %MACRO procglm (data =, response =, independent =, class_vars class_vars =,independent =, continuous_vars continuous_vars = ); continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; MODEL MODEL &response = &independent ; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm;

137 MACRO %MACRO procglm (data =, response =, independent =, class_vars =,independent =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; CLASS&class_vars CLASS &class_vars; MODEL&class_vars &continuous_vars MODEL &response = &independent &class_vars &continuous_vars; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm; MACRO %MACRO procglm (data =, response =, independent =, class_vars =,independent =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; CLASS&class_vars CLASS &class_vars; MODEL&class_vars &continuous_vars MODEL &response = &independent &class_vars &continuous_vars; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm;

138 response =, independent = ); independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates=summary_glm; %procglm (data = mydata, response = bmi, independent = years_on_farm, class_vars = race gender, continuous_vars = age height); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA=&data; MODEL &response = &independent ; QUIT; %MEND procglm; response =, independent = ); independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates=summary_glm; %procglm (data = mydata, response = bmi, independent = years_on_farm, class_vars = race gender, continuous_vars = age height); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA=&data; MODEL &response = &independent ; QUIT; %MEND procglm; Invoke the PROCGLM( ) Module

139 PROC PRINT of the Data Set SUMMARY_GLM Obs Dependent Parameter Estimate StdErr tValue Probt 1 bmi Intercept 38.036 0.8723 43.60 <.0001 2 bmi age 0.0278 0.0028 9.84 <.0001 3 bmi height -0.170 0.0107 -15.78 <.0001 4 bmi race 0.8533 0.1202 7.09 <.0001 5 bmi gender -2.078 0.1013 -20.50 <.0001 6 bmi years_on_farm 0.0139 0.0019 7.17 <.0001

140 PROC PRINT of the Data Set SUMMARY_GLM Obs Parameter Estimate StdErr 1 Intercept 38.036 0.8723 2 age 0.0278 0.0028 3 height -0.170 0.0107 4 race 0.8533 0.1202 5 gender -2.078 0.1013 6 years_on_farm 0.0139 0.0019

141 Final Version of the Data Set SUMMARY_GLM Obs Parameter Estimate StdErr 6 years_on_farm 0.0139 0.0019

142 Final Version of the Data Set SUMMARY_GLM Obs key_var Estimate StdErr 6 years_on_farm 0.0139 0.0019

143 Two Versions of SUMMARY_GLM Obs key_var Estimate StdErr 6 years_on_farm 0.0139 0.0019

144 Adjusted_ Adjusted_ Obs key_var Estimate StdErr 6 years_on_farm 0.0139 0.0019 SUMMARY_CRUDE_GLMSUMMARY_ADJUSTED_GLM

145 Crude_ Crude_ Obs key_var Estimate StdErr 2 years_on_farm 0.0299 0.0011 Adjusted_ Adjusted_ Obs key_var Estimate StdErr 6 years_on_farm 0.0139 0.0019SUMMARY_CRUDE_GLMSUMMARY_ADJUSTED_GLM

146 MACRO %MACRO procglm (data =, response =, independent =, class_vars =,independent =, continuous_vars = ); test = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; CLASS&class_vars CLASS &class_vars; MODEL&class_vars &continuous_vars MODEL &response = &independent &class_vars &continuous_vars; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm; MACRO %MACRO procglm (data =, response =, independent =, class_vars =,independent =, continuous_vars = ); test = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; CLASS&class_vars CLASS &class_vars; MODEL&class_vars &continuous_vars MODEL &response = &independent &class_vars &continuous_vars; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm;

147 MACRO %MACRO procglm (data =, response =, independent =, class_vars =,independent =, continuous_vars =, test test = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; CLASS&class_vars CLASS &class_vars; MODEL&class_vars &continuous_vars MODEL &response = &independent &class_vars &continuous_vars; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm; MACRO %MACRO procglm (data =, response =, independent =, class_vars =,independent =, continuous_vars =, test test = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT parameterestimates=summary_glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; CLASS&class_vars CLASS &class_vars; MODEL&class_vars &continuous_vars MODEL &response = &independent &class_vars &continuous_vars; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm;

148 MACRO %MACRO procglm (data =, response =, independent =, class_vars =,independent =, continuous_vars =, test test = ); ODS LISTING CLOSE; ODS OUTPUT_&test ODS OUTPUT parameterestimates=summary_&test._glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var Estimate = &test._estimate StdErr = &test._stderr StdErr = &test._stderr) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; CLASS&class_vars CLASS &class_vars; MODEL&class_vars &continuous_vars MODEL &response = &independent &class_vars &continuous_vars; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm; MACRO %MACRO procglm (data =, response =, independent =, class_vars =,independent =, continuous_vars =, test test = ); ODS LISTING CLOSE; ODS OUTPUT_&test ODS OUTPUT parameterestimates=summary_&test._glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var Estimate = &test._estimate StdErr = &test._stderr StdErr = &test._stderr) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; CLASS&class_vars CLASS &class_vars; MODEL&class_vars &continuous_vars MODEL &response = &independent &class_vars &continuous_vars; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm;

149 %procglm (data = mydata, response = bmi, independent = years_on_farm, test = crude) ODS LISTING CLOSE; ODS OUTPUT parameterestimates=summary_glm; %procglm (data = mydata, response = bmi, independent = years_on_farm, class_vars = race gender, continuous_vars = age height, test = adjusted); stderr = stderr) PROC GLM DATA=&data; MODEL &response = &independent ; QUIT; %procglm (data = mydata, response = bmi, independent = years_on_farm, test = crude) ODS LISTING CLOSE; ODS OUTPUT parameterestimates=summary_glm; %procglm (data = mydata, response = bmi, independent = years_on_farm, class_vars = race gender, continuous_vars = age height, test = adjusted); stderr = stderr) PROC GLM DATA=&data; MODEL &response = &independent ; QUIT; Two Invocations of PROCGLM( )

150 Crude_ Crude_ Obs key_var Estimate StdErr 2 years_on_farm 0.0299 0.0011 Adjusted_ Adjusted_ Obs key_var Estimate StdErr 6 years_on_farm 0.0139 0.0019SUMMARY_CRUDE_GLMSUMMARY_ADJUSTED_GLM

151 MACRO %MACRO procglm (data =, response =, independent =, class_vars =,independent =, continuous_vars =, test test = ); ODS LISTING CLOSE; ODS OUTPUT_&test ODS OUTPUT parameterestimates=summary_&test._glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var Estimate = &test._estimate StdErr = &test._stderr StdErr = &test._stderr) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; CLASS &class_vars CLASS &class_vars; MODEL&class_vars &continuous_vars MODEL &response = &independent &class_vars &continuous_vars; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm; MACRO %MACRO procglm (data =, response =, independent =, class_vars =,independent =, continuous_vars =, test test = ); ODS LISTING CLOSE; ODS OUTPUT_&test ODS OUTPUT parameterestimates=summary_&test._glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var Estimate = &test._estimate StdErr = &test._stderr StdErr = &test._stderr) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; CLASS &class_vars CLASS &class_vars; MODEL&class_vars &continuous_vars MODEL &response = &independent &class_vars &continuous_vars; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; MEND %MEND procglm;

152 MACRO %MACRO procglm (data =, response =, independent =, class_vars =,independent =, continuous_vars =, test test = ); ODS LISTING CLOSE ODS LISTING CLOSE; ODS OUTPUT_&test ODS OUTPUT parameterestimates=summary_&test._glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var Estimate = &test._estimate StdErr = &test._stderr StdErr = &test._stderr) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; CLASS&class_vars CLASS &class_vars; MODEL&class_vars &continuous_vars MODEL &response = &independent &class_vars &continuous_vars; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING ODS LISTING; MEND %MEND procglm; MACRO %MACRO procglm (data =, response =, independent =, class_vars =,independent =, continuous_vars =, test test = ); ODS LISTING CLOSE ODS LISTING CLOSE; ODS OUTPUT_&test ODS OUTPUT parameterestimates=summary_&test._glm DROP (DROP = dependent probt tvalue RENAMEKey_var RENAME = (Parameter = Key_var Estimate = &test._estimate StdErr = &test._stderr StdErr = &test._stderr) WHEREUPCASE(key_var)=UPCASE("&independent") = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATA PROC GLM DATA=&data; CLASS&class_vars CLASS &class_vars; MODEL&class_vars &continuous_vars MODEL &response = &independent &class_vars &continuous_vars; QUIT QUIT; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING ODS LISTING; MEND %MEND procglm;

153 Crude_ Crude_ key_var Estimate StdErr years_on_farm 0.0299 0.0011 Adjusted_ Adjusted_ key_var Estimate StdErr years_on_farm 0.0139 0.0019 SUMMARY_MEANSSUMMARY_CRUDE_GLMSUMMARY_ADJUSTED_GLM

154 Crude_ Crude_ key_var Estimate StdErr years_on_farm 0.0299 0.0011 Adjusted_ Adjusted_ key_var Estimate StdErr years_on_farm 0.0139 0.0019SUMMARY_MEANSSUMMARY_CRUDE_GLMSUMMARY_ADJUSTED_GLM key_var response_var mean n stderr stddev years_on_farm bmi 36.213 53482 0.079 18.259

155 Crude_ Crude_ key_var Estimate StdErr years_on_farm 0.0299 0.0011 Adjusted_ Adjusted_ key_var Estimate StdErr years_on_farm 0.0139 0.0019SUMMARY_MEANSSUMMARY_CRUDE_GLMSUMMARY_ADJUSTED_GLM key_var response_var mean n stderr stddev years_on_farm bmi 36.213 53482 0.079 18.259

156 SUMMARYSET( ) macro module Merge these three datasets into a composite summary dataset

157 %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE "SUMMARY_"; QUIT ; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE "SUMMARY_"; QUIT ; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE "SUMMARY_"; QUIT ; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE "SUMMARY_"; QUIT ; SUMMARYSET( ) macro module

158 %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i dsets; %LET dsets = SUMMARY_MEANS SUMMARY_CRUDE_GLM SUMMARY_ADJUSTED_GLM; %LET dsets = SUMMARY_MEANS SUMMARY_CRUDE_GLM SUMMARY_ADJUSTED_GLM; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE "SUMMARY_"; QUIT ; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i dsets; %LET dsets = SUMMARY_MEANS SUMMARY_CRUDE_GLM SUMMARY_ADJUSTED_GLM; %LET dsets = SUMMARY_MEANS SUMMARY_CRUDE_GLM SUMMARY_ADJUSTED_GLM; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE "SUMMARY_"; QUIT ; SUMMARYSET( ) macro module

159 %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; SUMMARYSET( ) macro module

160 MACRO %MACRO summaryset(setlist = ); base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; MACRO %MACRO summaryset(setlist = ); base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; SUMMARYSET( ) macro module

161 MACRO %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; ; MACRO %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; ; SUMMARYSET( ) macro module

162 MACRO %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; MACRO %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; SUMMARYSET( ) macro module

163 MACRO %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); MACRO %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); SUMMARYSET( ) macro module

164 MACRO %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); MACRO %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); SUMMARYSET( ) macro module

165 base =, setlist =, delsets =, class_vars =, continuous_vars = ); LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; base =, setlist =, delsets =, class_vars =, continuous_vars = ); LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; SUMMARYSET( ) macro module

166 setlist =, delsets =, class_vars =, continuous_vars = ); LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; setlist =, delsets =, class_vars =, continuous_vars = ); LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; SUMMARYSET( ) macro module

167 delsets =, class_vars =, continuous_vars = ); LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); delsets =, class_vars =, continuous_vars = ); LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); SUMMARYSET( ) macro module

168 class_vars =, continuous_vars = ); LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; class_vars =, continuous_vars = ); LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; SUMMARYSET( ) macro module

169 continuous_vars = ); LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; continuous_vars = ); LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; SUMMARYSET( ) macro module

170 LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; LOCAL %LOCAL i dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; SUMMARYSET( ) macro module

171 PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; SUMMARYSET( ) macro module

172 PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; SUMMARYSET( ) macro module

173 SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; SUMMARYSET( ) macro module

174 INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND INTO :dsets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; SUMMARYSET( ) macro module

175 FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; SUMMARYSET( ) macro module

176 WHERE LIBNAME = "WORK" AND WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; WHERE LIBNAME = "WORK" AND WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; SUMMARYSET( ) macro module

177 MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; SUMMARYSET( ) macro module

178 MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY&merge_var BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY&merge_var BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; Sort the 3 Summary Sets by key_var

179 MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY&merge_var BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY&merge_var BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; Merge the 3 Summary Sets by key_var

180 MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; MEMNAME LIKE UPCASE("&setlist%"); QUIT; MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; SUMMARYSET( ) macro module

181 QUIT; QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; QUIT; QUIT ; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; SUMMARYSET( ) macro module

182 %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; SUMMARYSET( ) macro module

183 %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; %LET i= 1; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; SUMMARYSET( ) macro module

184 %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; SUMMARYSET( ) macro module

185 %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; %DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( )))); PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; SUMMARYSET( ) macro module

186 PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; PROC SORT DATASCANSTR PROC SORT DATA=%SCAN(&dsets,&i, %STR( )); BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; SUMMARYSET( ) macro module

187 BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; BY BY &merge_var; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; SUMMARYSET( ) macro module

188 RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; RUN RUN; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; SUMMARYSET( ) macro module

189 %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; %LET i = %EVAL(&i+1); %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; SUMMARYSET( ) macro module

190 %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; %END; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; SUMMARYSET( ) macro module

191 DATA &setlist; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; DATA &setlist; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; SUMMARYSET( ) macro module

192 DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; Append the SUMMARY_ Data Set

193 DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; To the GLM_SUMMARY Data Set

194 DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; Remove all Temporary Data Sets

195 DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT QUIT; MEND %MEND summaryset; New to SAS Version 9.2

196 The CONTENTS Procedure (abbreviated) Data Set Name WORK.GLM_SUMMARY Observations 1 # Variable Type Len Format Label 1 key_var Char 32 Name of Independent Variable 2 response_var Char 32 Name of Response Variable 3 key_label Char 40 Label of Independent Variable 4 response_label Char 40 Label of Response Variable 5 class_vars Char 200 Adjusted PROC GLM: Class covariates 6 continuous_vars Char 200 Adjusted PROC GLM: Continuous covariates 7 mean Num 8 PROC MEANS: Mean of Independent Variable 8 stddev Num 8 PROC MEANS: Standard Deviation of Independent Variable 9 stderror Num 8 PROC MEANS: Standard Error of Independent Variable 10 n Num 8 PROC MEANS: N of Independent Variable 11 crude_estimate Num 8 PVALUE6.4 Crude PROC GLM: Parameter Estimate 12 adjusted_estimate Num 8 PVALUE6.4 Adjusted PROC GLM: Parameter Estimate 13 crude_stderr Num 8 ODDSR8.3 Crude PROC GLM: Standard Error of Estimate 14 adjusted_stderr Num 8 ODDSR8.3 Adjusted PROC GLM: Standard Error of Estimate Populate the GLM_SUMMARY Data Set

197 These four macros perform primary main tasks for creating a summary data set.

198 Three secondary main tasks which support these primary tasks.

199 Validate the user information passed into the supervisory macroValidate the user information passed into the supervisory macro Three secondary main tasks which support these primary main tasks.

200 Validate the user information passed into the supervisory macroValidate the user information passed into the supervisory macro Identify covariates as either Class or Continuous.Identify covariates as either Class or Continuous. Three secondary main tasks which support these primary main tasks.

201 Validate the user information passed into the supervisory macroValidate the user information passed into the supervisory macro Identify covariates as either Class or Continuous.Identify covariates as either Class or Continuous. Create an analysis data set.Create an analysis data set. Three secondary main tasks which support these primary main tasks.

202 VALIDATE( ) Macro Module Perform checks on the user supplied parameters 1.Is the input dataset specified. 2.Does the input dataset exist. 3.Is the response variable specified. 4.Does response variable exist within user supplied dataset. 5.Is the response variable numeric. 6.Is the independent variable of interest specified. 7.Does independent variable exist within user supplied dataset. 8.Is the independent variable numeric. 9.Do all base co-variables exist within user supplied dataset. 10.Are each of the base model co-variables numeric. 11.Is the final output dataset specified.

203 VALIDATE( ) Macro Module Perform checks on the user supplied parameters 1. Is the input dataset specified. 2. Does the input dataset exist. 3. Is the response variable specified. 4. Does response variable exist within user supplied dataset. 5. Is the response variable numeric. 6. Is the independent variable of interest specified. 7. Does independent variable exist within user supplied dataset. 8. Is the independent variable numeric. 9. Do all base co-variables exist within user supplied dataset. 10. Are each of the base model co-variables numeric. 11. Is the final output dataset specified.

204 VALIDATE( ) Macro Module %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; MEND %MEND validate; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; MEND %MEND validate;

205 VALIDATE( ) Macro Module %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %LOCAL _echeck; %GLOBAL _echeck ; LET %LET echeck=1; MEND %MEND validate; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %LOCAL _echeck; %GLOBAL _echeck ; LET %LET echeck=1; MEND %MEND validate;

206 VALIDATE( ) Macro Module %validate(data = &dataset, var1 = &response, var1 = &response, var2 = &independent, var2 = &independent, covariates = &covariates, covariates = &covariates, outfile = &outfile ) outfile = &outfile ) %IF &echeck = 1 %THEN %RETURN; %IF &echeck = 1 %THEN %RETURN; %validate(data = &dataset, var1 = &response, var1 = &response, var2 = &independent, var2 = &independent, covariates = &covariates, covariates = &covariates, outfile = &outfile ) outfile = &outfile ) %IF &echeck = 1 %THEN %RETURN; %IF &echeck = 1 %THEN %RETURN;

207 SPLIT( ) Macro Module Co-variables to appear in the adjusted PROC LOGISTIC

208 SPLIT( ) Macro Module No SAS code is generated.

209 SPLIT( ) Macro Module No SAS code is generated. Design a User Define Macro Function.

210 SPLIT( ) Macro Module No SAS code is generated. Design a User Define Macro Function. Returns a text string.

211 SPLIT( ) Macro Function Co-variables to appear in the adjusted PROC GLM &covariates = @height @age race gender &covariates = @height @age race gender

212 SPLIT( ) Macro Function Co-variables to appear in the adjusted PROC GLM &covariates = @height @age race gender &covariates = @height @age race gender Categorical variables: appear in CLASS & MODEL statementCategorical variables: appear in CLASS & MODEL statement

213 SPLIT( ) Macro Function Co-variables to appear in the adjusted PROC GLM &covariates = @height @age race gender &covariates = @height @age race gender Categorical variables: appear in CLASS & MODEL statementCategorical variables: appear in CLASS & MODEL statement Continuous variables: appear only in the MODEL statementContinuous variables: appear only in the MODEL statement

214 SPLIT( ) Macro Function &covariates = @height @age race gender

215 SPLIT( ) Macro Function &covariates = @height @age race gender %LET continuous_vars = %split(vars = &covariates, control = @); %LET class_vars = %split(vars = &covariates );

216 SPLIT( ) Macro Function &covariates = @height @age race gender %LET continuous_vars = height age; %LET class_vars = race gender;

217 %MACRO %MACRO split(vars=, control=); %LOCAL %LOCAL count varlist chars; %IFNE %THEN %DO %IF &vars NE %THEN %DO; %IFNE %THEN %DO %IF &control NE %THEN %DO; %LET %LET count=1 ; %DO %UNTIL%QSCAN %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET%QSCAN %LET var = %QSCAN(&vars,&count); %IF %SUBSTR%THEN %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNCCOMPRESS%QSCAN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)); %LET%EVAL %LET count = %EVAL(&count+1); %END %END ; %END; %END; %ELSE %DO %ELSE %DO; %LET %LET count=1 ; %DO %UNTIL%QSCAN %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET%QSCAN %LET var = %QSCAN(&vars,&count); %IF %INDEX %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE%SUBSTRNE%THEN %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET%EVAL %LET count = %EVAL(&count+1); %END %END; %MEND %MEND split; %MACRO %MACRO split(vars=, control=); %LOCAL %LOCAL count varlist chars; %IFNE %THEN %DO %IF &vars NE %THEN %DO; %IFNE %THEN %DO %IF &control NE %THEN %DO; %LET %LET count=1 ; %DO %UNTIL%QSCAN %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET%QSCAN %LET var = %QSCAN(&vars,&count); %IF %SUBSTR%THEN %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNCCOMPRESS%QSCAN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)); %LET%EVAL %LET count = %EVAL(&count+1); %END %END ; %END; %END; %ELSE %DO %ELSE %DO; %LET %LET count=1 ; %DO %UNTIL%QSCAN %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET%QSCAN %LET var = %QSCAN(&vars,&count); %IF %INDEX %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE%SUBSTRNE%THEN %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET%EVAL %LET count = %EVAL(&count+1); %END %END; %MEND %MEND split;

218 %MACRO %MACRO split(vars=, control=); %LOCAL %LOCAL count varlist chars; %IFNE %THEN %DO %IF &vars NE %THEN %DO; %IFNE %THEN %DO %IF &control NE %THEN %DO; %LET %LET count=1 ; %DO %UNTIL%QSCAN %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET%QSCAN %LET var = %QSCAN(&vars,&count); %IF %SUBSTR%THEN %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)); %LET%EVAL %LET count = %EVAL(&count+1); %END %END ; %END; %END; %ELSE %DO %ELSE %DO; %LET %LET count=1 ; %DO %UNTIL%QSCAN %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET%QSCAN %LET var = %QSCAN(&vars,&count); %IF %INDEX %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE%SUBSTRNE%THEN %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET%EVAL %LET count = %EVAL(&count+1); %END %END; %MEND %MEND split; %MACRO %MACRO split(vars=, control=); %LOCAL %LOCAL count varlist chars; %IFNE %THEN %DO %IF &vars NE %THEN %DO; %IFNE %THEN %DO %IF &control NE %THEN %DO; %LET %LET count=1 ; %DO %UNTIL%QSCAN %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET%QSCAN %LET var = %QSCAN(&vars,&count); %IF %SUBSTR%THEN %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)); %LET%EVAL %LET count = %EVAL(&count+1); %END %END ; %END; %END; %ELSE %DO %ELSE %DO; %LET %LET count=1 ; %DO %UNTIL%QSCAN %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET%QSCAN %LET var = %QSCAN(&vars,&count); %IF %INDEX %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE%SUBSTRNE%THEN %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET%EVAL %LET count = %EVAL(&count+1); %END %END; %MEND %MEND split;

219 %MACRO %MACRO split(vars=, control=); %LOCAL %LOCAL count varlist chars; %IFNE %THEN %DO %IF &vars NE %THEN %DO; %IFNE %THEN %DO %IF &control NE %THEN %DO; %LET %LET count=1 ; %DO %UNTIL%QSCAN %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET%QSCAN %LET var = %QSCAN(&vars,&count); %IF %SUBSTR%THEN %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNCCOMPRESS%QSCAN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)); %LET%EVAL %LET count = %EVAL(&count+1); %END %END ; %END; %END; %ELSE %DO %ELSE %DO; %LET %LET count=1 ; %DO %UNTIL%QSCAN %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET%QSCAN %LET var = %QSCAN(&vars,&count); %IF %INDEX %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE%SUBSTRNE%THEN %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET%EVAL %LET count = %EVAL(&count+1); %END %END; %MEND %MEND split; %MACRO %MACRO split(vars=, control=); %LOCAL %LOCAL count varlist chars; %IFNE %THEN %DO %IF &vars NE %THEN %DO; %IFNE %THEN %DO %IF &control NE %THEN %DO; %LET %LET count=1 ; %DO %UNTIL%QSCAN %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET%QSCAN %LET var = %QSCAN(&vars,&count); %IF %SUBSTR%THEN %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNCCOMPRESS%QSCAN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)); %LET%EVAL %LET count = %EVAL(&count+1); %END %END ; %END; %END; %ELSE %DO %ELSE %DO; %LET %LET count=1 ; %DO %UNTIL%QSCAN %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET%QSCAN %LET var = %QSCAN(&vars,&count); %IF %INDEX %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE%SUBSTRNE%THEN %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET%EVAL %LET count = %EVAL(&count+1); %END %END; %MEND %MEND split;

220 ANALYSISSET( ) Macro Module Create an analysis dataset that can be uniformly processed by all three procedures

221 ANALYSISSET( ) Macro Module %MACRO makeset(__dset =, __var1 =, __var2 =, __variables = ) ; DATAanalysis_set DATA analysis_set ; SETKEEP SET &data (KEEP = &var1 &var2 &variables); IFNMISSOF_numeric_) IF NMISS(OF _numeric_) = 0 ; RUN RUN; %MEND makeset; %MACRO makeset(__dset =, __var1 =, __var2 =, __variables = ) ; DATAanalysis_set DATA analysis_set ; SETKEEP SET &data (KEEP = &var1 &var2 &variables); IFNMISSOF_numeric_) IF NMISS(OF _numeric_) = 0 ; RUN RUN; %MEND makeset;

222 ANALYSISSET( ) Macro Module %MACRO makeset(__dset =, __var1 =, __var2 =, __variables = ) ; DATAanalysis_set DATA analysis_set ; SETKEEP&var1 &var2 &variables SET &data (KEEP = &var1 &var2 &variables); IFNMISSOF_numeric_) IF NMISS(OF _numeric_) = 0 ; RUN RUN; %MEND makeset; %MACRO makeset(__dset =, __var1 =, __var2 =, __variables = ) ; DATAanalysis_set DATA analysis_set ; SETKEEP&var1 &var2 &variables SET &data (KEEP = &var1 &var2 &variables); IFNMISSOF_numeric_) IF NMISS(OF _numeric_) = 0 ; RUN RUN; %MEND makeset;

223 ANALYSISSET( ) Macro Module %MACRO makeset(__dset =, __var1 =, __var2 =, __variables = ) ; DATAanalysis_set DATA analysis_set ; SETKEEP&var1 &var2 &variables SET &data (KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 ; RUN RUN; %MEND makeset; %MACRO makeset(__dset =, __var1 =, __var2 =, __variables = ) ; DATAanalysis_set DATA analysis_set ; SETKEEP&var1 &var2 &variables SET &data (KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 ; RUN RUN; %MEND makeset;

224 ANALYSISSET( ) Macro Module MACRO %MACRO analysisset(data =, var1 =, var2 =, variables = ) ; DATAanalysis_set DATA analysis_set ; SETKEEP&var1 &var2 &variables SET &data (KEEP = &var1 &var2 &variables); NMISS(OF _numeric_) = 0 ; IF NMISS(OF _numeric_) = 0 ; RUN RUN; MEND %MEND analysisset; MACRO %MACRO analysisset(data =, var1 =, var2 =, variables = ) ; DATAanalysis_set DATA analysis_set ; SETKEEP&var1 &var2 &variables SET &data (KEEP = &var1 &var2 &variables); NMISS(OF _numeric_) = 0 ; IF NMISS(OF _numeric_) = 0 ; RUN RUN; MEND %MEND analysisset;

225 ANALYSISSET( ) Macro Module %MACRO analysisset(data =, var1 =, var2 =, %analysisset(data = mydata, var1 = bmi, var2 = years_on_farm, var2 = years_on_farm, variables = height age race gender variables = height age race gender ) IF NMISS(OF _numeric_) = 0 ; RUN; %MEND analysisset; %MACRO analysisset(data =, var1 =, var2 =, %analysisset(data = mydata, var1 = bmi, var2 = years_on_farm, var2 = years_on_farm, variables = height age race gender variables = height age race gender ) IF NMISS(OF _numeric_) = 0 ; RUN; %MEND analysisset;

226 ANALYSISSET( ) Macro Module The CONTENTS Procedure(abbreviated) Data Set Name ANALYSIS_SET Observations 5873 Member Type DATA Variables 6 Alphabetic List of Variables and Attributes # Variable Type Len Format Label 4 age Num 8 Age of Participant 5 bmi Num 8 Body Mass Index 6 gender Num 8 _SEX. Gender 2 height Num 8 Height in inches 1 race Num 8 _RACE. Race 3 years_on_farm Num 8 Years lived/worked on farm

227 We Have Discussed the Coding Of Seven Macro Modules %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates = summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE =(UPCASE(key_var)=UPCASE("&independent"))) ; PROC GLM DATA=&data NAMELEN=32; %IF (NOT %LENGTH(%SCAN(&class_vars,1))) %THEN CLASS &class_vars ; ; MODEL &response = &continuous_vars &class_vars &independent; QUIT; ODS OUTPUT CLOSE; ODS LISTING; %MEND procglm; %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates = summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE =(UPCASE(key_var)=UPCASE("&independent"))) ; PROC GLM DATA=&data NAMELEN=32; %IF (NOT %LENGTH(%SCAN(&class_vars,1))) %THEN CLASS &class_vars ; ; MODEL &response = &continuous_vars &class_vars &independent; QUIT; ODS OUTPUT CLOSE; ODS LISTING; %MEND procglm; %MACRO initbase(base=); OPTION NONOTES; OPTION NONOTES; DATA &base; DATA &base; LENGTH key_var response_var $32 LENGTH key_var response_var $32 key_label response_label $40 key_label response_label $40 class_vars continuous_vars $200 class_vars continuous_vars $200 mean stddev stderror n mean stddev stderror n crude_estimate adjusted_estimate crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; crude_stderr adjusted_stderr 8.; LABEL key_var = "Name of Independent Variable" LABEL key_var = "Name of Independent Variable" key_label = "Label of Independent Variable" key_label = "Label of Independent Variable" response_var = "Name of Response Variable" response_var = "Name of Response Variable" response_label = "Label of Response Variable" response_label = "Label of Response Variable" mean = "PROC MEANS: Mean of Independent Variable" mean = "PROC MEANS: Mean of Independent Variable" n = "PROC MEANS: N of Independent Variable" n = "PROC MEANS: N of Independent Variable" stddev = "PROC MEANS: Standard Deviation Variable" stddev = "PROC MEANS: Standard Deviation Variable" stderror = "PROC MEANS: Standard Error IndeVariable" stderror = "PROC MEANS: Standard Error IndeVariable" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" class_vars = “Adjusted PROC GLM: Class covariates” class_vars = “Adjusted PROC GLM: Class covariates” continuous_vars = “Adjusted PROC GLM: Continuous variates”; continuous_vars = “Adjusted PROC GLM: Continuous variates”; FORMAT crude_estimate adjusted_estimate PVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3 ; crude_stderr adjusted_stderr ODDSR8.3 ; RUN; RUN; OPTION NOTES; OPTION NOTES; DATA &base; DATA &base; SET &base; SET &base; STOP; STOP; RUN; RUN; %MEND initbase; %MACRO initbase(base=); OPTION NONOTES; OPTION NONOTES; DATA &base; DATA &base; LENGTH key_var response_var $32 LENGTH key_var response_var $32 key_label response_label $40 key_label response_label $40 class_vars continuous_vars $200 class_vars continuous_vars $200 mean stddev stderror n mean stddev stderror n crude_estimate adjusted_estimate crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; crude_stderr adjusted_stderr 8.; LABEL key_var = "Name of Independent Variable" LABEL key_var = "Name of Independent Variable" key_label = "Label of Independent Variable" key_label = "Label of Independent Variable" response_var = "Name of Response Variable" response_var = "Name of Response Variable" response_label = "Label of Response Variable" response_label = "Label of Response Variable" mean = "PROC MEANS: Mean of Independent Variable" mean = "PROC MEANS: Mean of Independent Variable" n = "PROC MEANS: N of Independent Variable" n = "PROC MEANS: N of Independent Variable" stddev = "PROC MEANS: Standard Deviation Variable" stddev = "PROC MEANS: Standard Deviation Variable" stderror = "PROC MEANS: Standard Error IndeVariable" stderror = "PROC MEANS: Standard Error IndeVariable" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" class_vars = “Adjusted PROC GLM: Class covariates” class_vars = “Adjusted PROC GLM: Class covariates” continuous_vars = “Adjusted PROC GLM: Continuous variates”; continuous_vars = “Adjusted PROC GLM: Continuous variates”; FORMAT crude_estimate adjusted_estimate PVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3 ; crude_stderr adjusted_stderr ODDSR8.3 ; RUN; RUN; OPTION NOTES; OPTION NOTES; DATA &base; DATA &base; SET &base; SET &base; STOP; STOP; RUN; RUN; %MEND initbase; %MACRO analysisset(data =, var1 =, var1 =, var2 =, var2 =, variables = ) ; variables = ) ; DATA analysis_set ; DATA analysis_set ; SET &data(KEEP = &var1 &var2 &variables); SET &data(KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 THEN OUTPUT; IF NMISS(OF _numeric_) = 0 THEN OUTPUT; RUN; RUN; %MEND analysisset; %MEND analysisset; %MACRO analysisset(data =, var1 =, var1 =, var2 =, var2 =, variables = ) ; variables = ) ; DATA analysis_set ; DATA analysis_set ; SET &data(KEEP = &var1 &var2 &variables); SET &data(KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 THEN OUTPUT; IF NMISS(OF _numeric_) = 0 THEN OUTPUT; RUN; RUN; %MEND analysisset; %MEND analysisset; %MACRO procmeans(data =, var1 =, var1 =, var2 =); var2 =); ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUT summary=summary_means ODS OUTPUT summary=summary_means (DROP = &var1._mean &var1._n &var1._stderr (DROP = &var1._mean &var1._n &var1._stderr &var1._stddev &var1._stddev RENAME = (VNAME_&var1 = response_var RENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_label LABEL_&var1 = response_label VNAME_&var2 = key_var VNAME_&var2 = key_var LABEL_&var2 = key_label LABEL_&var2 = key_label &var2._mean = mean &var2._mean = mean &var2._n = n &var2._n = n &var2._stderr = stderror &var2._stderr = stderror &var2._stddev = stddev) ); &var2._stddev = stddev) ); PROC MEANS DATA= &data mean n stderr std; PROC MEANS DATA= &data mean n stderr std; VAR &var1 &var2; VAR &var1 &var2; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING; %MEND procmeans; %MEND procmeans; %MACRO procmeans(data =, var1 =, var1 =, var2 =); var2 =); ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUT summary=summary_means ODS OUTPUT summary=summary_means (DROP = &var1._mean &var1._n &var1._stderr (DROP = &var1._mean &var1._n &var1._stderr &var1._stddev &var1._stddev RENAME = (VNAME_&var1 = response_var RENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_label LABEL_&var1 = response_label VNAME_&var2 = key_var VNAME_&var2 = key_var LABEL_&var2 = key_label LABEL_&var2 = key_label &var2._mean = mean &var2._mean = mean &var2._n = n &var2._n = n &var2._stderr = stderror &var2._stderr = stderror &var2._stddev = stddev) ); &var2._stddev = stddev) ); PROC MEANS DATA= &data mean n stderr std; PROC MEANS DATA= &data mean n stderr std; VAR &var1 &var2; VAR &var1 &var2; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING; %MEND procmeans; %MEND procmeans; %MACRO split(vars=, control=); %LOCAL count varlist chars; %IF &vars NE %THEN %DO; %IF &control NE %THEN %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)) ; %LET count = %EVAL(&count+1); %END ; %END; %ELSE %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %MACRO split(vars=, control=); %LOCAL count varlist chars; %IF &vars NE %THEN %DO; %IF &control NE %THEN %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)) ; %LET count = %EVAL(&count+1); %END ; %END; %ELSE %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i datasets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :datasets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&datasets,&i,%STR( )))); PROC SORT DATA=%SCAN(&datasets,&i,%STR( )); BY &merge_var; RUN; %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &datasets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; %MEND summaryset; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i datasets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :datasets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&datasets,&i,%STR( )))); PROC SORT DATA=%SCAN(&datasets,&i,%STR( )); BY &merge_var; RUN; %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &datasets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; %MEND summaryset;

228 VALIDATE( ) %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates = summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE =(UPCASE(key_var)=UPCASE("&independent"))) ; PROC GLM DATA=&data NAMELEN=32; %IF (NOT %LENGTH(%SCAN(&class_vars,1))) %THEN CLASS &class_vars ; ; MODEL &response = &continuous_vars &class_vars &independent; QUIT; ODS OUTPUT CLOSE; ODS LISTING; %MEND procglm; %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates = summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE =(UPCASE(key_var)=UPCASE("&independent"))) ; PROC GLM DATA=&data NAMELEN=32; %IF (NOT %LENGTH(%SCAN(&class_vars,1))) %THEN CLASS &class_vars ; ; MODEL &response = &continuous_vars &class_vars &independent; QUIT; ODS OUTPUT CLOSE; ODS LISTING; %MEND procglm; %MACRO initbase(base=); OPTION NONOTES; OPTION NONOTES; DATA &base; DATA &base; LENGTH key_var response_var $32 LENGTH key_var response_var $32 key_label response_label $40 key_label response_label $40 class_vars continuous_vars $200 class_vars continuous_vars $200 mean stddev stderror n mean stddev stderror n crude_estimate adjusted_estimate crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; crude_stderr adjusted_stderr 8.; LABEL key_var = "Name of Independent Variable" LABEL key_var = "Name of Independent Variable" key_label = "Label of Independent Variable" key_label = "Label of Independent Variable" response_var = "Name of Response Variable" response_var = "Name of Response Variable" response_label = "Label of Response Variable" response_label = "Label of Response Variable" mean = "PROC MEANS: Mean of Independent Variable" mean = "PROC MEANS: Mean of Independent Variable" n = "PROC MEANS: N of Independent Variable" n = "PROC MEANS: N of Independent Variable" stddev = "PROC MEANS: Standard Deviation Variable" stddev = "PROC MEANS: Standard Deviation Variable" stderror = "PROC MEANS: Standard Error IndeVariable" stderror = "PROC MEANS: Standard Error IndeVariable" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" class_vars = “Adjusted PROC GLM: Class covariates” class_vars = “Adjusted PROC GLM: Class covariates” continuous_vars = “Adjusted PROC GLM: Continuous variates”; continuous_vars = “Adjusted PROC GLM: Continuous variates”; FORMAT crude_estimate adjusted_estimate PVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3 ; crude_stderr adjusted_stderr ODDSR8.3 ; RUN; RUN; OPTION NOTES; OPTION NOTES; DATA &base; DATA &base; SET &base; SET &base; STOP; STOP; RUN; RUN; %MEND initbase; %MACRO initbase(base=); OPTION NONOTES; OPTION NONOTES; DATA &base; DATA &base; LENGTH key_var response_var $32 LENGTH key_var response_var $32 key_label response_label $40 key_label response_label $40 class_vars continuous_vars $200 class_vars continuous_vars $200 mean stddev stderror n mean stddev stderror n crude_estimate adjusted_estimate crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; crude_stderr adjusted_stderr 8.; LABEL key_var = "Name of Independent Variable" LABEL key_var = "Name of Independent Variable" key_label = "Label of Independent Variable" key_label = "Label of Independent Variable" response_var = "Name of Response Variable" response_var = "Name of Response Variable" response_label = "Label of Response Variable" response_label = "Label of Response Variable" mean = "PROC MEANS: Mean of Independent Variable" mean = "PROC MEANS: Mean of Independent Variable" n = "PROC MEANS: N of Independent Variable" n = "PROC MEANS: N of Independent Variable" stddev = "PROC MEANS: Standard Deviation Variable" stddev = "PROC MEANS: Standard Deviation Variable" stderror = "PROC MEANS: Standard Error IndeVariable" stderror = "PROC MEANS: Standard Error IndeVariable" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" class_vars = “Adjusted PROC GLM: Class covariates” class_vars = “Adjusted PROC GLM: Class covariates” continuous_vars = “Adjusted PROC GLM: Continuous variates”; continuous_vars = “Adjusted PROC GLM: Continuous variates”; FORMAT crude_estimate adjusted_estimate PVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3 ; crude_stderr adjusted_stderr ODDSR8.3 ; RUN; RUN; OPTION NOTES; OPTION NOTES; DATA &base; DATA &base; SET &base; SET &base; STOP; STOP; RUN; RUN; %MEND initbase; %MACRO analysisset(data =, var1 =, var1 =, var2 =, var2 =, variables = ) ; variables = ) ; DATA analysis_set ; DATA analysis_set ; SET &data(KEEP = &var1 &var2 &variables); SET &data(KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 THEN OUTPUT; IF NMISS(OF _numeric_) = 0 THEN OUTPUT; RUN; RUN; %MEND analysisset; %MEND analysisset; %MACRO analysisset(data =, var1 =, var1 =, var2 =, var2 =, variables = ) ; variables = ) ; DATA analysis_set ; DATA analysis_set ; SET &data(KEEP = &var1 &var2 &variables); SET &data(KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 THEN OUTPUT; IF NMISS(OF _numeric_) = 0 THEN OUTPUT; RUN; RUN; %MEND analysisset; %MEND analysisset; %MACRO procmeans(data =, var1 =, var1 =, var2 =); var2 =); ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUT summary=summary_means ODS OUTPUT summary=summary_means (DROP = &var1._mean &var1._n &var1._stderr (DROP = &var1._mean &var1._n &var1._stderr &var1._stddev &var1._stddev RENAME = (VNAME_&var1 = response_var RENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_label LABEL_&var1 = response_label VNAME_&var2 = key_var VNAME_&var2 = key_var LABEL_&var2 = key_label LABEL_&var2 = key_label &var2._mean = mean &var2._mean = mean &var2._n = n &var2._n = n &var2._stderr = stderror &var2._stderr = stderror &var2._stddev = stddev) ); &var2._stddev = stddev) ); PROC MEANS DATA= &data mean n stderr std; PROC MEANS DATA= &data mean n stderr std; VAR &var1 &var2; VAR &var1 &var2; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING; %MEND procmeans; %MEND procmeans; %MACRO procmeans(data =, var1 =, var1 =, var2 =); var2 =); ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUT summary=summary_means ODS OUTPUT summary=summary_means (DROP = &var1._mean &var1._n &var1._stderr (DROP = &var1._mean &var1._n &var1._stderr &var1._stddev &var1._stddev RENAME = (VNAME_&var1 = response_var RENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_label LABEL_&var1 = response_label VNAME_&var2 = key_var VNAME_&var2 = key_var LABEL_&var2 = key_label LABEL_&var2 = key_label &var2._mean = mean &var2._mean = mean &var2._n = n &var2._n = n &var2._stderr = stderror &var2._stderr = stderror &var2._stddev = stddev) ); &var2._stddev = stddev) ); PROC MEANS DATA= &data mean n stderr std; PROC MEANS DATA= &data mean n stderr std; VAR &var1 &var2; VAR &var1 &var2; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING; %MEND procmeans; %MEND procmeans; %MACRO split(vars=, control=); %LOCAL count varlist chars; %IF &vars NE %THEN %DO; %IF &control NE %THEN %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)) ; %LET count = %EVAL(&count+1); %END ; %END; %ELSE %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %MACRO split(vars=, control=); %LOCAL count varlist chars; %IF &vars NE %THEN %DO; %IF &control NE %THEN %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)) ; %LET count = %EVAL(&count+1); %END ; %END; %ELSE %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i datasets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :datasets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&datasets,&i,%STR( )))); PROC SORT DATA=%SCAN(&datasets,&i,%STR( )); BY &merge_var; RUN; %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &datasets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; %MEND summaryset; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i datasets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :datasets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&datasets,&i,%STR( )))); PROC SORT DATA=%SCAN(&datasets,&i,%STR( )); BY &merge_var; RUN; %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &datasets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; %MEND summaryset;

229 INITBASE( ) %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates = summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE =(UPCASE(key_var)=UPCASE("&independent"))) ; PROC GLM DATA=&data NAMELEN=32; %IF (NOT %LENGTH(%SCAN(&class_vars,1))) %THEN CLASS &class_vars ; ; MODEL &response = &continuous_vars &class_vars &independent; QUIT; ODS OUTPUT CLOSE; ODS LISTING; %MEND procglm; %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates = summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE =(UPCASE(key_var)=UPCASE("&independent"))) ; PROC GLM DATA=&data NAMELEN=32; %IF (NOT %LENGTH(%SCAN(&class_vars,1))) %THEN CLASS &class_vars ; ; MODEL &response = &continuous_vars &class_vars &independent; QUIT; ODS OUTPUT CLOSE; ODS LISTING; %MEND procglm; %MACRO initbase(base=); OPTION NONOTES; OPTION NONOTES; DATA &base; DATA &base; LENGTH key_var response_var $32 LENGTH key_var response_var $32 key_label response_label $40 key_label response_label $40 class_vars continuous_vars $200 class_vars continuous_vars $200 mean stddev stderror n mean stddev stderror n crude_estimate adjusted_estimate crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; crude_stderr adjusted_stderr 8.; LABEL key_var = "Name of Independent Variable" LABEL key_var = "Name of Independent Variable" key_label = "Label of Independent Variable" key_label = "Label of Independent Variable" response_var = "Name of Response Variable" response_var = "Name of Response Variable" response_label = "Label of Response Variable" response_label = "Label of Response Variable" mean = "PROC MEANS: Mean of Independent Variable" mean = "PROC MEANS: Mean of Independent Variable" n = "PROC MEANS: N of Independent Variable" n = "PROC MEANS: N of Independent Variable" stddev = "PROC MEANS: Standard Deviation Variable" stddev = "PROC MEANS: Standard Deviation Variable" stderror = "PROC MEANS: Standard Error IndeVariable" stderror = "PROC MEANS: Standard Error IndeVariable" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" class_vars = “Adjusted PROC GLM: Class covariates” class_vars = “Adjusted PROC GLM: Class covariates” continuous_vars = “Adjusted PROC GLM: Continuous variates”; continuous_vars = “Adjusted PROC GLM: Continuous variates”; FORMAT crude_estimate adjusted_estimate PVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3 ; crude_stderr adjusted_stderr ODDSR8.3 ; RUN; RUN; OPTION NOTES; OPTION NOTES; DATA &base; DATA &base; SET &base; SET &base; STOP; STOP; RUN; RUN; %MEND initbase; %MACRO initbase(base=); OPTION NONOTES; OPTION NONOTES; DATA &base; DATA &base; LENGTH key_var response_var $32 LENGTH key_var response_var $32 key_label response_label $40 key_label response_label $40 class_vars continuous_vars $200 class_vars continuous_vars $200 mean stddev stderror n mean stddev stderror n crude_estimate adjusted_estimate crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; crude_stderr adjusted_stderr 8.; LABEL key_var = "Name of Independent Variable" LABEL key_var = "Name of Independent Variable" key_label = "Label of Independent Variable" key_label = "Label of Independent Variable" response_var = "Name of Response Variable" response_var = "Name of Response Variable" response_label = "Label of Response Variable" response_label = "Label of Response Variable" mean = "PROC MEANS: Mean of Independent Variable" mean = "PROC MEANS: Mean of Independent Variable" n = "PROC MEANS: N of Independent Variable" n = "PROC MEANS: N of Independent Variable" stddev = "PROC MEANS: Standard Deviation Variable" stddev = "PROC MEANS: Standard Deviation Variable" stderror = "PROC MEANS: Standard Error IndeVariable" stderror = "PROC MEANS: Standard Error IndeVariable" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" class_vars = “Adjusted PROC GLM: Class covariates” class_vars = “Adjusted PROC GLM: Class covariates” continuous_vars = “Adjusted PROC GLM: Continuous variates”; continuous_vars = “Adjusted PROC GLM: Continuous variates”; FORMAT crude_estimate adjusted_estimate PVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3 ; crude_stderr adjusted_stderr ODDSR8.3 ; RUN; RUN; OPTION NOTES; OPTION NOTES; DATA &base; DATA &base; SET &base; SET &base; STOP; STOP; RUN; RUN; %MEND initbase; %MACRO analysisset(data =, var1 =, var1 =, var2 =, var2 =, variables = ) ; variables = ) ; DATA analysis_set ; DATA analysis_set ; SET &data(KEEP = &var1 &var2 &variables); SET &data(KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 THEN OUTPUT; IF NMISS(OF _numeric_) = 0 THEN OUTPUT; RUN; RUN; %MEND analysisset; %MEND analysisset; %MACRO analysisset(data =, var1 =, var1 =, var2 =, var2 =, variables = ) ; variables = ) ; DATA analysis_set ; DATA analysis_set ; SET &data(KEEP = &var1 &var2 &variables); SET &data(KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 THEN OUTPUT; IF NMISS(OF _numeric_) = 0 THEN OUTPUT; RUN; RUN; %MEND analysisset; %MEND analysisset; %MACRO procmeans(data =, var1 =, var1 =, var2 =); var2 =); ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUT summary=summary_means ODS OUTPUT summary=summary_means (DROP = &var1._mean &var1._n &var1._stderr (DROP = &var1._mean &var1._n &var1._stderr &var1._stddev &var1._stddev RENAME = (VNAME_&var1 = response_var RENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_label LABEL_&var1 = response_label VNAME_&var2 = key_var VNAME_&var2 = key_var LABEL_&var2 = key_label LABEL_&var2 = key_label &var2._mean = mean &var2._mean = mean &var2._n = n &var2._n = n &var2._stderr = stderror &var2._stderr = stderror &var2._stddev = stddev) ); &var2._stddev = stddev) ); PROC MEANS DATA= &data mean n stderr std; PROC MEANS DATA= &data mean n stderr std; VAR &var1 &var2; VAR &var1 &var2; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING; %MEND procmeans; %MEND procmeans; %MACRO procmeans(data =, var1 =, var1 =, var2 =); var2 =); ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUT summary=summary_means ODS OUTPUT summary=summary_means (DROP = &var1._mean &var1._n &var1._stderr (DROP = &var1._mean &var1._n &var1._stderr &var1._stddev &var1._stddev RENAME = (VNAME_&var1 = response_var RENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_label LABEL_&var1 = response_label VNAME_&var2 = key_var VNAME_&var2 = key_var LABEL_&var2 = key_label LABEL_&var2 = key_label &var2._mean = mean &var2._mean = mean &var2._n = n &var2._n = n &var2._stderr = stderror &var2._stderr = stderror &var2._stddev = stddev) ); &var2._stddev = stddev) ); PROC MEANS DATA= &data mean n stderr std; PROC MEANS DATA= &data mean n stderr std; VAR &var1 &var2; VAR &var1 &var2; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING; %MEND procmeans; %MEND procmeans; %MACRO split(vars=, control=); %LOCAL count varlist chars; %IF &vars NE %THEN %DO; %IF &control NE %THEN %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)) ; %LET count = %EVAL(&count+1); %END ; %END; %ELSE %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %MACRO split(vars=, control=); %LOCAL count varlist chars; %IF &vars NE %THEN %DO; %IF &control NE %THEN %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)) ; %LET count = %EVAL(&count+1); %END ; %END; %ELSE %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i datasets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :datasets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&datasets,&i,%STR( )))); PROC SORT DATA=%SCAN(&datasets,&i,%STR( )); BY &merge_var; RUN; %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &datasets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; %MEND summaryset; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i datasets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :datasets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&datasets,&i,%STR( )))); PROC SORT DATA=%SCAN(&datasets,&i,%STR( )); BY &merge_var; RUN; %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &datasets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; %MEND summaryset;

230 SPLIT( ) %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates = summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE =(UPCASE(key_var)=UPCASE("&independent"))) ; PROC GLM DATA=&data NAMELEN=32; %IF (NOT %LENGTH(%SCAN(&class_vars,1))) %THEN CLASS &class_vars ; ; MODEL &response = &continuous_vars &class_vars &independent; QUIT; ODS OUTPUT CLOSE; ODS LISTING; %MEND procglm; %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates = summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE =(UPCASE(key_var)=UPCASE("&independent"))) ; PROC GLM DATA=&data NAMELEN=32; %IF (NOT %LENGTH(%SCAN(&class_vars,1))) %THEN CLASS &class_vars ; ; MODEL &response = &continuous_vars &class_vars &independent; QUIT; ODS OUTPUT CLOSE; ODS LISTING; %MEND procglm; %MACRO initbase(base=); OPTION NONOTES; OPTION NONOTES; DATA &base; DATA &base; LENGTH key_var response_var $32 LENGTH key_var response_var $32 key_label response_label $40 key_label response_label $40 class_vars continuous_vars $200 class_vars continuous_vars $200 mean stddev stderror n mean stddev stderror n crude_estimate adjusted_estimate crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; crude_stderr adjusted_stderr 8.; LABEL key_var = "Name of Independent Variable" LABEL key_var = "Name of Independent Variable" key_label = "Label of Independent Variable" key_label = "Label of Independent Variable" response_var = "Name of Response Variable" response_var = "Name of Response Variable" response_label = "Label of Response Variable" response_label = "Label of Response Variable" mean = "PROC MEANS: Mean of Independent Variable" mean = "PROC MEANS: Mean of Independent Variable" n = "PROC MEANS: N of Independent Variable" n = "PROC MEANS: N of Independent Variable" stddev = "PROC MEANS: Standard Deviation Variable" stddev = "PROC MEANS: Standard Deviation Variable" stderror = "PROC MEANS: Standard Error IndeVariable" stderror = "PROC MEANS: Standard Error IndeVariable" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" class_vars = “Adjusted PROC GLM: Class covariates” class_vars = “Adjusted PROC GLM: Class covariates” continuous_vars = “Adjusted PROC GLM: Continuous variates”; continuous_vars = “Adjusted PROC GLM: Continuous variates”; FORMAT crude_estimate adjusted_estimate PVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3 ; crude_stderr adjusted_stderr ODDSR8.3 ; RUN; RUN; OPTION NOTES; OPTION NOTES; DATA &base; DATA &base; SET &base; SET &base; STOP; STOP; RUN; RUN; %MEND initbase; %MACRO initbase(base=); OPTION NONOTES; OPTION NONOTES; DATA &base; DATA &base; LENGTH key_var response_var $32 LENGTH key_var response_var $32 key_label response_label $40 key_label response_label $40 class_vars continuous_vars $200 class_vars continuous_vars $200 mean stddev stderror n mean stddev stderror n crude_estimate adjusted_estimate crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; crude_stderr adjusted_stderr 8.; LABEL key_var = "Name of Independent Variable" LABEL key_var = "Name of Independent Variable" key_label = "Label of Independent Variable" key_label = "Label of Independent Variable" response_var = "Name of Response Variable" response_var = "Name of Response Variable" response_label = "Label of Response Variable" response_label = "Label of Response Variable" mean = "PROC MEANS: Mean of Independent Variable" mean = "PROC MEANS: Mean of Independent Variable" n = "PROC MEANS: N of Independent Variable" n = "PROC MEANS: N of Independent Variable" stddev = "PROC MEANS: Standard Deviation Variable" stddev = "PROC MEANS: Standard Deviation Variable" stderror = "PROC MEANS: Standard Error IndeVariable" stderror = "PROC MEANS: Standard Error IndeVariable" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" class_vars = “Adjusted PROC GLM: Class covariates” class_vars = “Adjusted PROC GLM: Class covariates” continuous_vars = “Adjusted PROC GLM: Continuous variates”; continuous_vars = “Adjusted PROC GLM: Continuous variates”; FORMAT crude_estimate adjusted_estimate PVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3 ; crude_stderr adjusted_stderr ODDSR8.3 ; RUN; RUN; OPTION NOTES; OPTION NOTES; DATA &base; DATA &base; SET &base; SET &base; STOP; STOP; RUN; RUN; %MEND initbase; %MACRO analysisset(data =, var1 =, var1 =, var2 =, var2 =, variables = ) ; variables = ) ; DATA analysis_set ; DATA analysis_set ; SET &data(KEEP = &var1 &var2 &variables); SET &data(KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 THEN OUTPUT; IF NMISS(OF _numeric_) = 0 THEN OUTPUT; RUN; RUN; %MEND analysisset; %MEND analysisset; %MACRO analysisset(data =, var1 =, var1 =, var2 =, var2 =, variables = ) ; variables = ) ; DATA analysis_set ; DATA analysis_set ; SET &data(KEEP = &var1 &var2 &variables); SET &data(KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 THEN OUTPUT; IF NMISS(OF _numeric_) = 0 THEN OUTPUT; RUN; RUN; %MEND analysisset; %MEND analysisset; %MACRO procmeans(data =, var1 =, var1 =, var2 =); var2 =); ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUT summary=summary_means ODS OUTPUT summary=summary_means (DROP = &var1._mean &var1._n &var1._stderr (DROP = &var1._mean &var1._n &var1._stderr &var1._stddev &var1._stddev RENAME = (VNAME_&var1 = response_var RENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_label LABEL_&var1 = response_label VNAME_&var2 = key_var VNAME_&var2 = key_var LABEL_&var2 = key_label LABEL_&var2 = key_label &var2._mean = mean &var2._mean = mean &var2._n = n &var2._n = n &var2._stderr = stderror &var2._stderr = stderror &var2._stddev = stddev) ); &var2._stddev = stddev) ); PROC MEANS DATA= &data mean n stderr std; PROC MEANS DATA= &data mean n stderr std; VAR &var1 &var2; VAR &var1 &var2; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING; %MEND procmeans; %MEND procmeans; %MACRO procmeans(data =, var1 =, var1 =, var2 =); var2 =); ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUT summary=summary_means ODS OUTPUT summary=summary_means (DROP = &var1._mean &var1._n &var1._stderr (DROP = &var1._mean &var1._n &var1._stderr &var1._stddev &var1._stddev RENAME = (VNAME_&var1 = response_var RENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_label LABEL_&var1 = response_label VNAME_&var2 = key_var VNAME_&var2 = key_var LABEL_&var2 = key_label LABEL_&var2 = key_label &var2._mean = mean &var2._mean = mean &var2._n = n &var2._n = n &var2._stderr = stderror &var2._stderr = stderror &var2._stddev = stddev) ); &var2._stddev = stddev) ); PROC MEANS DATA= &data mean n stderr std; PROC MEANS DATA= &data mean n stderr std; VAR &var1 &var2; VAR &var1 &var2; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING; %MEND procmeans; %MEND procmeans; %MACRO split(vars=, control=); %LOCAL count varlist chars; %IF &vars NE %THEN %DO; %IF &control NE %THEN %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)) ; %LET count = %EVAL(&count+1); %END ; %END; %ELSE %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %MACRO split(vars=, control=); %LOCAL count varlist chars; %IF &vars NE %THEN %DO; %IF &control NE %THEN %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)) ; %LET count = %EVAL(&count+1); %END ; %END; %ELSE %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i datasets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :datasets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&datasets,&i,%STR( )))); PROC SORT DATA=%SCAN(&datasets,&i,%STR( )); BY &merge_var; RUN; %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &datasets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; %MEND summaryset; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i datasets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :datasets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&datasets,&i,%STR( )))); PROC SORT DATA=%SCAN(&datasets,&i,%STR( )); BY &merge_var; RUN; %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &datasets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; %MEND summaryset;

231 ANALYSISSET( ) %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates = summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE =(UPCASE(key_var)=UPCASE("&independent"))) ; PROC GLM DATA=&data NAMELEN=32; %IF (NOT %LENGTH(%SCAN(&class_vars,1))) %THEN CLASS &class_vars ; ; MODEL &response = &continuous_vars &class_vars &independent; QUIT; ODS OUTPUT CLOSE; ODS LISTING; %MEND procglm; %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates = summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE =(UPCASE(key_var)=UPCASE("&independent"))) ; PROC GLM DATA=&data NAMELEN=32; %IF (NOT %LENGTH(%SCAN(&class_vars,1))) %THEN CLASS &class_vars ; ; MODEL &response = &continuous_vars &class_vars &independent; QUIT; ODS OUTPUT CLOSE; ODS LISTING; %MEND procglm; %MACRO initbase(base=); OPTION NONOTES; OPTION NONOTES; DATA &base; DATA &base; LENGTH key_var response_var $32 LENGTH key_var response_var $32 key_label response_label $40 key_label response_label $40 class_vars continuous_vars $200 class_vars continuous_vars $200 mean stddev stderror n mean stddev stderror n crude_estimate adjusted_estimate crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; crude_stderr adjusted_stderr 8.; LABEL key_var = "Name of Independent Variable" LABEL key_var = "Name of Independent Variable" key_label = "Label of Independent Variable" key_label = "Label of Independent Variable" response_var = "Name of Response Variable" response_var = "Name of Response Variable" response_label = "Label of Response Variable" response_label = "Label of Response Variable" mean = "PROC MEANS: Mean of Independent Variable" mean = "PROC MEANS: Mean of Independent Variable" n = "PROC MEANS: N of Independent Variable" n = "PROC MEANS: N of Independent Variable" stddev = "PROC MEANS: Standard Deviation Variable" stddev = "PROC MEANS: Standard Deviation Variable" stderror = "PROC MEANS: Standard Error IndeVariable" stderror = "PROC MEANS: Standard Error IndeVariable" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" class_vars = “Adjusted PROC GLM: Class covariates” class_vars = “Adjusted PROC GLM: Class covariates” continuous_vars = “Adjusted PROC GLM: Continuous variates”; continuous_vars = “Adjusted PROC GLM: Continuous variates”; FORMAT crude_estimate adjusted_estimate PVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3 ; crude_stderr adjusted_stderr ODDSR8.3 ; RUN; RUN; OPTION NOTES; OPTION NOTES; DATA &base; DATA &base; SET &base; SET &base; STOP; STOP; RUN; RUN; %MEND initbase; %MACRO initbase(base=); OPTION NONOTES; OPTION NONOTES; DATA &base; DATA &base; LENGTH key_var response_var $32 LENGTH key_var response_var $32 key_label response_label $40 key_label response_label $40 class_vars continuous_vars $200 class_vars continuous_vars $200 mean stddev stderror n mean stddev stderror n crude_estimate adjusted_estimate crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; crude_stderr adjusted_stderr 8.; LABEL key_var = "Name of Independent Variable" LABEL key_var = "Name of Independent Variable" key_label = "Label of Independent Variable" key_label = "Label of Independent Variable" response_var = "Name of Response Variable" response_var = "Name of Response Variable" response_label = "Label of Response Variable" response_label = "Label of Response Variable" mean = "PROC MEANS: Mean of Independent Variable" mean = "PROC MEANS: Mean of Independent Variable" n = "PROC MEANS: N of Independent Variable" n = "PROC MEANS: N of Independent Variable" stddev = "PROC MEANS: Standard Deviation Variable" stddev = "PROC MEANS: Standard Deviation Variable" stderror = "PROC MEANS: Standard Error IndeVariable" stderror = "PROC MEANS: Standard Error IndeVariable" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" class_vars = “Adjusted PROC GLM: Class covariates” class_vars = “Adjusted PROC GLM: Class covariates” continuous_vars = “Adjusted PROC GLM: Continuous variates”; continuous_vars = “Adjusted PROC GLM: Continuous variates”; FORMAT crude_estimate adjusted_estimate PVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3 ; crude_stderr adjusted_stderr ODDSR8.3 ; RUN; RUN; OPTION NOTES; OPTION NOTES; DATA &base; DATA &base; SET &base; SET &base; STOP; STOP; RUN; RUN; %MEND initbase; %MACRO analysisset(data =, var1 =, var1 =, var2 =, var2 =, variables = ) ; variables = ) ; DATA analysis_set ; DATA analysis_set ; SET &data(KEEP = &var1 &var2 &variables); SET &data(KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 THEN OUTPUT; IF NMISS(OF _numeric_) = 0 THEN OUTPUT; RUN; RUN; %MEND analysisset; %MEND analysisset; %MACRO analysisset(data =, var1 =, var1 =, var2 =, var2 =, variables = ) ; variables = ) ; DATA analysis_set ; DATA analysis_set ; SET &data(KEEP = &var1 &var2 &variables); SET &data(KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 THEN OUTPUT; IF NMISS(OF _numeric_) = 0 THEN OUTPUT; RUN; RUN; %MEND analysisset; %MEND analysisset; %MACRO procmeans(data =, var1 =, var1 =, var2 =); var2 =); ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUT summary=summary_means ODS OUTPUT summary=summary_means (DROP = &var1._mean &var1._n &var1._stderr (DROP = &var1._mean &var1._n &var1._stderr &var1._stddev &var1._stddev RENAME = (VNAME_&var1 = response_var RENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_label LABEL_&var1 = response_label VNAME_&var2 = key_var VNAME_&var2 = key_var LABEL_&var2 = key_label LABEL_&var2 = key_label &var2._mean = mean &var2._mean = mean &var2._n = n &var2._n = n &var2._stderr = stderror &var2._stderr = stderror &var2._stddev = stddev) ); &var2._stddev = stddev) ); PROC MEANS DATA= &data mean n stderr std; PROC MEANS DATA= &data mean n stderr std; VAR &var1 &var2; VAR &var1 &var2; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING; %MEND procmeans; %MEND procmeans; %MACRO procmeans(data =, var1 =, var1 =, var2 =); var2 =); ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUT summary=summary_means ODS OUTPUT summary=summary_means (DROP = &var1._mean &var1._n &var1._stderr (DROP = &var1._mean &var1._n &var1._stderr &var1._stddev &var1._stddev RENAME = (VNAME_&var1 = response_var RENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_label LABEL_&var1 = response_label VNAME_&var2 = key_var VNAME_&var2 = key_var LABEL_&var2 = key_label LABEL_&var2 = key_label &var2._mean = mean &var2._mean = mean &var2._n = n &var2._n = n &var2._stderr = stderror &var2._stderr = stderror &var2._stddev = stddev) ); &var2._stddev = stddev) ); PROC MEANS DATA= &data mean n stderr std; PROC MEANS DATA= &data mean n stderr std; VAR &var1 &var2; VAR &var1 &var2; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING; %MEND procmeans; %MEND procmeans; %MACRO split(vars=, control=); %LOCAL count varlist chars; %IF &vars NE %THEN %DO; %IF &control NE %THEN %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)) ; %LET count = %EVAL(&count+1); %END ; %END; %ELSE %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %MACRO split(vars=, control=); %LOCAL count varlist chars; %IF &vars NE %THEN %DO; %IF &control NE %THEN %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)) ; %LET count = %EVAL(&count+1); %END ; %END; %ELSE %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i datasets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :datasets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&datasets,&i,%STR( )))); PROC SORT DATA=%SCAN(&datasets,&i,%STR( )); BY &merge_var; RUN; %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &datasets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; %MEND summaryset; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i datasets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :datasets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&datasets,&i,%STR( )))); PROC SORT DATA=%SCAN(&datasets,&i,%STR( )); BY &merge_var; RUN; %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &datasets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; %MEND summaryset;

232 PROCMEANS( ) %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates = summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE =(UPCASE(key_var)=UPCASE("&independent"))) ; PROC GLM DATA=&data NAMELEN=32; %IF (NOT %LENGTH(%SCAN(&class_vars,1))) %THEN CLASS &class_vars ; ; MODEL &response = &continuous_vars &class_vars &independent; QUIT; ODS OUTPUT CLOSE; ODS LISTING; %MEND procglm; %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates = summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE =(UPCASE(key_var)=UPCASE("&independent"))) ; PROC GLM DATA=&data NAMELEN=32; %IF (NOT %LENGTH(%SCAN(&class_vars,1))) %THEN CLASS &class_vars ; ; MODEL &response = &continuous_vars &class_vars &independent; QUIT; ODS OUTPUT CLOSE; ODS LISTING; %MEND procglm; %MACRO initbase(base=); OPTION NONOTES; OPTION NONOTES; DATA &base; DATA &base; LENGTH key_var response_var $32 LENGTH key_var response_var $32 key_label response_label $40 key_label response_label $40 class_vars continuous_vars $200 class_vars continuous_vars $200 mean stddev stderror n mean stddev stderror n crude_estimate adjusted_estimate crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; crude_stderr adjusted_stderr 8.; LABEL key_var = "Name of Independent Variable" LABEL key_var = "Name of Independent Variable" key_label = "Label of Independent Variable" key_label = "Label of Independent Variable" response_var = "Name of Response Variable" response_var = "Name of Response Variable" response_label = "Label of Response Variable" response_label = "Label of Response Variable" mean = "PROC MEANS: Mean of Independent Variable" mean = "PROC MEANS: Mean of Independent Variable" n = "PROC MEANS: N of Independent Variable" n = "PROC MEANS: N of Independent Variable" stddev = "PROC MEANS: Standard Deviation Variable" stddev = "PROC MEANS: Standard Deviation Variable" stderror = "PROC MEANS: Standard Error IndeVariable" stderror = "PROC MEANS: Standard Error IndeVariable" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" class_vars = “Adjusted PROC GLM: Class covariates” class_vars = “Adjusted PROC GLM: Class covariates” continuous_vars = “Adjusted PROC GLM: Continuous variates”; continuous_vars = “Adjusted PROC GLM: Continuous variates”; FORMAT crude_estimate adjusted_estimate PVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3 ; crude_stderr adjusted_stderr ODDSR8.3 ; RUN; RUN; OPTION NOTES; OPTION NOTES; DATA &base; DATA &base; SET &base; SET &base; STOP; STOP; RUN; RUN; %MEND initbase; %MACRO initbase(base=); OPTION NONOTES; OPTION NONOTES; DATA &base; DATA &base; LENGTH key_var response_var $32 LENGTH key_var response_var $32 key_label response_label $40 key_label response_label $40 class_vars continuous_vars $200 class_vars continuous_vars $200 mean stddev stderror n mean stddev stderror n crude_estimate adjusted_estimate crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; crude_stderr adjusted_stderr 8.; LABEL key_var = "Name of Independent Variable" LABEL key_var = "Name of Independent Variable" key_label = "Label of Independent Variable" key_label = "Label of Independent Variable" response_var = "Name of Response Variable" response_var = "Name of Response Variable" response_label = "Label of Response Variable" response_label = "Label of Response Variable" mean = "PROC MEANS: Mean of Independent Variable" mean = "PROC MEANS: Mean of Independent Variable" n = "PROC MEANS: N of Independent Variable" n = "PROC MEANS: N of Independent Variable" stddev = "PROC MEANS: Standard Deviation Variable" stddev = "PROC MEANS: Standard Deviation Variable" stderror = "PROC MEANS: Standard Error IndeVariable" stderror = "PROC MEANS: Standard Error IndeVariable" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" class_vars = “Adjusted PROC GLM: Class covariates” class_vars = “Adjusted PROC GLM: Class covariates” continuous_vars = “Adjusted PROC GLM: Continuous variates”; continuous_vars = “Adjusted PROC GLM: Continuous variates”; FORMAT crude_estimate adjusted_estimate PVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3 ; crude_stderr adjusted_stderr ODDSR8.3 ; RUN; RUN; OPTION NOTES; OPTION NOTES; DATA &base; DATA &base; SET &base; SET &base; STOP; STOP; RUN; RUN; %MEND initbase; %MACRO analysisset(data =, var1 =, var1 =, var2 =, var2 =, variables = ) ; variables = ) ; DATA analysis_set ; DATA analysis_set ; SET &data(KEEP = &var1 &var2 &variables); SET &data(KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 THEN OUTPUT; IF NMISS(OF _numeric_) = 0 THEN OUTPUT; RUN; RUN; %MEND analysisset; %MEND analysisset; %MACRO analysisset(data =, var1 =, var1 =, var2 =, var2 =, variables = ) ; variables = ) ; DATA analysis_set ; DATA analysis_set ; SET &data(KEEP = &var1 &var2 &variables); SET &data(KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 THEN OUTPUT; IF NMISS(OF _numeric_) = 0 THEN OUTPUT; RUN; RUN; %MEND analysisset; %MEND analysisset; %MACRO procmeans(data =, var1 =, var1 =, var2 =); var2 =); ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUT summary=summary_means ODS OUTPUT summary=summary_means (DROP = &var1._mean &var1._n &var1._stderr (DROP = &var1._mean &var1._n &var1._stderr &var1._stddev &var1._stddev RENAME = (VNAME_&var1 = response_var RENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_label LABEL_&var1 = response_label VNAME_&var2 = key_var VNAME_&var2 = key_var LABEL_&var2 = key_label LABEL_&var2 = key_label &var2._mean = mean &var2._mean = mean &var2._n = n &var2._n = n &var2._stderr = stderror &var2._stderr = stderror &var2._stddev = stddev) ); &var2._stddev = stddev) ); PROC MEANS DATA= &data mean n stderr std; PROC MEANS DATA= &data mean n stderr std; VAR &var1 &var2; VAR &var1 &var2; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING; %MEND procmeans; %MEND procmeans; %MACRO procmeans(data =, var1 =, var1 =, var2 =); var2 =); ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUT summary=summary_means ODS OUTPUT summary=summary_means (DROP = &var1._mean &var1._n &var1._stderr (DROP = &var1._mean &var1._n &var1._stderr &var1._stddev &var1._stddev RENAME = (VNAME_&var1 = response_var RENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_label LABEL_&var1 = response_label VNAME_&var2 = key_var VNAME_&var2 = key_var LABEL_&var2 = key_label LABEL_&var2 = key_label &var2._mean = mean &var2._mean = mean &var2._n = n &var2._n = n &var2._stderr = stderror &var2._stderr = stderror &var2._stddev = stddev) ); &var2._stddev = stddev) ); PROC MEANS DATA= &data mean n stderr std; PROC MEANS DATA= &data mean n stderr std; VAR &var1 &var2; VAR &var1 &var2; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING; %MEND procmeans; %MEND procmeans; %MACRO split(vars=, control=); %LOCAL count varlist chars; %IF &vars NE %THEN %DO; %IF &control NE %THEN %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)) ; %LET count = %EVAL(&count+1); %END ; %END; %ELSE %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %MACRO split(vars=, control=); %LOCAL count varlist chars; %IF &vars NE %THEN %DO; %IF &control NE %THEN %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)) ; %LET count = %EVAL(&count+1); %END ; %END; %ELSE %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i datasets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :datasets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&datasets,&i,%STR( )))); PROC SORT DATA=%SCAN(&datasets,&i,%STR( )); BY &merge_var; RUN; %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &datasets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; %MEND summaryset; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i datasets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :datasets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&datasets,&i,%STR( )))); PROC SORT DATA=%SCAN(&datasets,&i,%STR( )); BY &merge_var; RUN; %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &datasets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; %MEND summaryset;

233 PROCGLM( ) %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates = summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE =(UPCASE(key_var)=UPCASE("&independent"))) ; PROC GLM DATA=&data NAMELEN=32; %IF (NOT %LENGTH(%SCAN(&class_vars,1))) %THEN CLASS &class_vars ; ; MODEL &response = &continuous_vars &class_vars &independent; QUIT; ODS OUTPUT CLOSE; ODS LISTING; %MEND procglm; %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates = summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE =(UPCASE(key_var)=UPCASE("&independent"))) ; PROC GLM DATA=&data NAMELEN=32; %IF (NOT %LENGTH(%SCAN(&class_vars,1))) %THEN CLASS &class_vars ; ; MODEL &response = &continuous_vars &class_vars &independent; QUIT; ODS OUTPUT CLOSE; ODS LISTING; %MEND procglm; %MACRO initbase(base=); OPTION NONOTES; OPTION NONOTES; DATA &base; DATA &base; LENGTH key_var response_var $32 LENGTH key_var response_var $32 key_label response_label $40 key_label response_label $40 class_vars continuous_vars $200 class_vars continuous_vars $200 mean stddev stderror n mean stddev stderror n crude_estimate adjusted_estimate crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; crude_stderr adjusted_stderr 8.; LABEL key_var = "Name of Independent Variable" LABEL key_var = "Name of Independent Variable" key_label = "Label of Independent Variable" key_label = "Label of Independent Variable" response_var = "Name of Response Variable" response_var = "Name of Response Variable" response_label = "Label of Response Variable" response_label = "Label of Response Variable" mean = "PROC MEANS: Mean of Independent Variable" mean = "PROC MEANS: Mean of Independent Variable" n = "PROC MEANS: N of Independent Variable" n = "PROC MEANS: N of Independent Variable" stddev = "PROC MEANS: Standard Deviation Variable" stddev = "PROC MEANS: Standard Deviation Variable" stderror = "PROC MEANS: Standard Error IndeVariable" stderror = "PROC MEANS: Standard Error IndeVariable" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" class_vars = “Adjusted PROC GLM: Class covariates” class_vars = “Adjusted PROC GLM: Class covariates” continuous_vars = “Adjusted PROC GLM: Continuous variates”; continuous_vars = “Adjusted PROC GLM: Continuous variates”; FORMAT crude_estimate adjusted_estimate PVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3 ; crude_stderr adjusted_stderr ODDSR8.3 ; RUN; RUN; OPTION NOTES; OPTION NOTES; DATA &base; DATA &base; SET &base; SET &base; STOP; STOP; RUN; RUN; %MEND initbase; %MACRO initbase(base=); OPTION NONOTES; OPTION NONOTES; DATA &base; DATA &base; LENGTH key_var response_var $32 LENGTH key_var response_var $32 key_label response_label $40 key_label response_label $40 class_vars continuous_vars $200 class_vars continuous_vars $200 mean stddev stderror n mean stddev stderror n crude_estimate adjusted_estimate crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; crude_stderr adjusted_stderr 8.; LABEL key_var = "Name of Independent Variable" LABEL key_var = "Name of Independent Variable" key_label = "Label of Independent Variable" key_label = "Label of Independent Variable" response_var = "Name of Response Variable" response_var = "Name of Response Variable" response_label = "Label of Response Variable" response_label = "Label of Response Variable" mean = "PROC MEANS: Mean of Independent Variable" mean = "PROC MEANS: Mean of Independent Variable" n = "PROC MEANS: N of Independent Variable" n = "PROC MEANS: N of Independent Variable" stddev = "PROC MEANS: Standard Deviation Variable" stddev = "PROC MEANS: Standard Deviation Variable" stderror = "PROC MEANS: Standard Error IndeVariable" stderror = "PROC MEANS: Standard Error IndeVariable" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" class_vars = “Adjusted PROC GLM: Class covariates” class_vars = “Adjusted PROC GLM: Class covariates” continuous_vars = “Adjusted PROC GLM: Continuous variates”; continuous_vars = “Adjusted PROC GLM: Continuous variates”; FORMAT crude_estimate adjusted_estimate PVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3 ; crude_stderr adjusted_stderr ODDSR8.3 ; RUN; RUN; OPTION NOTES; OPTION NOTES; DATA &base; DATA &base; SET &base; SET &base; STOP; STOP; RUN; RUN; %MEND initbase; %MACRO analysisset(data =, var1 =, var1 =, var2 =, var2 =, variables = ) ; variables = ) ; DATA analysis_set ; DATA analysis_set ; SET &data(KEEP = &var1 &var2 &variables); SET &data(KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 THEN OUTPUT; IF NMISS(OF _numeric_) = 0 THEN OUTPUT; RUN; RUN; %MEND analysisset; %MEND analysisset; %MACRO analysisset(data =, var1 =, var1 =, var2 =, var2 =, variables = ) ; variables = ) ; DATA analysis_set ; DATA analysis_set ; SET &data(KEEP = &var1 &var2 &variables); SET &data(KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 THEN OUTPUT; IF NMISS(OF _numeric_) = 0 THEN OUTPUT; RUN; RUN; %MEND analysisset; %MEND analysisset; %MACRO procmeans(data =, var1 =, var1 =, var2 =); var2 =); ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUT summary=summary_means ODS OUTPUT summary=summary_means (DROP = &var1._mean &var1._n &var1._stderr (DROP = &var1._mean &var1._n &var1._stderr &var1._stddev &var1._stddev RENAME = (VNAME_&var1 = response_var RENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_label LABEL_&var1 = response_label VNAME_&var2 = key_var VNAME_&var2 = key_var LABEL_&var2 = key_label LABEL_&var2 = key_label &var2._mean = mean &var2._mean = mean &var2._n = n &var2._n = n &var2._stderr = stderror &var2._stderr = stderror &var2._stddev = stddev) ); &var2._stddev = stddev) ); PROC MEANS DATA= &data mean n stderr std; PROC MEANS DATA= &data mean n stderr std; VAR &var1 &var2; VAR &var1 &var2; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING; %MEND procmeans; %MEND procmeans; %MACRO procmeans(data =, var1 =, var1 =, var2 =); var2 =); ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUT summary=summary_means ODS OUTPUT summary=summary_means (DROP = &var1._mean &var1._n &var1._stderr (DROP = &var1._mean &var1._n &var1._stderr &var1._stddev &var1._stddev RENAME = (VNAME_&var1 = response_var RENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_label LABEL_&var1 = response_label VNAME_&var2 = key_var VNAME_&var2 = key_var LABEL_&var2 = key_label LABEL_&var2 = key_label &var2._mean = mean &var2._mean = mean &var2._n = n &var2._n = n &var2._stderr = stderror &var2._stderr = stderror &var2._stddev = stddev) ); &var2._stddev = stddev) ); PROC MEANS DATA= &data mean n stderr std; PROC MEANS DATA= &data mean n stderr std; VAR &var1 &var2; VAR &var1 &var2; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING; %MEND procmeans; %MEND procmeans; %MACRO split(vars=, control=); %LOCAL count varlist chars; %IF &vars NE %THEN %DO; %IF &control NE %THEN %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)) ; %LET count = %EVAL(&count+1); %END ; %END; %ELSE %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %MACRO split(vars=, control=); %LOCAL count varlist chars; %IF &vars NE %THEN %DO; %IF &control NE %THEN %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)) ; %LET count = %EVAL(&count+1); %END ; %END; %ELSE %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i datasets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :datasets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&datasets,&i,%STR( )))); PROC SORT DATA=%SCAN(&datasets,&i,%STR( )); BY &merge_var; RUN; %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &datasets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; %MEND summaryset; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i datasets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :datasets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&datasets,&i,%STR( )))); PROC SORT DATA=%SCAN(&datasets,&i,%STR( )); BY &merge_var; RUN; %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &datasets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; %MEND summaryset;

234 SUMMARYSET( ) %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates = summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE =(UPCASE(key_var)=UPCASE("&independent"))) ; PROC GLM DATA=&data NAMELEN=32; %IF (NOT %LENGTH(%SCAN(&class_vars,1))) %THEN CLASS &class_vars ; ; MODEL &response = &continuous_vars &class_vars &independent; QUIT; ODS OUTPUT CLOSE; ODS LISTING; %MEND procglm; %MACRO procglm (test =, data =, response =, independent =, class_vars =, continuous_vars = ); ODS LISTING CLOSE; ODS OUTPUT parameterestimates = summary_&test._glm (DROP = dependent probt tvalue RENAME = (Parameter = Key_var Estimate = &test._Estimate stderr = &test._stderr) WHERE =(UPCASE(key_var)=UPCASE("&independent"))) ; PROC GLM DATA=&data NAMELEN=32; %IF (NOT %LENGTH(%SCAN(&class_vars,1))) %THEN CLASS &class_vars ; ; MODEL &response = &continuous_vars &class_vars &independent; QUIT; ODS OUTPUT CLOSE; ODS LISTING; %MEND procglm; %MACRO initbase(base=); OPTION NONOTES; OPTION NONOTES; DATA &base; DATA &base; LENGTH key_var response_var $32 LENGTH key_var response_var $32 key_label response_label $40 key_label response_label $40 class_vars continuous_vars $200 class_vars continuous_vars $200 mean stddev stderror n mean stddev stderror n crude_estimate adjusted_estimate crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; crude_stderr adjusted_stderr 8.; LABEL key_var = "Name of Independent Variable" LABEL key_var = "Name of Independent Variable" key_label = "Label of Independent Variable" key_label = "Label of Independent Variable" response_var = "Name of Response Variable" response_var = "Name of Response Variable" response_label = "Label of Response Variable" response_label = "Label of Response Variable" mean = "PROC MEANS: Mean of Independent Variable" mean = "PROC MEANS: Mean of Independent Variable" n = "PROC MEANS: N of Independent Variable" n = "PROC MEANS: N of Independent Variable" stddev = "PROC MEANS: Standard Deviation Variable" stddev = "PROC MEANS: Standard Deviation Variable" stderror = "PROC MEANS: Standard Error IndeVariable" stderror = "PROC MEANS: Standard Error IndeVariable" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" class_vars = “Adjusted PROC GLM: Class covariates” class_vars = “Adjusted PROC GLM: Class covariates” continuous_vars = “Adjusted PROC GLM: Continuous variates”; continuous_vars = “Adjusted PROC GLM: Continuous variates”; FORMAT crude_estimate adjusted_estimate PVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3 ; crude_stderr adjusted_stderr ODDSR8.3 ; RUN; RUN; OPTION NOTES; OPTION NOTES; DATA &base; DATA &base; SET &base; SET &base; STOP; STOP; RUN; RUN; %MEND initbase; %MACRO initbase(base=); OPTION NONOTES; OPTION NONOTES; DATA &base; DATA &base; LENGTH key_var response_var $32 LENGTH key_var response_var $32 key_label response_label $40 key_label response_label $40 class_vars continuous_vars $200 class_vars continuous_vars $200 mean stddev stderror n mean stddev stderror n crude_estimate adjusted_estimate crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; crude_stderr adjusted_stderr 8.; LABEL key_var = "Name of Independent Variable" LABEL key_var = "Name of Independent Variable" key_label = "Label of Independent Variable" key_label = "Label of Independent Variable" response_var = "Name of Response Variable" response_var = "Name of Response Variable" response_label = "Label of Response Variable" response_label = "Label of Response Variable" mean = "PROC MEANS: Mean of Independent Variable" mean = "PROC MEANS: Mean of Independent Variable" n = "PROC MEANS: N of Independent Variable" n = "PROC MEANS: N of Independent Variable" stddev = "PROC MEANS: Standard Deviation Variable" stddev = "PROC MEANS: Standard Deviation Variable" stderror = "PROC MEANS: Standard Error IndeVariable" stderror = "PROC MEANS: Standard Error IndeVariable" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_estimate = "Crude PROC GLM: Parameter Estimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" crude_stderr = "Crude PROC GLM: Standard Error stimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" djusted_estimate = "Adjusted PROC GLM: Parameter Estimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" adjusted_stderr = "Adjusted PROC GLM: Standard ErrEstimate" class_vars = “Adjusted PROC GLM: Class covariates” class_vars = “Adjusted PROC GLM: Class covariates” continuous_vars = “Adjusted PROC GLM: Continuous variates”; continuous_vars = “Adjusted PROC GLM: Continuous variates”; FORMAT crude_estimate adjusted_estimate PVALUE6.4 FORMAT crude_estimate adjusted_estimate PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3 ; crude_stderr adjusted_stderr ODDSR8.3 ; RUN; RUN; OPTION NOTES; OPTION NOTES; DATA &base; DATA &base; SET &base; SET &base; STOP; STOP; RUN; RUN; %MEND initbase; %MACRO analysisset(data =, var1 =, var1 =, var2 =, var2 =, variables = ) ; variables = ) ; DATA analysis_set ; DATA analysis_set ; SET &data(KEEP = &var1 &var2 &variables); SET &data(KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 THEN OUTPUT; IF NMISS(OF _numeric_) = 0 THEN OUTPUT; RUN; RUN; %MEND analysisset; %MEND analysisset; %MACRO analysisset(data =, var1 =, var1 =, var2 =, var2 =, variables = ) ; variables = ) ; DATA analysis_set ; DATA analysis_set ; SET &data(KEEP = &var1 &var2 &variables); SET &data(KEEP = &var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 THEN OUTPUT; IF NMISS(OF _numeric_) = 0 THEN OUTPUT; RUN; RUN; %MEND analysisset; %MEND analysisset; %MACRO procmeans(data =, var1 =, var1 =, var2 =); var2 =); ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUT summary=summary_means ODS OUTPUT summary=summary_means (DROP = &var1._mean &var1._n &var1._stderr (DROP = &var1._mean &var1._n &var1._stderr &var1._stddev &var1._stddev RENAME = (VNAME_&var1 = response_var RENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_label LABEL_&var1 = response_label VNAME_&var2 = key_var VNAME_&var2 = key_var LABEL_&var2 = key_label LABEL_&var2 = key_label &var2._mean = mean &var2._mean = mean &var2._n = n &var2._n = n &var2._stderr = stderror &var2._stderr = stderror &var2._stddev = stddev) ); &var2._stddev = stddev) ); PROC MEANS DATA= &data mean n stderr std; PROC MEANS DATA= &data mean n stderr std; VAR &var1 &var2; VAR &var1 &var2; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING; %MEND procmeans; %MEND procmeans; %MACRO procmeans(data =, var1 =, var1 =, var2 =); var2 =); ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUT summary=summary_means ODS OUTPUT summary=summary_means (DROP = &var1._mean &var1._n &var1._stderr (DROP = &var1._mean &var1._n &var1._stderr &var1._stddev &var1._stddev RENAME = (VNAME_&var1 = response_var RENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_label LABEL_&var1 = response_label VNAME_&var2 = key_var VNAME_&var2 = key_var LABEL_&var2 = key_label LABEL_&var2 = key_label &var2._mean = mean &var2._mean = mean &var2._n = n &var2._n = n &var2._stderr = stderror &var2._stderr = stderror &var2._stddev = stddev) ); &var2._stddev = stddev) ); PROC MEANS DATA= &data mean n stderr std; PROC MEANS DATA= &data mean n stderr std; VAR &var1 &var2; VAR &var1 &var2; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING; %MEND procmeans; %MEND procmeans; %MACRO split(vars=, control=); %LOCAL count varlist chars; %IF &vars NE %THEN %DO; %IF &control NE %THEN %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)) ; %LET count = %EVAL(&count+1); %END ; %END; %ELSE %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %MACRO split(vars=, control=); %LOCAL count varlist chars; %IF &vars NE %THEN %DO; %IF &control NE %THEN %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %SUBSTR(&var,1,1)=&control %THEN %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control)) ; %LET count = %EVAL(&count+1); %END ; %END; %ELSE %DO; %LET count=1 ; %DO %UNTIL (%QSCAN(&vars,&count)= ) ; %LET var = %QSCAN(&vars,&count); %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %QSCAN(&vars,&count) ; %LET count = %EVAL(&count+1); %END ; %END; %END; %MEND split; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO validate(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __vars =, __vars =, __out = ); __out = ); %GLOBAL _echeck ; %GLOBAL _echeck ; %LET _echeck=0 ; %LET _echeck=0 ; %LET _indflag=0 ; %LET _indflag=0 ; %* check that DATA exists *; %* check that DATA exists *; %IF &__dset = %STR( ) %THEN %DO; %IF &__dset = %STR( ) %THEN %DO; %let ex=NO ; %let ex=NO ; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %do ; %else %do ; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %if %sysfunc(exist(&__dset)) %then %let ex=YES; %else %let ex=NO ; %else %let ex=NO ; %end ; %end ; %if &ex=NO %then %do ; %if &ex=NO %then %do ; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end; %end; %* check input parameters *; %* check input parameters *; %let dsnid = %sysfunc(open(&__dset)) ; %let dsnid = %sysfunc(open(&__dset)) ; %* check that response variable exists *; %* check that response variable exists *; %if &__var1 = %str( ) %then %do; %if &__var1 = %str( ) %then %do; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING; %let _echeck=1 ; %let _echeck=1 ; %end ; %end ; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %else %if %sysfunc(varnum(&dsnid,&__var1))=0 %then %do; %let _echeck=1 ; %let _echeck=1 ; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.; %end; %end; %* check that response variable is numeric *; %* check that response variable is numeric *; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i datasets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :datasets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&datasets,&i,%STR( )))); PROC SORT DATA=%SCAN(&datasets,&i,%STR( )); BY &merge_var; RUN; %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &datasets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; %MEND summaryset; %MACRO summaryset(merge_var =, base =, setlist =, delsets =, class_vars =, continuous_vars = ); %LOCAL i datasets; PROC SQL NOPRINT ; SELECT TRIM(LIBNAME) || "." || MEMNAME INTO :datasets SEPARATED BY " " FROM DICTIONARY.TABLES WHERE LIBNAME = "WORK" AND MEMNAME LIKE UPCASE("&setlist%"); QUIT ; %LET i= 1; %DO %UNTIL (NOT %LENGTH(%SCAN(&datasets,&i,%STR( )))); PROC SORT DATA=%SCAN(&datasets,&i,%STR( )); BY &merge_var; RUN; %LET i = %EVAL(&i+1); %END; DATA summary_; MERGE &datasets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN; PROC APPEND BASE=&base DATA=&setlist FORCE; RUN; PROC DATASETS; DELETE &setlist: &delsets / MEMTYPE = DATA; QUIT; %MEND summaryset;

235 %MACRO supervisor(dataset =, %MACRO supervisor(dataset =, response =, response =, independent =, independent =, covariates =, covariates =, outfile =, outfile =, report = ); report = ); %LOCAL echeck; %LOCAL echeck; %LET response = %UPCASE(&response); %LET response = %UPCASE(&response); %LET independent = %UPCASE(&independent); %LET independent = %UPCASE(&independent); %validate(dset = &dataset, %validate(dset = &dataset, var1 = &response, var1 = &response, var2 = &independent, var2 = &independent, basevs = &covariates, basevs = &covariates, out = &outfile ) out = &outfile ) %IF &echeck = 1 %THEN %RETURN; %IF &echeck = 1 %THEN %RETURN; %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); %LET class_vars =%split(vars=&covariates,control=); %LET class_vars =%split(vars=&covariates,control=); %LET continuous_vars =%split(vars=&covariates,control=@); %LET continuous_vars =%split(vars=&covariates,control=@); %analysisset(data = &dataset, %analysisset(data = &dataset, var1 = &response, var1 = &response, var2 = &independent, var2 = &independent, variables = &class_vars &continuous_vars ) variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, %procmeans(data = analysis_set, var1 = &response, var1 = &response, var2 = &independent ) var2 = &independent ) %procglm (test = Crude, %procglm (test = Crude, data = analysis_set, data = analysis_set, response = &response, response = &response, independent = &independent ) independent = &independent ) %procglm (test = Adjusted, %procglm (test = Adjusted, data = analysis_set, data = analysis_set, response = &response, response = &response, independent = &independent, independent = &independent, class_vars = &class_vars, class_vars = &class_vars, continuous_vars = &continuous_vars ) continuous_vars = &continuous_vars ) %summaryset(merge_var = key_var, %summaryset(merge_var = key_var, base = GLM_summary, base = GLM_summary, setlist = SUMMARY_, setlist = SUMMARY_, delsets = analysis_set, delsets = analysis_set, class_vars = &class_vars, class_vars = &class_vars, continuous_vars = &continuous_vars) continuous_vars = &continuous_vars) %IF %UPCASE(&report) = YES %THEN %PrintReport(data=&outfile); %IF %UPCASE(&report) = YES %THEN %PrintReport(data=&outfile); %MEND supervisor; %MEND supervisor; %MACRO supervisor(dataset =, %MACRO supervisor(dataset =, response =, response =, independent =, independent =, covariates =, covariates =, outfile =, outfile =, report = ); report = ); %LOCAL echeck; %LOCAL echeck; %LET response = %UPCASE(&response); %LET response = %UPCASE(&response); %LET independent = %UPCASE(&independent); %LET independent = %UPCASE(&independent); %validate(dset = &dataset, %validate(dset = &dataset, var1 = &response, var1 = &response, var2 = &independent, var2 = &independent, basevs = &covariates, basevs = &covariates, out = &outfile ) out = &outfile ) %IF &echeck = 1 %THEN %RETURN; %IF &echeck = 1 %THEN %RETURN; %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); %LET class_vars =%split(vars=&covariates,control=); %LET class_vars =%split(vars=&covariates,control=); %LET continuous_vars =%split(vars=&covariates,control=@); %LET continuous_vars =%split(vars=&covariates,control=@); %analysisset(data = &dataset, %analysisset(data = &dataset, var1 = &response, var1 = &response, var2 = &independent, var2 = &independent, variables = &class_vars &continuous_vars ) variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, %procmeans(data = analysis_set, var1 = &response, var1 = &response, var2 = &independent ) var2 = &independent ) %procglm (test = Crude, %procglm (test = Crude, data = analysis_set, data = analysis_set, response = &response, response = &response, independent = &independent ) independent = &independent ) %procglm (test = Adjusted, %procglm (test = Adjusted, data = analysis_set, data = analysis_set, response = &response, response = &response, independent = &independent, independent = &independent, class_vars = &class_vars, class_vars = &class_vars, continuous_vars = &continuous_vars ) continuous_vars = &continuous_vars ) %summaryset(merge_var = key_var, %summaryset(merge_var = key_var, base = GLM_summary, base = GLM_summary, setlist = SUMMARY_, setlist = SUMMARY_, delsets = analysis_set, delsets = analysis_set, class_vars = &class_vars, class_vars = &class_vars, continuous_vars = &continuous_vars) continuous_vars = &continuous_vars) %IF %UPCASE(&report) = YES %THEN %PrintReport(data=&outfile); %IF %UPCASE(&report) = YES %THEN %PrintReport(data=&outfile); %MEND supervisor; %MEND supervisor; SUPERVISOR( )

236 MACRO %MACRO supervisor;;(dataset =, response =, independent =, covariates =, outfile =, report = ); MACRO %MACRO supervisor;;(dataset =, response =, independent =, covariates =, outfile =, report = );

237 SUPERVISOR( ) MACRO %MACRO supervisor(dataset =, response =, independent =, covariates =, outfile =, report = ); MACRO %MACRO supervisor(dataset =, response =, independent =, covariates =, outfile =, report = );

238 SUPERVISOR( ) MACRO %MACRO supervisor(dataset =, response =, independent =, covariates =, outfile =, report = ); LOCAL %LOCAL echeck; MACRO %MACRO supervisor(dataset =, response =, independent =, covariates =, outfile =, report = ); LOCAL %LOCAL echeck;

239 SUPERVISOR( ) MACRO %MACRO supervisor(dataset =, response =, independent =, covariates =, outfile =, report = ); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); MACRO %MACRO supervisor(dataset =, response =, independent =, covariates =, outfile =, report = ); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent);

240 SUPERVISOR( ) response =, independent =, covariates =, outfile =, report = ); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); response =, independent =, covariates =, outfile =, report = ); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent);

241 SUPERVISOR( ) independent =, covariates =, outfile =, report = ); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); independent =, covariates =, outfile =, report = ); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent);

242 SUPERVISOR( ) covariates =, outfile =, report = ); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); covariates =, outfile =, report = ); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent);

243 SUPERVISOR( ) outfile =, report = ); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); outfile =, report = ); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent);

244 SUPERVISOR( ) report = ); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); report = ); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent);

245 SUPERVISOR( ) LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent);

246 SUPERVISOR( ) LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent);

247 SUPERVISOR( ) LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile )

248 SUPERVISOR( ) LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); &dataset %validate(dset = &dataset, &response var1 = &response, &independent var2 = &independent, &covariates basevs = &covariates, &outfile out = &outfile ) LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); &dataset %validate(dset = &dataset, &response var1 = &response, &independent var2 = &independent, &covariates basevs = &covariates, &outfile out = &outfile )

249 SUPERVISOR( ) LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN;

250 SUPERVISOR( ) LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile);

251 SUPERVISOR( ) LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile);

252 SUPERVISOR( ) LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile);

253 SUPERVISOR( ) LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile);

254 SUPERVISOR( ) %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile);

255 SUPERVISOR( ) %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile);

256 SUPERVISOR( ) var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile);

257 SUPERVISOR( ) var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile);

258 SUPERVISOR( ) basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile);

259 SUPERVISOR( ) out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile);

260 SUPERVISOR( ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile);

261 SUPERVISOR( ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile);

262 SUPERVISOR( ) IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile);

263 SUPERVISOR( ) IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); %LET class_vars =%split(vars=&covariates,control=); %LET continuous_vars=%split(vars=&covariates,control=@); IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); %LET class_vars =%split(vars=&covariates,control=); %LET continuous_vars=%split(vars=&covariates,control=@);

264 SUPERVISOR( ) IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); LET %LET class_vars =%split(vars=&covariates,control=); %LET continuous_vars=%split(vars=&covariates,control=@); IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); LET %LET class_vars =%split(vars=&covariates,control=); %LET continuous_vars=%split(vars=&covariates,control=@);

265 SUPERVISOR( ) IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); LET %LET class_vars =%split(vars=&covariates,control=); LET %LET continuous_vars=%split(vars=&covariates,control=@); IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); LET %LET class_vars =%split(vars=&covariates,control=); LET %LET continuous_vars=%split(vars=&covariates,control=@);

266 SUPERVISOR( ) IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); LET %LET class_vars =%split(vars=&covariates,control=); LET %LET continuous_vars=%split(vars=&covariates,control=@); %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); LET %LET class_vars =%split(vars=&covariates,control=); LET %LET continuous_vars=%split(vars=&covariates,control=@); %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars )

267 SUPERVISOR( ) IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); LET %LET class_vars =%split(vars=&covariates,control=); LET %LET continuous_vars=%split(vars=&covariates,control=@); %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); LET %LET class_vars =%split(vars=&covariates,control=); LET %LET continuous_vars=%split(vars=&covariates,control=@); %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent )

268 SUPERVISOR( ) %initbase(base=&outfile); LET %LET class_vars =%split(vars=&covariates,control=); LET %LET continuous_vars=%split(vars=&covariates,control=@); %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) %initbase(base=&outfile); LET %LET class_vars =%split(vars=&covariates,control=); LET %LET continuous_vars=%split(vars=&covariates,control=@); %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent )

269 SUPERVISOR( ) LET %LET class_vars =%split(vars=&covariates,control=); LET %LET continuous_vars=%split(vars=&covariates,control=@); %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) LET %LET class_vars =%split(vars=&covariates,control=); LET %LET continuous_vars=%split(vars=&covariates,control=@); %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent )

270 SUPERVISOR( ) LET %LET class_vars =%split(vars=&covariates,control=); LET %LET continuous_vars=%split(vars=&covariates,control=@); %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) LET %LET class_vars =%split(vars=&covariates,control=); LET %LET continuous_vars=%split(vars=&covariates,control=@); %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent )

271 SUPERVISOR( ) LET %LET continuous_vars=%split(vars=&covariates,control=@); %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) LET %LET continuous_vars=%split(vars=&covariates,control=@); %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent )

272 SUPERVISOR( ) %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent )

273 SUPERVISOR( ) %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent )

274 SUPERVISOR( ) var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent )

275 SUPERVISOR( ) var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent )

276 SUPERVISOR( ) variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent )

277 SUPERVISOR( ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent )

278 SUPERVISOR( ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent )

279 SUPERVISOR( ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) Crude %procglm (test = Crude, data = analysis_set, response = &response, independent = &independent ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) Crude %procglm (test = Crude, data = analysis_set, response = &response, independent = &independent )

280 SUPERVISOR( ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) Crude %procglm (test = Crude, data = analysis_set, response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) Crude %procglm (test = Crude, data = analysis_set, response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars )

281 Crude_ Crude_ key_var Estimate StdErr years_on_farm 0.0299 0.0011 Adjusted_ Adjusted_ key_var Estimate StdErr years_on_farm 0.0139 0.0019SUMMARY_MEANSSUMMARY_CRUDE_GLMSUMMARY_ADJUSTED_GLM key_var response_var mean n stderr stddev years_on_farm bmi 36.213 53482 0.079 18.259

282 SUPERVISOR( ) var1 = &response, var2 = &independent ) Crude %procglm (test = Crude, data = analysis_set, response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) var1 = &response, var2 = &independent ) Crude %procglm (test = Crude, data = analysis_set, response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars )

283 SUPERVISOR( ) var2 = &independent ) Crude %procglm (test = Crude, data = analysis_set, response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) var2 = &independent ) Crude %procglm (test = Crude, data = analysis_set, response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars )

284 SUPERVISOR( ) Crude %procglm (test = Crude, data = analysis_set, response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) Crude %procglm (test = Crude, data = analysis_set, response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars )

285 SUPERVISOR( ) Crude %procglm (test = Crude, data = analysis_set, response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) Crude %procglm (test = Crude, data = analysis_set, response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars )

286 SUPERVISOR( ) data = analysis_set, response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) data = analysis_set, response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars )

287 SUPERVISOR( ) response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars )

288 SUPERVISOR( ) independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars )

289 SUPERVISOR( ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars )

290 SUPERVISOR( ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars )

291 SUPERVISOR( ) data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars )

292 SUPERVISOR( ) data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) %summaryset(merge_var = key_var, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars, continuous_vars = &continuous_vars) data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) %summaryset(merge_var = key_var, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars, continuous_vars = &continuous_vars)

293 The CONTENTS Procedure (abbreviated) Data Set Name WORK.GLM_SUMMARY Observations 1 # Variable Type Len Format Label 1 key_var Char 32 Name of Independent Variable 2 response_var Char 32 Name of Response Variable 3 key_label Char 40 Label of Independent Variable 4 response_label Char 40 Label of Response Variable 5 class_vars Char 200 Adjusted PROC GLM: Class covariates 6 continuous_vars Char 200 Adjusted PROC GLM: Continuous covariates 7 mean Num 8 PROC MEANS: Mean of Independent Variable 8 stddev Num 8 PROC MEANS: Standard Deviation of Independent Variable 9 stderror Num 8 PROC MEANS: Standard Error of Independent Variable 10 n Num 8 PROC MEANS: N of Independent Variable 11 crude_estimate Num 8 PVALUE6.4 Crude PROC GLM: Parameter Estimate 12 adjusted_estimate Num 8 PVALUE6.4 Adjusted PROC GLM: Parameter Estimate 13 crude_stderr Num 8 ODDSR8.3 Crude PROC GLM: Standard Error of Estimate 14 adjusted_stderr Num 8 ODDSR8.3 Adjusted PROC GLM: Standard Error of Estimate Creates the GLM_SUMMARY Data Set

294 SUPERVISOR( ) data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) %summaryset(merge_var = key_var, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars, continuous_vars = &continuous_vars) IFUPCASETHEN %IF %UPCASE(&report) = YES %THEN %PrintReport(data=&outfile); data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) %summaryset(merge_var = key_var, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars, continuous_vars = &continuous_vars) IFUPCASETHEN %IF %UPCASE(&report) = YES %THEN %PrintReport(data=&outfile);

295 SUPERVISOR( ) data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) %summaryset(merge_var = key_var, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars, continuous_vars = &continuous_vars) IFUPCASETHEN %IF %UPCASE(&report) = YES %THEN %PrintReport(data=&outfile); MEND %MEND supervisor; data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) %summaryset(merge_var = key_var, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars, continuous_vars = &continuous_vars) IFUPCASETHEN %IF %UPCASE(&report) = YES %THEN %PrintReport(data=&outfile); MEND %MEND supervisor;

296 Two Invocatoins of the Macro %supervisor(dataset = mydata, response = bmi, independent = years_on_farm, covariates = @age race gender @height, outfile = glm_summary, report = NO) %supervisor(dataset = mydata, response = bmi, independent = acres, covariates = @age race gender @height, outfile = glm_summary, YES report = YES) %supervisor(dataset = mydata, response = bmi, independent = years_on_farm, covariates = @age race gender @height, outfile = glm_summary, report = NO) %supervisor(dataset = mydata, response = bmi, independent = acres, covariates = @age race gender @height, outfile = glm_summary, YES report = YES)

297 Produce the Following Report Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Std Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) ------------------------------------------------------------------------ Years lived on farm 36.21 0.08 28166 0.030 0.001 0.021 0.002 Acres planted crops 47.03 0.04 28209 0.022 0.001 0.024 0.002

298 Produce the Following Report Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Std Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) ------------------------------------------------------------------------ 36.21 0.08 28166 Years lived on farm 36.21 0.08 28166 0.030 0.001 0.021 0.002 47.03 0.04 28209 Acres planted crops 47.03 0.04 28209 0.022 0.001 0.024 0.002 (a) PROC MEANS

299 Produce the Following Report Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Std Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) ------------------------------------------------------------------------ 36.21 0.08 281660.030 0.001 Years lived on farm 36.21 0.08 28166 0.030 0.001 0.021 0.002 47.03 0.04 282090.022 0.001 Acres planted crops 47.03 0.04 28209 0.022 0.001 0.024 0.002 (a)PROC MEANS (b)Crude PROC GLM

300 Produce the Following Report Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Std Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) ------------------------------------------------------------------------ 36.21 0.08 281660.030 0.0010.021 0.002 Years lived on farm 36.21 0.08 28166 0.030 0.001 0.021 0.002 47.03 0.04 282090.022 0.0010.024 0.002 Acres planted crops 47.03 0.04 28209 0.022 0.001 0.024 0.002 (a)PROC MEANS (b)Crude PROC GLM (c)Adjusted PROC GLM

301 Flexibility of the Design

302 Change from a Linear to a Logistic Regression Analysis

303 Flexibility of the Design Change from a Linear to a Logistic Regression Analysis In this Example we are Switching from a Continuous to a Categorical Independent Variable

304 Five Main Changes Change from Analysis of Variance to Logistic Regression Alter the Continuous Independent Variable to Categorical

305 Five Main Changes 1.Adjust BASE data set to handle the new analysis

306 Five Main Changes 1.Adjust BASE data set to handle the new analysis 2.Replace the PROCMEANS module with a PROCFREQ module

307 Five Main Changes 1.Adjust BASE data set to handle the new analysis 2.Replace the PROCMEANS module with a PROCFREQ module 3.Replace the PROCGLM module with a PROCLOGISTIC module

308 Five Main Changes 1.Adjust BASE data set to handle the new analysis 2.Replace the PROCMEANS module with a PROCFREQ module 3.Replace the PROCGLM module with a PROCLOGISTIC module 4.Add a parameter passed to the SUPERVISOR( ) macro to identify the referent level of the independent variable

309 Five Main Changes 1.Adjust BASE data set to handle the new analysis 2.Replace the PROCMEANS module with a PROCFREQ module 3.Replace the PROCGLM module with a PROCLOGISTIC module 4.Add a parameter passed to the SUPERVISOR( ) macro to identify the referent level of the independent variable 5.The key variable will change from the name of the independent variable (key_var) to its value (key_value)

310 INITBASE( )

311 PROCFREQ( ) Macro Module

312 Produce a dataset of counts & percentages

313 PROCFREQ( ) Macro Module Produce a dataset of counts & percentages PROC FREQ

314 The FREQ Procedure Table of DaysMix by asthma DaysMix(Average days per year mixed pesticides) asthma (Ever Diagnosed with asthma) Frequency‚ Percent ‚ Row Pct ‚ Col Pct ‚No ‚Yes ‚ Total ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ None ‚ 6658 ‚ 346 ‚ 7004 ‚ 38.15 ‚ 1.98 ‚ 40.14 ‚ 95.06 ‚ 4.94 ‚ ‚ 39.84 ‚ 46.95 ‚ ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ 1-90 Days‚ 6358 ‚ 278 ‚ 6636 ‚ 36.44 ‚ 1.59 ‚ 38.03 ‚ 95.81 ‚ 4.19 ‚ ‚ 38.04 ‚ 37.72 ‚ ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ > 90 Days‚ 3697 ‚ 113 ‚ 3810 ‚ 21.19 ‚ 0.65 ‚ 21.83 ‚ 97.03 ‚ 2.97 ‚ ‚ 22.12 ‚ 15.33 ‚ ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ Total 16713 737 17450 95.78 4.22 100.00 Frequency Missing = 4945

315 The FREQ Procedure Table of DaysMix by asthma DaysMix(Average days per year mixed pesticides) asthma (Ever Diagnosed with asthma) Frequency‚ Percent ‚ Row Pct ‚ Col Pct ‚No ‚Yes ‚ Total ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ 6658 346 None ‚ 6658 ‚ 346 ‚ 7004 ‚ 38.15 ‚ 1.98 ‚ 40.14 ‚ 95.06 ‚ 4.94 ‚ 39.8446.95 ‚ 39.84 ‚ 46.95 ‚ ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ 6358278 1-90 Days‚ 6358 ‚ 278 ‚ 6636 ‚ 36.44 ‚ 1.59 ‚ 38.03 ‚ 95.81 ‚ 4.19 ‚ 38.04 37.72 ‚ 38.04 ‚ 37.72 ‚ ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ 3697 113 > 90 Days‚ 3697 ‚ 113 ‚ 3810 ‚ 21.19 ‚ 0.65 ‚ 21.83 ‚ 97.03 ‚ 2.97 ‚ 22.1215.33 ‚ 22.12 ‚ 15.33 ‚ ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ Total 16713 737 17450 95.78 4.22 100.00 Frequency Missing = 4945

316 %MACRO ctab(__dset =, __col_var =, __row_var = ); ODS LISTING CLOSE; ODS OUTPUT CrossTabFreqs = __ctab (KEEP = &__col_var &__row_var _TYPE_ FREQUENCY COLPERCENT); PROC FREQ DATA PROC FREQ DATA=&data; TABLES TABLES &row_var * &col_var; RUN RUN; ODS OUTPUT CLOSE; ODS LISTING; %MACRO ctab(__dset =, __col_var =, __row_var = ); ODS LISTING CLOSE; ODS OUTPUT CrossTabFreqs = __ctab (KEEP = &__col_var &__row_var _TYPE_ FREQUENCY COLPERCENT); PROC FREQ DATA PROC FREQ DATA=&data; TABLES TABLES &row_var * &col_var; RUN RUN; ODS OUTPUT CLOSE; ODS LISTING; PROCFREQ( )

317 %MACRO ctab(__dset =, __col_var =, __row_var = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT CrossTabFreqs = summary_freq KEEP (KEEP = &col_var &row_var _TYPE_ FREQUENCY COLPERCENT); PROC FREQ DATA PROC FREQ DATA=&data; TABLES TABLES &row_var * &col_var; RUN RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; %MACRO ctab(__dset =, __col_var =, __row_var = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT CrossTabFreqs = summary_freq KEEP (KEEP = &col_var &row_var _TYPE_ FREQUENCY COLPERCENT); PROC FREQ DATA PROC FREQ DATA=&data; TABLES TABLES &row_var * &col_var; RUN RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; PROCFREQ( )

318 %MACRO ctab(__dset =, __col_var =, __row_var = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT CrossTabFreqs = summary_freq KEEP (KEEP = &col_var &row_var _TYPE_ FREQUENCY COLPERCENT); WHERE WHERE = (_type_="11")); PROC FREQ DATA PROC FREQ DATA=&data; TABLES TABLES &row_var * &col_var; RUN RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; %MACRO ctab(__dset =, __col_var =, __row_var = ); ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT CrossTabFreqs = summary_freq KEEP (KEEP = &col_var &row_var _TYPE_ FREQUENCY COLPERCENT); WHERE WHERE = (_type_="11")); PROC FREQ DATA PROC FREQ DATA=&data; TABLES TABLES &row_var * &col_var; RUN RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING; PROCFREQ( )

319 %MACRO ctab(__dset =, __col_var =, __row_var = ); ODS LISTING CLOSE ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT CrossTabFreqs = summary_freq KEEP (KEEP = &col_var &row_var _TYPE_ FREQUENCY COLPERCENT); WHERE WHERE = (_type_="11")); PROC FREQ DATA PROC FREQ DATA=&data; TABLES TABLES &row_var * &col_var; RUN RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING ODS LISTING; %MACRO ctab(__dset =, __col_var =, __row_var = ); ODS LISTING CLOSE ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT CrossTabFreqs = summary_freq KEEP (KEEP = &col_var &row_var _TYPE_ FREQUENCY COLPERCENT); WHERE WHERE = (_type_="11")); PROC FREQ DATA PROC FREQ DATA=&data; TABLES TABLES &row_var * &col_var; RUN RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING ODS LISTING; PROCFREQ( )

320 MACRO %MACRO ctab(data =, col_var =, row_var = ); ODS LISTING CLOSE ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT CrossTabFreqs = summary_freq KEEP (KEEP = &col_var &row_var _TYPE_ FREQUENCY COLPERCENT) WHERE WHERE = (_type_="11")); PROC FREQ DATA PROC FREQ DATA=&data; TABLES TABLES &row_var * &col_var; RUN RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING ODS LISTING; MACRO %MACRO ctab(data =, col_var =, row_var = ); ODS LISTING CLOSE ODS LISTING CLOSE; ODS OUTPUT ODS OUTPUT CrossTabFreqs = summary_freq KEEP (KEEP = &col_var &row_var _TYPE_ FREQUENCY COLPERCENT) WHERE WHERE = (_type_="11")); PROC FREQ DATA PROC FREQ DATA=&data; TABLES TABLES &row_var * &col_var; RUN RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS LISTING ODS LISTING; PROCFREQ( )

321 Row Col Obs DaysMix asthma _type_ Frequency Percent Percent Percent Missing 116658 39.8373 1 None No 11 6658 38.155 95.0600 39.8373. 11 346 46.9471 2 None Yes 11 346 1.983 4.9400 46.9471. 3 None. 10 7004 40.138... 11 6358 38.0422 4 1-90 Days No 11 6358 36.436 95.8107 38.0422. 11 278 37.7205 5 1-90 Days Yes 11 278 1.593 4.1893 37.7205. 6 1-90 Days. 10 6636 38.029... 113697 22.1205 7 > 90 Days No 11 3697 21.186 97.0341 22.1205. 11 113 15.3324 8 > 90 Days Yes 11 113 0.648 2.9659 15.3324. 9 > 90 Days. 10 3810 21.834... 10. No 01 16713 95.777... 11. Yes 01 737 4.223... 12.. 00 17450 100.000.. 4945 PROCFREQ( )

322 Row Col Obs DaysMix asthma _type_ Frequency Percent Percent Percent Missing 116658 39.8373 1 None No 11 6658 38.155 95.0600 39.8373. 11 346 46.9471 2 None Yes 11 346 1.983 4.9400 46.9471. 3 None. 10 7004 40.138... 11 6358 38.0422 4 1-90 Days No 11 6358 36.436 95.8107 38.0422. 11 278 37.7205 5 1-90 Days Yes 11 278 1.593 4.1893 37.7205. 6 1-90 Days. 10 6636 38.029... 113697 22.1205 7 > 90 Days No 11 3697 21.186 97.0341 22.1205. 11 113 15.3324 8 > 90 Days Yes 11 113 0.648 2.9659 15.3324. 9 > 90 Days. 10 3810 21.834... 10. No 01 16713 95.777... 11. Yes 01 737 4.223... 12.. 00 17450 100.000.. 4945 PROCFREQ( )

323 Row Col Obs DaysMix asthma _type_ Frequency Percent Percent Percent Missing 116658 39.8373 1 None No 11 6658 38.155 95.0600 39.8373. 11 346 46.9471 2 None Yes 11 346 1.983 4.9400 46.9471. 3 None. 10 7004 40.138... 11 6358 38.0422 4 1-90 Days No 11 6358 36.436 95.8107 38.0422. 11 278 37.7205 5 1-90 Days Yes 11 278 1.593 4.1893 37.7205. 6 1-90 Days. 10 6636 38.029... 113697 22.1205 7 > 90 Days No 11 3697 21.186 97.0341 22.1205. 11 113 15.3324 8 > 90 Days Yes 11 113 0.648 2.9659 15.3324. 9 > 90 Days. 10 3810 21.834... 10. No 01 16713 95.777... 11. Yes 01 737 4.223... 12.. 00 17450 100.000.. 4945

324 PROCFREQ( ) Row Col Obs DaysMix asthma _type_ Frequency Percent Percent Percent Missing 116658 39.8373 1 None No 11 6658 38.155 95.0600 39.8373. 11 346 46.9471 2 None Yes 11 346 1.983 4.9400 46.9471. 3 None. 10 7004 40.138... 11 6358 38.0422 4 1-90 Days No 11 6358 36.436 95.8107 38.0422. 11 278 37.7205 5 1-90 Days Yes 11 278 1.593 4.1893 37.7205. 6 1-90 Days. 10 6636 38.029... 113697 22.1205 7 > 90 Days No 11 3697 21.186 97.0341 22.1205. 11 113 15.3324 8 > 90 Days Yes 11 113 0.648 2.9659 15.3324. 9 > 90 Days. 10 3810 21.834... 10. No 01 16713 95.777... 11. Yes 01 737 4.223... 12.. 00 17450 100.000.. 4945

325 DATAKEEP DATA summary_freq ( KEEP = key_value n_col1 p_col1 n_col2 p_col2 ) ; SET SET summary_freq ; BY BY &row_var &col_var; RETAIN RETAIN n_col1 p_col1; IF FIRST. IF FIRST.&row_var THEN DO; n_col1 = frequency; p_col1 = colpercent; ENDELSE END; ELSE IF LAST.THEN DO IF LAST.&row_var THEN DO; n_col2 = frequency; p_col2 = colpercent; key_value = &row_var ; OUTPUT OUTPUT summary_freq; END END; RUN RUN; MEND %MEND ctab; DATAKEEP DATA summary_freq ( KEEP = key_value n_col1 p_col1 n_col2 p_col2 ) ; SET SET summary_freq ; BY BY &row_var &col_var; RETAIN RETAIN n_col1 p_col1; IF FIRST. IF FIRST.&row_var THEN DO; n_col1 = frequency; p_col1 = colpercent; ENDELSE END; ELSE IF LAST.THEN DO IF LAST.&row_var THEN DO; n_col2 = frequency; p_col2 = colpercent; key_value = &row_var ; OUTPUT OUTPUT summary_freq; END END; RUN RUN; MEND %MEND ctab; PROCFREQ( )

326 DATAKEEP DATA summary_freq ( KEEP = key_value n_col1 p_col1 n_col2 p_col2 ) ; SET SET summary_freq; (WHERE = (_type_="11")); BY BY &row_var &col_var; RETAIN n_col1 p_col1; RETAIN n_col1 p_col1; IF FIRST. IF FIRST.&row_var THEN DO; n_col1 = frequency; p_col1 = colpercent; ENDELSE END; ELSE IF LAST.THEN DO IF LAST.&row_var THEN DO; n_col2 = frequency; p_col2 = colpercent; key_value = &row_var ; OUTPUT OUTPUT summary_freq; END END; RUN RUN; MEND %MEND ctab; DATAKEEP DATA summary_freq ( KEEP = key_value n_col1 p_col1 n_col2 p_col2 ) ; SET SET summary_freq; (WHERE = (_type_="11")); BY BY &row_var &col_var; RETAIN n_col1 p_col1; RETAIN n_col1 p_col1; IF FIRST. IF FIRST.&row_var THEN DO; n_col1 = frequency; p_col1 = colpercent; ENDELSE END; ELSE IF LAST.THEN DO IF LAST.&row_var THEN DO; n_col2 = frequency; p_col2 = colpercent; key_value = &row_var ; OUTPUT OUTPUT summary_freq; END END; RUN RUN; MEND %MEND ctab;

327 PROCFREQ( ) DATAKEEP DATA summary_freq ( KEEP = key_value n_col1 p_col1 n_col2 p_col2 ) ; SET SET summary_freq; (WHERE = (_type_="11")); BY BY &row_var &col_var; RETAIN RETAIN n_col1 p_col1; IF FIRST. IF FIRST.&row_var THEN DO; n_col1 = frequency; p_col1 = colpercent; ENDELSE END; ELSE IF LAST.&row_var THEN DO; n_col2 = frequency; p_col2 = colpercent; key_value = &row_var ; OUTPUT summary_freq; END END; RUN RUN; MEND %MEND ctab; DATAKEEP DATA summary_freq ( KEEP = key_value n_col1 p_col1 n_col2 p_col2 ) ; SET SET summary_freq; (WHERE = (_type_="11")); BY BY &row_var &col_var; RETAIN RETAIN n_col1 p_col1; IF FIRST. IF FIRST.&row_var THEN DO; n_col1 = frequency; p_col1 = colpercent; ENDELSE END; ELSE IF LAST.&row_var THEN DO; n_col2 = frequency; p_col2 = colpercent; key_value = &row_var ; OUTPUT summary_freq; END END; RUN RUN; MEND %MEND ctab;

328 PROCFREQ( ) Row Col Obs DaysMix asthma _type_ Frequency Percent Percent Percent Missing None 116658 39.8373 1 None No 11 6658 38.155 95.0600 39.8373. None 11 346 46.9471 2 None Yes 11 346 1.983 4.9400 46.9471. 3 None. 10 7004 40.138... 1-90 Days11 6358 38.0422 4 1-90 Days No 11 6358 36.436 95.8107 38.0422. 1-90 Days11 278 37.7205 5 1-90 Days Yes 11 278 1.593 4.1893 37.7205. 6 1-90 Days. 10 6636 38.029... > 90 Days113697 22.1205 7 > 90 Days No 11 3697 21.186 97.0341 22.1205. > 90 Days11 113 15.3324 8 > 90 Days Yes 11 113 0.648 2.9659 15.3324. 9 > 90 Days. 10 3810 21.834... 10. No 01 16713 95.777... 11. Yes 01 737 4.223... 12.. 00 17450 100.000.. 4945

329 PROCFREQ( ) Row Col Obs Key_Value asthm a _type_ Frequency Percent Percent Percent Missing 0116658 39.8373 1 0 No 11 6658 38.155 95.0600 39.8373. 011 346 46.9471 2 0 Yes 11 346 1.983 4.9400 46.9471. 3 None. 10 7004 40.138... 111 6358 38.0422 4 1 N o 11 6358 36.436 95.8107 38.0422. 111 278 37.7205 5 1 Yes 11 278 1.593 4.1893 37.7205. 6 1-90 Days. 10 6636 38.029... 2 113697 22.1205 7 2 No 11 3697 21.186 97.0341 22.1205. 2 11 113 15.3324 8 2 Yes 11 113 0.648 2.9659 15.3324. 9 > 90 Days. 10 3810 21.834... 10. No 01 16713 95.777... 11. Yes 01 737 4.223... 12.. 00 17450 100.000.. 4945

330 Obs Key_Value asthma _type_ N_Col1 N_Col2 P_Col1 P_Col2 6658 34639.8373 46.9471 1 0 No 11 6658 346 39.8373 46.9471 2 0 Yes 11 346 1.983 4.9400 46.9471 3 None. 10 7004 40.138... 6358 27838.042237.7205 4 1 No 11 6358 278 38.0422 37.7205 5 1 Yes 11 278 1.593 4.1893 37.7205 6 1-90 Days. 10 6636 38.029... 3697 11322.120515.3324 7 2 No 11 3697 113 22.1205 15.3324 8 2 Yes 11 113 0.648 2.9659 15.3324 9 > 90 Days. 10 3810 21.834... 10. No 01 16713 95.777... 11. Yes 01 737 4.223... 12.. 00 17450 100.000.. 4945 PROCFREQ( )

331 The CONTENTS Procedure Data Set Name WORK.SUMMARY_FREQ Observations 3 Member Type DATA Variables 14 # Variable Type Len Format Label --------------------------------------------------------------------------------- 1 response_label Char 40 Label of Response Variable 2 response_value1 Char 40 Value for Level 1 of Response variable 3 response_fmt1 CHAR 40 Format value for Level 1 of Response var 4 response_value2 Char 40 Value for Level 2 of Response variable 5 response_fmt2 CHAR 40 Format value for Level 2 of Response var 6 response_name Char 32 Name of Response Variable 7 Key_label Char 40 Label of Independent Variable 10 Key_var Char 32 Name of Independent Variable 11 Key_value Num 8 Numeric Value of Independent Variable 12 Key_format Char 40 Encoded text value of Independent Variable 13 n_col1 Num 8 PROC FREQ Frequency of Column 1 14 p_col1 Num 8 PROC FREQ Percent of Column 1 13 n_col2 Num 8 PROC FREQ Frequency of Column 2 14 p_col2 Num 8 PROC FREQ Percent of Column 2 PROCFREQ( )

332 PROCLOGISTIC( )

333 %MACRO proclogistic(test =, data =, data =, response =, response =, independent =, independent =, ref =, ref =, class_vars =, class_vars =, continuous_vars = ); continuous_vars = ); PROC LOGISTIC DATA = &__dset DESCENDING; %MACRO proclogistic(test =, data =, data =, response =, response =, independent =, independent =, ref =, ref =, class_vars =, class_vars =, continuous_vars = ); continuous_vars = ); PROC LOGISTIC DATA = &__dset DESCENDING; PROCLOGISTIC( )

334 ODS LISTING CLOSE; ODS OUTPUT ParameterEstimates = __pe (KEEP = variable classval0 probchisq estimate StdErr RENAME = (ProbChiSq = &__test._p_value) ) OddsRatios = __or (KEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAME = (OddsRatioEst =&__test._OddsRatio LowerCL =&__test._LowerCL UpperCL = &__test._UpperCL ) ); PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; CLASSPARAMREFREF CLASS &independent (PARAM=REF REF="&ref"); MODEL &response = &independent ; MODEL &response = &independent ; &__class_vars &__continuous_vars FORMAT &__independent; RUN; RUN; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING CLOSE; ODS OUTPUT ParameterEstimates = __pe (KEEP = variable classval0 probchisq estimate StdErr RENAME = (ProbChiSq = &__test._p_value) ) OddsRatios = __or (KEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAME = (OddsRatioEst =&__test._OddsRatio LowerCL =&__test._LowerCL UpperCL = &__test._UpperCL ) ); PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; CLASSPARAMREFREF CLASS &independent (PARAM=REF REF="&ref"); MODEL &response = &independent ; MODEL &response = &independent ; &__class_vars &__continuous_vars FORMAT &__independent; RUN; RUN; ODS OUTPUT CLOSE; ODS LISTING; PROCLOGISTIC( )

335 ODS LISTING CLOSE; ODS OUTPUT ParameterEstimates = __pe (KEEP = variable classval0 probchisq estimate StdErr RENAME = (ProbChiSq = &__test._p_value) ) OddsRatios = __or (KEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAME = (OddsRatioEst =&__test._OddsRatio LowerCL =&__test._LowerCL UpperCL = &__test._UpperCL ) ); PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; CLASSPARAMREFREF CLASS &independent (PARAM=REF REF="&ref"); MODEL &response = &independent ; MODEL &response = &independent ; &__class_vars &__continuous_vars FORMAT &independent; RUN; RUN; ODS OUTPUT CLOSE; ODS LISTING CLOSE; ODS OUTPUT ParameterEstimates = __pe (KEEP = variable classval0 probchisq estimate StdErr RENAME = (ProbChiSq = &__test._p_value) ) OddsRatios = __or (KEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAME = (OddsRatioEst =&__test._OddsRatio LowerCL =&__test._LowerCL UpperCL = &__test._UpperCL ) ); PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; CLASSPARAMREFREF CLASS &independent (PARAM=REF REF="&ref"); MODEL &response = &independent ; MODEL &response = &independent ; &__class_vars &__continuous_vars FORMAT &independent; RUN; RUN; ODS OUTPUT CLOSE; PROCLOGISTIC( )

336 ODS LISTING CLOSE; ODS OUTPUT ParameterEstimates = ParameterEstimates (KEEP = variable classval0 probchisq estimate StdErr RENAME = (ProbChiSq = &__test._p_value) ) OddsRatios = OddsRatios; (KEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAME = (OddsRatioEst =&__test._OddsRatio LowerCL =&__test._LowerCL UpperCL = &__test._UpperCL ) ); PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; CLASS&class_vars PARAMREFREF CLASS &class_vars &independent (PARAM=REF REF="&ref"); MODEL &response = &independent MODEL &response = &independent &class_vars &continuous_vars ; &class_vars &continuous_vars ; FORMAT &independent; RUN; RUN; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING CLOSE; ODS OUTPUT ParameterEstimates = ParameterEstimates (KEEP = variable classval0 probchisq estimate StdErr RENAME = (ProbChiSq = &__test._p_value) ) OddsRatios = OddsRatios; (KEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAME = (OddsRatioEst =&__test._OddsRatio LowerCL =&__test._LowerCL UpperCL = &__test._UpperCL ) ); PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; CLASS&class_vars PARAMREFREF CLASS &class_vars &independent (PARAM=REF REF="&ref"); MODEL &response = &independent MODEL &response = &independent &class_vars &continuous_vars ; &class_vars &continuous_vars ; FORMAT &independent; RUN; RUN; ODS OUTPUT CLOSE; ODS LISTING; PROCLOGISTIC( )

337 ODS LISTING CLOSE; ODS OUTPUTParameterEstimates ODS OUTPUT ParameterEstimates = ParameterEstimates (KEEP = variable classval0 probchisq estimate StdErr RENAME = (ProbChiSq = &__test._p_value) ) OddsRatios OddsRatios = OddsRatios; (KEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAME = (OddsRatioEst =&__test._OddsRatio LowerCL =&__test._LowerCL UpperCL = &__test._UpperCL ) ); PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; CLASS&class_vars PARAMREFREF CLASS &class_vars &independent (PARAM=REF REF="&ref"); MODEL &response = &independent MODEL &response = &independent &class_vars &continuous_vars ; &class_vars &continuous_vars ; FORMAT &independent; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING CLOSE; ODS OUTPUTParameterEstimates ODS OUTPUT ParameterEstimates = ParameterEstimates (KEEP = variable classval0 probchisq estimate StdErr RENAME = (ProbChiSq = &__test._p_value) ) OddsRatios OddsRatios = OddsRatios; (KEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAME = (OddsRatioEst =&__test._OddsRatio LowerCL =&__test._LowerCL UpperCL = &__test._UpperCL ) ); PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; CLASS&class_vars PARAMREFREF CLASS &class_vars &independent (PARAM=REF REF="&ref"); MODEL &response = &independent MODEL &response = &independent &class_vars &continuous_vars ; &class_vars &continuous_vars ; FORMAT &independent; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; PROCLOGISTIC( )

338 ODS LISTING CLOSE; ODS OUTPUTParameterEstimates ODS OUTPUT ParameterEstimates = ParameterEstimates (KEEP = variable classval0 probchisq estimate StdErr estimate StdErr RENAME = (ProbChiSq = &test._p_value) ) RENAME = (ProbChiSq = &test._p_value) ) WHERE = (UPCASE(variable)="&independent")) WHERE = (UPCASE(variable)="&independent")) OddsRatios OddsRatios = OddsRatios; (KEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAME = (OddsRatioEst = &test._OddsRatio RENAME = (OddsRatioEst = &test._OddsRatio LowerCL = &test._LowerCL LowerCL = &test._LowerCL UpperCL = &test._UpperCL ) ); UpperCL = &test._UpperCL ) ); WHERE = (UPCASE(SCAN(EFFECT,1))="&independent")); WHERE = (UPCASE(SCAN(EFFECT,1))="&independent")); PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; CLASS&class_vars PARAMREFREF CLASS &class_vars &independent (PARAM=REF REF="&ref"); MODEL &response = &independent MODEL &response = &independent &class_vars &continuous_vars ; &class_vars &continuous_vars ; FORMAT &independent; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; ODS LISTING CLOSE; ODS OUTPUTParameterEstimates ODS OUTPUT ParameterEstimates = ParameterEstimates (KEEP = variable classval0 probchisq estimate StdErr estimate StdErr RENAME = (ProbChiSq = &test._p_value) ) RENAME = (ProbChiSq = &test._p_value) ) WHERE = (UPCASE(variable)="&independent")) WHERE = (UPCASE(variable)="&independent")) OddsRatios OddsRatios = OddsRatios; (KEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAME = (OddsRatioEst = &test._OddsRatio RENAME = (OddsRatioEst = &test._OddsRatio LowerCL = &test._LowerCL LowerCL = &test._LowerCL UpperCL = &test._UpperCL ) ); UpperCL = &test._UpperCL ) ); WHERE = (UPCASE(SCAN(EFFECT,1))="&independent")); WHERE = (UPCASE(SCAN(EFFECT,1))="&independent")); PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; CLASS&class_vars PARAMREFREF CLASS &class_vars &independent (PARAM=REF REF="&ref"); MODEL &response = &independent MODEL &response = &independent &class_vars &continuous_vars ; &class_vars &continuous_vars ; FORMAT &independent; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING; PROCLOGISTIC( )

339 ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUTParameterEstimates ODS OUTPUT ParameterEstimates = ParameterEstimates KEEP (KEEP = variable classval0 probchisq estimate StdErr RENAME RENAME = (ProbChiSq = &test._p_value) ) WHERE UPCASE WHERE = (UPCASE(variable)="&independent")) OddsRatios OddsRatios = OddsRatios; KEEP (KEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAME RENAME = (OddsRatioEst = &test._OddsRatio LowerCL = &test._LowerCL UpperCL = &test._UpperCL ) ); WHERE = (UPCASE(SCAN(EFFECT,1))="&independent")); WHERE = (UPCASE(SCAN(EFFECT,1))="&independent")); PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; CLASS&class_vars PARAMREFREF CLASS &class_vars &independent (PARAM=REF REF="&ref"); MODEL &response = &independent MODEL &response = &independent &class_vars &continuous_vars ; &class_vars &continuous_vars ; FORMAT &independent; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING ODS LISTING; ODS LISTING CLOSE; ODS LISTING CLOSE; ODS OUTPUTParameterEstimates ODS OUTPUT ParameterEstimates = ParameterEstimates KEEP (KEEP = variable classval0 probchisq estimate StdErr RENAME RENAME = (ProbChiSq = &test._p_value) ) WHERE UPCASE WHERE = (UPCASE(variable)="&independent")) OddsRatios OddsRatios = OddsRatios; KEEP (KEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAME RENAME = (OddsRatioEst = &test._OddsRatio LowerCL = &test._LowerCL UpperCL = &test._UpperCL ) ); WHERE = (UPCASE(SCAN(EFFECT,1))="&independent")); WHERE = (UPCASE(SCAN(EFFECT,1))="&independent")); PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; PROC LOGISTIC DATA=&data DESCENDING ORDER=INTERNAL NAMELEN=32; CLASS&class_vars PARAMREFREF CLASS &class_vars &independent (PARAM=REF REF="&ref"); MODEL &response = &independent MODEL &response = &independent &class_vars &continuous_vars ; &class_vars &continuous_vars ; FORMAT &independent; RUN; RUN; ODS OUTPUT CLOSE; ODS OUTPUT CLOSE; ODS LISTING ODS LISTING; PROCLOGISTIC( )

340 DATA ParameterEstimates ( KEEP = key_value &test._p_value ); DATA ParameterEstimates ( KEEP = key_value &test._p_value ); SET ParameterEstimates ; SET ParameterEstimates ; Key_Value = INPUT(classval0,8.); Key_Value = INPUT(classval0,8.); RUN; RUN; DATA OddsRatios ( KEEP = key_value &test._OddsRatio DATA OddsRatios ( KEEP = key_value &test._OddsRatio &test._LowerCL &test._UpperCL ); &test._LowerCL &test._UpperCL ); SET OddsRatios ; SET OddsRatios ; Key_Value = INPUT((SCAN(EFFECT,2)),2.); Key_Value = INPUT((SCAN(EFFECT,2)),2.); RUN; RUN; DATA ParameterEstimates ( KEEP = key_value &test._p_value ); DATA ParameterEstimates ( KEEP = key_value &test._p_value ); SET ParameterEstimates ; SET ParameterEstimates ; Key_Value = INPUT(classval0,8.); Key_Value = INPUT(classval0,8.); RUN; RUN; DATA OddsRatios ( KEEP = key_value &test._OddsRatio DATA OddsRatios ( KEEP = key_value &test._OddsRatio &test._LowerCL &test._UpperCL ); &test._LowerCL &test._UpperCL ); SET OddsRatios ; SET OddsRatios ; Key_Value = INPUT((SCAN(EFFECT,2)),2.); Key_Value = INPUT((SCAN(EFFECT,2)),2.); RUN; RUN; PROCLOGISTIC( )

341 DATA ParameterEstimates ( KEEP = key_value &test._p_value ); DATA ParameterEstimates ( KEEP = key_value &test._p_value ); SET ParameterEstimates ; SET ParameterEstimates ; Key_Value = INPUT(classval0,8.); Key_Value = INPUT(classval0,8.); RUN; RUN; DATA OddsRatios ( KEEP = key_value &test._OddsRatio DATA OddsRatios ( KEEP = key_value &test._OddsRatio &test._LowerCL &test._UpperCL ); &test._LowerCL &test._UpperCL ); SET OddsRatios ; SET OddsRatios ; Key_Value = INPUT((SCAN(EFFECT,2)),2.); Key_Value = INPUT((SCAN(EFFECT,2)),2.); RUN; RUN; DATA ParameterEstimates ( KEEP = key_value &test._p_value ); DATA ParameterEstimates ( KEEP = key_value &test._p_value ); SET ParameterEstimates ; SET ParameterEstimates ; Key_Value = INPUT(classval0,8.); Key_Value = INPUT(classval0,8.); RUN; RUN; DATA OddsRatios ( KEEP = key_value &test._OddsRatio DATA OddsRatios ( KEEP = key_value &test._OddsRatio &test._LowerCL &test._UpperCL ); &test._LowerCL &test._UpperCL ); SET OddsRatios ; SET OddsRatios ; Key_Value = INPUT((SCAN(EFFECT,2)),2.); Key_Value = INPUT((SCAN(EFFECT,2)),2.); RUN; RUN; PROCLOGISTIC( )

342 DATA ParameterEstimates ( KEEP = key_value &test._p_value ); DATA ParameterEstimates ( KEEP = key_value &test._p_value ); SET ParameterEstimates ; SET ParameterEstimates ; Key_Value = INPUT(classval0,8.); Key_Value = INPUT(classval0,8.); RUN; RUN; DATA OddsRatios ( KEEP = key_value &test._OddsRatio DATA OddsRatios ( KEEP = key_value &test._OddsRatio &test._LowerCL &test._UpperCL ); &test._LowerCL &test._UpperCL ); SET OddsRatios ; SET OddsRatios ; Key_Value = INPUT((SCAN(EFFECT,2)),2.); Key_Value = INPUT((SCAN(EFFECT,2)),2.); RUN; RUN; DATA ParameterEstimates ( KEEP = key_value &test._p_value ); DATA ParameterEstimates ( KEEP = key_value &test._p_value ); SET ParameterEstimates ; SET ParameterEstimates ; Key_Value = INPUT(classval0,8.); Key_Value = INPUT(classval0,8.); RUN; RUN; DATA OddsRatios ( KEEP = key_value &test._OddsRatio DATA OddsRatios ( KEEP = key_value &test._OddsRatio &test._LowerCL &test._UpperCL ); &test._LowerCL &test._UpperCL ); SET OddsRatios ; SET OddsRatios ; Key_Value = INPUT((SCAN(EFFECT,2)),2.); Key_Value = INPUT((SCAN(EFFECT,2)),2.); RUN; RUN; PROCLOGISTIC( )

343 PROC SORT DATA=ParameterEstimates; BY key_value; BY key_value; RUN; RUN; PROC SORT DATA=OddsRatios; PROC SORT DATA=OddsRatios; BY key_value; BY key_value; RUN; RUN; DATA summary_&test._logistic ; DATA summary_&test._logistic ; MERGE ParameterEstimates OddsRatios ; MERGE ParameterEstimates OddsRatios ; BY key_value; BY key_value; RUN; RUN; PROC SORT DATA=ParameterEstimates; BY key_value; BY key_value; RUN; RUN; PROC SORT DATA=OddsRatios; PROC SORT DATA=OddsRatios; BY key_value; BY key_value; RUN; RUN; DATA summary_&test._logistic ; DATA summary_&test._logistic ; MERGE ParameterEstimates OddsRatios ; MERGE ParameterEstimates OddsRatios ; BY key_value; BY key_value; RUN; RUN; PROCLOGISTIC( )

344 PROC SORT DATA=ParameterEstimates; BY key_value; BY key_value; RUN; RUN; PROC SORT DATA=OddsRatios; PROC SORT DATA=OddsRatios; BY key_value; BY key_value; RUN; RUN; DATA summary_&test._logistic ; DATA summary_&test._logistic ; MERGE ParameterEstimates OddsRatios ; MERGE ParameterEstimates OddsRatios ; BY key_value; BY key_value; RUN; RUN; PROC SORT DATA=ParameterEstimates; BY key_value; BY key_value; RUN; RUN; PROC SORT DATA=OddsRatios; PROC SORT DATA=OddsRatios; BY key_value; BY key_value; RUN; RUN; DATA summary_&test._logistic ; DATA summary_&test._logistic ; MERGE ParameterEstimates OddsRatios ; MERGE ParameterEstimates OddsRatios ; BY key_value; BY key_value; RUN; RUN; PROCLOGISTIC( )

345 PROC SORT DATA=ParameterEstimates; BY key_value; BY key_value; RUN; RUN; PROC SORT DATA=OddsRatios; PROC SORT DATA=OddsRatios; BY key_value; BY key_value; RUN; RUN; DATA summary_&test._logistic ; DATA summary_&test._logistic ; MERGE ParameterEstimates OddsRatios ; MERGE ParameterEstimates OddsRatios ; BY key_value; BY key_value; RUN; RUN; PROC DATASETS; DELETE ParameterEstimates OddsRatios; DELETE ParameterEstimates OddsRatios; QUIT; QUIT; RUN; RUN; %MEND proclogistic; PROC SORT DATA=ParameterEstimates; BY key_value; BY key_value; RUN; RUN; PROC SORT DATA=OddsRatios; PROC SORT DATA=OddsRatios; BY key_value; BY key_value; RUN; RUN; DATA summary_&test._logistic ; DATA summary_&test._logistic ; MERGE ParameterEstimates OddsRatios ; MERGE ParameterEstimates OddsRatios ; BY key_value; BY key_value; RUN; RUN; PROC DATASETS; DELETE ParameterEstimates OddsRatios; DELETE ParameterEstimates OddsRatios; QUIT; QUIT; RUN; RUN; %MEND proclogistic; PROCLOGISTIC( )

346 PROC SORT DATA=ParameterEstimates; BY key_value; BY key_value; RUN; RUN; PROC SORT DATA=OddsRatios; PROC SORT DATA=OddsRatios; BY key_value; BY key_value; RUN; RUN; DATA summary_&test._logistic ; DATA summary_&test._logistic ; MERGE ParameterEstimates OddsRatios ; MERGE ParameterEstimates OddsRatios ; BY key_value; BY key_value; RUN; RUN; PROC DATASETS; DELETE ParameterEstimates OddsRatios; DELETE ParameterEstimates OddsRatios; QUIT; QUIT; RUN; RUN; MEND %MEND proclogistic; PROC SORT DATA=ParameterEstimates; BY key_value; BY key_value; RUN; RUN; PROC SORT DATA=OddsRatios; PROC SORT DATA=OddsRatios; BY key_value; BY key_value; RUN; RUN; DATA summary_&test._logistic ; DATA summary_&test._logistic ; MERGE ParameterEstimates OddsRatios ; MERGE ParameterEstimates OddsRatios ; BY key_value; BY key_value; RUN; RUN; PROC DATASETS; DELETE ParameterEstimates OddsRatios; DELETE ParameterEstimates OddsRatios; QUIT; QUIT; RUN; RUN; MEND %MEND proclogistic; PROCLOGISTIC( )

347 The CONTENTS Procedure CRUDE Data Set Name WORK.SUMMARY_CRUDE_LOGISTIC Observations 2 Member Type DATA Variables 5 Alphabetic List of Variables and Attributes # Variable Type Len Format Label Crude 4 Crude_LowerCL Num 8 ODDSR8.3 Crude PROC LOGISTIC Lower 95% CI Crude 3 Crude_OddsRatio Num 8 ODDSR8.3 Crude PROC LOGISTIC Odds Ratio Crude 5 Crude_UpperCL Num 8 ODDSR8.3 Crude PROC LOGISTIC Upper 95% CI Crude 1 Crude_p_value Num 8 PVALUE6.4 Crude PROC LOGISTIC Chi-Square prob 2 key_value Num 8 PROCLOGISTIC( )

348 The CONTENTS Procedure Data Set Name WORK.SUMMARY_ADJUSTED_LOGISTIC Observations 2 Member Type DATA Variables 5 Alphabetic List of Variables and Attributes # Variable Type Len Format Label Adjusted 4 Adjusted_LowerCL Num 8 ODDSR8.3 Adjusted PROC LOGISTIC Lower 95% CI Adjusted 3 Adjusted_OddsRatio Num 8 ODDSR8.3 Adjusted PROC LOGISTIC Odds Ratio Adjusted 5 Adjusted_UpperCL Num 8 ODDSR8.3 Adjusted PROC LOGISTIC Upper 95% CI Adjusted 1 Adjusted_p_value Num 8 PVALUE6.4 Adjusted PROC LOGISTIC Chi-Square prob 2 var2_value Num 8 PROCLOGISTIC( )

349 %MACRO summary(__dset =, %MACRO summary(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __basevs =, __basevs =, __out = ); __out = ); %LET __var1 = %UPCASE(&__var1); %LET __var1 = %UPCASE(&__var1); %LET __var2 = %UPCASE(&__var2); %LET __var2 = %UPCASE(&__var2); %IF %validate(__dset = &__dset, %IF %validate(__dset = &__dset, __var1 = &__var1, __var1 = &__var1, __var2 = &__var2, __var2 = &__var2, __ref = &__ref, __ref = &__ref, __vars = &__basevs, __vars = &__basevs, __out = &__out ) = 1 /*error found*/ __out = &__out ) = 1 /*error found*/ %THEN %RETURN; %THEN %RETURN; %split(__vars=&__basevs) %split(__vars=&__basevs) %makeset(__dset = &__dset, %makeset(__dset = &__dset, __var1 = &__var1, __var1 = &__var1, __var2 = &__var2, __var2 = &__var2, __class_vars = &__class_vars, __class_vars = &__class_vars, __continuous_vars = &__continuous_vars ) __continuous_vars = &__continuous_vars ) %ctab(__dset = __analysis_set, %ctab(__dset = __analysis_set, __col_var = &__var1, __col_var = &__var1, __row_var = &__var2 ) __row_var = &__var2 ) %logit(__test = Crude, %logit(__test = Crude, __dset = __analysis_set, __dset = __analysis_set, __response = &__var1, __response = &__var1, __independent = &__var2, __independent = &__var2, __ref = &__ref ) __ref = &__ref ) %logit(__test = Adjusted, %logit(__test = Adjusted, __dset = __analysis_set, __dset = __analysis_set, __response = &__var1, __response = &__var1, __independent = &__var2, __independent = &__var2, __ref = &__ref, __ref = &__ref, __class_vars = &__class_vars, __class_vars = &__class_vars, __continuous_vars = &__continuous_vars ) __continuous_vars = &__continuous_vars ) %summaryset(__base = &__out) %summaryset(__base = &__out) %nodata: %nodata: %MEND summary; %MEND summary; %MACRO summary(__dset =, %MACRO summary(__dset =, __var1 =, __var1 =, __var2 =, __var2 =, __ref =, __ref =, __basevs =, __basevs =, __out = ); __out = ); %LET __var1 = %UPCASE(&__var1); %LET __var1 = %UPCASE(&__var1); %LET __var2 = %UPCASE(&__var2); %LET __var2 = %UPCASE(&__var2); %IF %validate(__dset = &__dset, %IF %validate(__dset = &__dset, __var1 = &__var1, __var1 = &__var1, __var2 = &__var2, __var2 = &__var2, __ref = &__ref, __ref = &__ref, __vars = &__basevs, __vars = &__basevs, __out = &__out ) = 1 /*error found*/ __out = &__out ) = 1 /*error found*/ %THEN %RETURN; %THEN %RETURN; %split(__vars=&__basevs) %split(__vars=&__basevs) %makeset(__dset = &__dset, %makeset(__dset = &__dset, __var1 = &__var1, __var1 = &__var1, __var2 = &__var2, __var2 = &__var2, __class_vars = &__class_vars, __class_vars = &__class_vars, __continuous_vars = &__continuous_vars ) __continuous_vars = &__continuous_vars ) %ctab(__dset = __analysis_set, %ctab(__dset = __analysis_set, __col_var = &__var1, __col_var = &__var1, __row_var = &__var2 ) __row_var = &__var2 ) %logit(__test = Crude, %logit(__test = Crude, __dset = __analysis_set, __dset = __analysis_set, __response = &__var1, __response = &__var1, __independent = &__var2, __independent = &__var2, __ref = &__ref ) __ref = &__ref ) %logit(__test = Adjusted, %logit(__test = Adjusted, __dset = __analysis_set, __dset = __analysis_set, __response = &__var1, __response = &__var1, __independent = &__var2, __independent = &__var2, __ref = &__ref, __ref = &__ref, __class_vars = &__class_vars, __class_vars = &__class_vars, __continuous_vars = &__continuous_vars ) __continuous_vars = &__continuous_vars ) %summaryset(__base = &__out) %summaryset(__base = &__out) %nodata: %nodata: %MEND summary; %MEND summary;

350 SUPERVISOR( ) MACRO %MACRO supervisor;;(dataset =, response =, independent =, covariates =, outfile =, report = ); MACRO %MACRO supervisor;;(dataset =, response =, independent =, covariates =, outfile =, report = );

351 SUPERVISOR( ) MACRO %MACRO supervisor(dataset =, response =, independent =, covariates =, outfile =, report = ); MACRO %MACRO supervisor(dataset =, response =, independent =, covariates =, outfile =, report = );

352 Add a Paramater for the Referent Level MACRO %MACRO supervisor(dataset =, response =, independent =, referent =, covariates =, outfile =, report = ); MACRO %MACRO supervisor(dataset =, response =, independent =, referent =, covariates =, outfile =, report = );

353 SUPERVISOR( ) LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile);

354 Pass Referent Parameter to VALIDATE( ) LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, ref = &referent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, ref = &referent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase(base=&outfile);

355 Adjust INITBASE( ) LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, ref = &referent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase %initbase(base=&outfile); LOCAL %LOCAL echeck; LETUPCASE %LET response = %UPCASE(&response); LETUPCASE %LET independent = %UPCASE(&independent); %validate(dset = &dataset, var1 = &response, var2 = &independent, ref = &referent, basevs = &covariates, out = &outfile ) IFTHENRETURN %IF &echeck = 1 %THEN %RETURN; IFSYSFUNCEXISTNETHEN %IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbase %initbase(base=&outfile);

356 SUPERVISOR( ) LET %LET class_vars =%split(vars=&covariates,control=); LET %LET continuous_vars=%split(vars=&covariates,control=@); %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) LET %LET class_vars =%split(vars=&covariates,control=); LET %LET continuous_vars=%split(vars=&covariates,control=@); %analysisset(data = &dataset, var1 = &response, var2 = &independent, variables = &class_vars &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent )

357 SUPERVISOR( ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) Crude %procglm (test = Crude, data = analysis_set, response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) %procmeans(data = analysis_set, var1 = &response, var2 = &independent ) Crude %procglm (test = Crude, data = analysis_set, response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars )

358 Replace PROCMEANS( ) %procfreq %procfreq (data = analysis_set, var1 = &response, var2 = &independent ) Crude %procglm (test = Crude, data = analysis_set, response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) %procfreq %procfreq (data = analysis_set, var1 = &response, var2 = &independent ) Crude %procglm (test = Crude, data = analysis_set, response = &response, independent = &independent ) Adjusted %procglm (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars )

359 Replace PROCGLM( ) %procfreq %procfreq (data = analysis_set, var1 = &response, var2 = &independent ) %proclogisticCrude %proclogistic (test = Crude, data = analysis_set, response = &response, independent = &independent ) %proclogisticAdjusted %proclogistic (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars ) %procfreq %procfreq (data = analysis_set, var1 = &response, var2 = &independent ) %proclogisticCrude %proclogistic (test = Crude, data = analysis_set, response = &response, independent = &independent ) %proclogisticAdjusted %proclogistic (test = Adjusted, data = analysis_set, response = &response, independent = &independent, class_vars = &class_vars, continuous_vars = &continuous_vars )

360 Pass Referent to PROCLOGISTIC( ) %procfreq %procfreq (data = analysis_set, var1 = &response, var2 = &independent ) %proclogisticCrude %proclogistic (test = Crude, data = analysis_set, response = &response, independent = &independent, ref = &referent ref = &referent ) %proclogisticAdjusted %proclogistic (test = Adjusted, data = analysis_set, response = &response, independent = &independent, ref = &referent, class_vars = &class_vars, continuous_vars = &continuous_vars ) %procfreq %procfreq (data = analysis_set, var1 = &response, var2 = &independent ) %proclogisticCrude %proclogistic (test = Crude, data = analysis_set, response = &response, independent = &independent, ref = &referent ref = &referent ) %proclogisticAdjusted %proclogistic (test = Adjusted, data = analysis_set, response = &response, independent = &independent, ref = &referent, class_vars = &class_vars, continuous_vars = &continuous_vars )

361 SUPERVISOR( ) %summaryset(merge_var = key_var, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars, continuous_vars = &continuous_vars) IFUPCASETHEN %IF %UPCASE(&report) = YES %THEN %PrintReport(data=&outfile); MEND %MEND supervisor; %summaryset(merge_var = key_var, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars, continuous_vars = &continuous_vars) IFUPCASETHEN %IF %UPCASE(&report) = YES %THEN %PrintReport(data=&outfile); MEND %MEND supervisor;

362 Change merge_var to key_value key_value, %summaryset(merge_var = key_value, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars, continuous_vars = &continuous_vars) IFUPCASETHEN %IF %UPCASE(&report) = YES %THEN %PrintReport(data=&outfile); MEND %MEND supervisor; key_value, %summaryset(merge_var = key_value, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars, continuous_vars = &continuous_vars) IFUPCASETHEN %IF %UPCASE(&report) = YES %THEN %PrintReport(data=&outfile); MEND %MEND supervisor;

363 Adjust PRINTREPORT( ) key_value, %summaryset(merge_var = key_value, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars, continuous_vars = &continuous_vars) IFUPCASETHEN %IF %UPCASE(&report) = YES %THEN %PrintReport %PrintReport(data=&outfile); MEND %MEND supervisor; key_value, %summaryset(merge_var = key_value, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars, continuous_vars = &continuous_vars) IFUPCASETHEN %IF %UPCASE(&report) = YES %THEN %PrintReport %PrintReport(data=&outfile); MEND %MEND supervisor;

364 This Invocation of SUPERVISOR( ) %supervisor(dataset = mydata, response = asthma, response = asthma, independent = farmsize, independent = farmsize, referent = 1, referent = 1, covariates = @age state race, covariates = @age state race, outfile = logistic_summary, outfile = logistic_summary, report = YES ) report = YES ) %IF %UPCASE(&report) = YES %THEN %PrintReport(data=&outfile); %supervisor(dataset = mydata, response = asthma, response = asthma, independent = farmsize, independent = farmsize, referent = 1, referent = 1, covariates = @age state race, covariates = @age state race, outfile = logistic_summary, outfile = logistic_summary, report = YES ) report = YES ) %IF %UPCASE(&report) = YES %THEN %PrintReport(data=&outfile);

365 Produces the Following Report Class Covariates = state race Continuous Covariates = age Ever Diagnosed with asthma Variable Yes No P-Value OR 95% CI Label/Format N % N % Crude Adjusted Adjusted ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Average days mixed pesticides None 346 46.9 6658 39.8.. 1-90 days 278 37.7 6358 38.0 0.0361 0.7049 0.949 0.722 1.246 > 90 days 113 15.3 3697 22.1 <.0001 0.5378 1.143 0.747 1.747

366 Create an Iteration Macro

367 %supervisor(dataset = mydata, response = asthma, response = asthma, independent = farmsize, independent = farmsize, referent = 1, referent = 1, covariates = @age state race, covariates = @age state race, outfile = logistic_summary, outfile = logistic_summary, report = YES ) report = YES ) %supervisor(dataset = mydata, response = asthma, response = asthma, independent = farmsize, independent = farmsize, referent = 1, referent = 1, covariates = @age state race, covariates = @age state race, outfile = logistic_summary, outfile = logistic_summary, report = YES ) report = YES )

368 %MACRO callexecute(arrayvars = ); DATA _NULL_; LENGTH independent $ 32 print_report $3; IF 0 THEN SET mydata; ARRAY i_var (*) &array_vars; DO i = 1 TO DIM ( i_var ); independent = VNAME ( i_var[i] ); IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTE (CATS('%NRSTR(','%supervisor(dataset = mydata','%supervisor(dataset = mydata',",response = asthma",",response = asthma",",independent = ", independent,",independent = ", independent,",referent = 1",",referent = 1",",covariates = @age state race",",covariates = @age state race ",",outfile = logistic_summary ",",outfile = logistic_summary ",",report = ", print_report,",report = ", print_report,")", ")" ) );,")", ")" ) ); END; RUN; %MEND callexecute; %MACRO callexecute(arrayvars = ); DATA _NULL_; LENGTH independent $ 32 print_report $3; IF 0 THEN SET mydata; ARRAY i_var (*) &array_vars; DO i = 1 TO DIM ( i_var ); independent = VNAME ( i_var[i] ); IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTE (CATS('%NRSTR(','%supervisor(dataset = mydata','%supervisor(dataset = mydata',",response = asthma",",response = asthma",",independent = ", independent,",independent = ", independent,",referent = 1",",referent = 1",",covariates = @age state race",",covariates = @age state race ",",outfile = logistic_summary ",",outfile = logistic_summary ",",report = ", print_report,",report = ", print_report,")", ")" ) );,")", ")" ) ); END; RUN; %MEND callexecute;

369 %MACRO callexecute(arrayvars = ); DATA_NULL_ DATA _NULL_; LENGTH independent $ 32 print_report $3; IF 0 THEN SET mydata; ARRAY i_var (*) &array_vars; DO i = 1 TO DIM ( i_var ); independent = VNAME ( i_var[i] ); IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTE (CATS('%NRSTR(','%supervisor(dataset = mydata','%supervisor(dataset = mydata',",response = asthma",",response = asthma",",independent = ", independent,",independent = ", independent,",referent = 1",",referent = 1",",covariates = @age state race",",covariates = @age state race ",",outfile = logistic_summary ",",outfile = logistic_summary ",",report = ", print_report,",report = ", print_report,")", ")" ) );,")", ")" ) ); END; RUN RUN; %MEND callexecute; %MACRO callexecute(arrayvars = ); DATA_NULL_ DATA _NULL_; LENGTH independent $ 32 print_report $3; IF 0 THEN SET mydata; ARRAY i_var (*) &array_vars; DO i = 1 TO DIM ( i_var ); independent = VNAME ( i_var[i] ); IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTE (CATS('%NRSTR(','%supervisor(dataset = mydata','%supervisor(dataset = mydata',",response = asthma",",response = asthma",",independent = ", independent,",independent = ", independent,",referent = 1",",referent = 1",",covariates = @age state race",",covariates = @age state race ",",outfile = logistic_summary ",",outfile = logistic_summary ",",report = ", print_report,",report = ", print_report,")", ")" ) );,")", ")" ) ); END; RUN RUN; %MEND callexecute;

370 %MACRO callexecute(arrayvars = ); DATA_NULL_ DATA _NULL_; LENGTH independent $ 32 print_report $3; IF 0 THEN SET mydata; ARRAY ARRAY i_var (*) &array_vars; DOTO DIM DO i = 1 TO DIM ( i_var ); VNAME independent = VNAME ( i_var[i] ); IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTE (CATS('%NRSTR(','%supervisor(dataset = mydata','%supervisor(dataset = mydata',",response = asthma",",response = asthma",",independent = ", independent,",independent = ", independent,",referent = 1",",referent = 1",",covariates = @age state race",",covariates = @age state race ",",outfile = logistic_summary ",",outfile = logistic_summary ",",report = ", print_report,",report = ", print_report,")", ")" ) );,")", ")" ) ); END END; RUN RUN; %MEND callexecute; %MACRO callexecute(arrayvars = ); DATA_NULL_ DATA _NULL_; LENGTH independent $ 32 print_report $3; IF 0 THEN SET mydata; ARRAY ARRAY i_var (*) &array_vars; DOTO DIM DO i = 1 TO DIM ( i_var ); VNAME independent = VNAME ( i_var[i] ); IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTE (CATS('%NRSTR(','%supervisor(dataset = mydata','%supervisor(dataset = mydata',",response = asthma",",response = asthma",",independent = ", independent,",independent = ", independent,",referent = 1",",referent = 1",",covariates = @age state race",",covariates = @age state race ",",outfile = logistic_summary ",",outfile = logistic_summary ",",report = ", print_report,",report = ", print_report,")", ")" ) );,")", ")" ) ); END END; RUN RUN; %MEND callexecute;

371 %MACRO callexecute(arrayvars = ); DATA_NULL_ DATA _NULL_; LENGTH independent $ 32 print_report $3; IFTHEN SET IF 0 THEN SET mydata; ARRAY ARRAY i_var (*) &array_vars; DOTO DIM DO i = 1 TO DIM ( i_var ); VNAME independent = VNAME ( i_var[i] ); IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTE (CATS('%NRSTR(','%supervisor(dataset = mydata','%supervisor(dataset = mydata',",response = asthma",",response = asthma",",independent = ", independent,",independent = ", independent,",referent = 1",",referent = 1",",covariates = @age state race",",covariates = @age state race ",",outfile = logistic_summary ",",outfile = logistic_summary ",",report = ", print_report,",report = ", print_report,")", ")" ) );,")", ")" ) ); END END; RUN RUN; %MEND callexecute; %MACRO callexecute(arrayvars = ); DATA_NULL_ DATA _NULL_; LENGTH independent $ 32 print_report $3; IFTHEN SET IF 0 THEN SET mydata; ARRAY ARRAY i_var (*) &array_vars; DOTO DIM DO i = 1 TO DIM ( i_var ); VNAME independent = VNAME ( i_var[i] ); IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTE (CATS('%NRSTR(','%supervisor(dataset = mydata','%supervisor(dataset = mydata',",response = asthma",",response = asthma",",independent = ", independent,",independent = ", independent,",referent = 1",",referent = 1",",covariates = @age state race",",covariates = @age state race ",",outfile = logistic_summary ",",outfile = logistic_summary ",",report = ", print_report,",report = ", print_report,")", ")" ) );,")", ")" ) ); END END; RUN RUN; %MEND callexecute;

372 %MACRO callexecute(arrayvars = ); DATA_NULL_ DATA _NULL_; LENGTH LENGTH independent $ 32 print_report $3; IFTHEN SET IF 0 THEN SET mydata; ARRAY ARRAY i_var (*) &array_vars; DOTO DIM DO i = 1 TO DIM ( i_var ); VNAME independent = VNAME ( i_var[i] ); IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTE (CATS('%NRSTR(','%supervisor(dataset = mydata','%supervisor(dataset = mydata',",response = asthma",",response = asthma",",independent = ", independent,",independent = ", independent,",referent = 1",",referent = 1",",covariates = @age state race",",covariates = @age state race ",",outfile = logistic_summary ",",outfile = logistic_summary ",",report = ", print_report,",report = ", print_report,")", ")" ) );,")", ")" ) ); END END; RUN RUN; %MEND callexecute; %MACRO callexecute(arrayvars = ); DATA_NULL_ DATA _NULL_; LENGTH LENGTH independent $ 32 print_report $3; IFTHEN SET IF 0 THEN SET mydata; ARRAY ARRAY i_var (*) &array_vars; DOTO DIM DO i = 1 TO DIM ( i_var ); VNAME independent = VNAME ( i_var[i] ); IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTE (CATS('%NRSTR(','%supervisor(dataset = mydata','%supervisor(dataset = mydata',",response = asthma",",response = asthma",",independent = ", independent,",independent = ", independent,",referent = 1",",referent = 1",",covariates = @age state race",",covariates = @age state race ",",outfile = logistic_summary ",",outfile = logistic_summary ",",report = ", print_report,",report = ", print_report,")", ")" ) );,")", ")" ) ); END END; RUN RUN; %MEND callexecute;

373 %MACRO callexecute(arrayvars = ); DATA_NULL_ DATA _NULL_; LENGTH LENGTH independent $ 32 print_report $3; IFTHEN SET IF 0 THEN SET mydata; ARRAY ARRAY i_var (*) &array_vars; DOTO DIM DO i = 1 TO DIM ( i_var ); VNAME independent = VNAME ( i_var[i] ); IFDIMTHENELSE IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTE (CATS('%NRSTR(','%supervisor(dataset = mydata','%supervisor(dataset = mydata',",response = asthma",",response = asthma",",independent = ", independent,",independent = ", independent,",referent = 1",",referent = 1",",covariates = @age state race",",covariates = @age state race ",",outfile = logistic_summary ",",outfile = logistic_summary ",",report = ", print_report,",report = ", print_report,")", ")" ) );,")", ")" ) ); END END; RUN RUN; %MEND callexecute; %MACRO callexecute(arrayvars = ); DATA_NULL_ DATA _NULL_; LENGTH LENGTH independent $ 32 print_report $3; IFTHEN SET IF 0 THEN SET mydata; ARRAY ARRAY i_var (*) &array_vars; DOTO DIM DO i = 1 TO DIM ( i_var ); VNAME independent = VNAME ( i_var[i] ); IFDIMTHENELSE IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTE (CATS('%NRSTR(','%supervisor(dataset = mydata','%supervisor(dataset = mydata',",response = asthma",",response = asthma",",independent = ", independent,",independent = ", independent,",referent = 1",",referent = 1",",covariates = @age state race",",covariates = @age state race ",",outfile = logistic_summary ",",outfile = logistic_summary ",",report = ", print_report,",report = ", print_report,")", ")" ) );,")", ")" ) ); END END; RUN RUN; %MEND callexecute;

374 MACRO %MACRO callexecute(arrayvars = ); DATA_NULL_ DATA _NULL_; LENGTH LENGTH independent $ 32 print_report $3; IFTHEN SET IF 0 THEN SET mydata; ARRAY ARRAY i_var (*) &array_vars; DOTO DIM DO i = 1 TO DIM ( i_var ); VNAME independent = VNAME ( i_var[i] ); IFDIMTHENELSE IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTE (CATS('%NRSTR(','%supervisor(dataset = mydata','%supervisor(dataset = mydata',",response = asthma",",response = asthma",",independent = ", independent,",independent = ", independent,",referent = 1",",referent = 1",",covariates = @age state race",",covariates = @age state race ",",outfile = logistic_summary ",",outfile = logistic_summary ",",report = ", print_report,",report = ", print_report,")", ")" ) );,")", ")" ) ); END END; RUN RUN; MEND %MEND callexecute; MACRO %MACRO callexecute(arrayvars = ); DATA_NULL_ DATA _NULL_; LENGTH LENGTH independent $ 32 print_report $3; IFTHEN SET IF 0 THEN SET mydata; ARRAY ARRAY i_var (*) &array_vars; DOTO DIM DO i = 1 TO DIM ( i_var ); VNAME independent = VNAME ( i_var[i] ); IFDIMTHENELSE IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTE (CATS('%NRSTR(','%supervisor(dataset = mydata','%supervisor(dataset = mydata',",response = asthma",",response = asthma",",independent = ", independent,",independent = ", independent,",referent = 1",",referent = 1",",covariates = @age state race",",covariates = @age state race ",",outfile = logistic_summary ",",outfile = logistic_summary ",",report = ", print_report,",report = ", print_report,")", ")" ) );,")", ")" ) ); END END; RUN RUN; MEND %MEND callexecute;

375 MACROarrayvars %MACRO callexecute(arrayvars = ); DATA_NULL_ DATA _NULL_; LENGTH LENGTH independent $ 32 print_report $3; IFTHEN SET IF 0 THEN SET mydata; ARRAY&array_vars ARRAY i_var (*) &array_vars; DOTO DIM DO i = 1 TO DIM ( i_var ); VNAME independent = VNAME ( i_var[i] ); IFDIMTHENELSE IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTE (CATS('%NRSTR(','%supervisor(dataset = mydata','%supervisor(dataset = mydata',",response = asthma",",response = asthma",",independent = ", independent,",independent = ", independent,",referent = 1",",referent = 1",",covariates = @age state race",",covariates = @age state race ",",outfile = logistic_summary ",",outfile = logistic_summary ",",report = ", print_report,",report = ", print_report,")", ")" ) );,")", ")" ) ); END END; RUN RUN; MEND %MEND callexecute; MACROarrayvars %MACRO callexecute(arrayvars = ); DATA_NULL_ DATA _NULL_; LENGTH LENGTH independent $ 32 print_report $3; IFTHEN SET IF 0 THEN SET mydata; ARRAY&array_vars ARRAY i_var (*) &array_vars; DOTO DIM DO i = 1 TO DIM ( i_var ); VNAME independent = VNAME ( i_var[i] ); IFDIMTHENELSE IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTE (CATS('%NRSTR(','%supervisor(dataset = mydata','%supervisor(dataset = mydata',",response = asthma",",response = asthma",",independent = ", independent,",independent = ", independent,",referent = 1",",referent = 1",",covariates = @age state race",",covariates = @age state race ",",outfile = logistic_summary ",",outfile = logistic_summary ",",report = ", print_report,",report = ", print_report,")", ")" ) );,")", ")" ) ); END END; RUN RUN; MEND %MEND callexecute;

376 Farmsize, Milkcows, Tractor, Grainyears %procfreq (data = analysis_set, var1 = &response, var2 = &independent ) %proclogistic (test = Crude, data = analysis_set, %callexecute(arrayvars = farmsize -- grain_years) independent = &independent, ref = &referent ) %proclogistic (test = Adjusted, data = analysis_set, response = &response, independent = &independent, ref = &referent, class_vars = &class_vars, continuous_vars = &continuous_vars ) %procfreq (data = analysis_set, var1 = &response, var2 = &independent ) %proclogistic (test = Crude, data = analysis_set, %callexecute(arrayvars = farmsize -- grain_years) independent = &independent, ref = &referent ) %proclogistic (test = Adjusted, data = analysis_set, response = &response, independent = &independent, ref = &referent, class_vars = &class_vars, continuous_vars = &continuous_vars )

377 Ever Diagnosed with asthma Variable Yes No P-Value OR 95% CI Label/Format N % N % Crude Adjusted Adjusted ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Size of Farm No Farm 346 46.9 6658 39.8.. < 500 acres 278 37.7 6358 38.0 0.0361 0.7049 0.949 0.726 1.248 500+ acres 113 15.3 3697 22.1 <.0001 0.5378 1.143 0.747 1.747 Frequency of Milking Cows Never 215 6.8 1275 7.8..... Monthly 225 7.1 1104 6.8 0.0679 0.0445 1.238 1.005 1.525 Weekly 1396 43.9 7195 44.0 0.0768 0.0007 1.325 1.125 1.560 Daily 1341 42.2 6773 41.4 0.0434 <.0001 1.426 1.205 1.689 Frequency of Tractor Use Never 2250 71.1 12203 74.9..... Monthly 744 23.5 3465 21.3 0.0010 0.0042 1.146 1.044 1.259 Weekly 138 4.4 528 3.2 0.0004 0.0040 1.341 1.098 1.637 Daily 33 1.0 95 0.6 0.0015 0.0186 1.642 1.086 2.481 Years Grown Grain None 51 17.9 1262 21.7..... < 5 years 47 16.5 917 15.7 0.2507 0.2305 1.287 0.852 1.943 5-9 years 90 31.6 1539 26.5 0.0393 0.0477 1.435 1.004 2.052 10-19 years 50 17.6 1005 17.3 0.3071 0.2669 1.258 0.839 1.887 20+ years 46 16.1 1083 18.6 0.8107 0.6627 1.096 0.725 1.657 Generates a Summary Report

378 CONCLUSION ODS provides the programmer with a method to method to extract and summarize statistics from SAS procedures.

379 CONCLUSION When combined with the SAS Macro facility summarization of procedural statistics, using ODS, can be automated

380 CONCLUSION ………………...

381 Long, S, Heaton, E Using the SAS® DATA Step and PROC SQL to Create Macro Arrays SQL to Create Macro Arrays Macro Arrays Paper: 030-2008

382 Long, S., Park, L. Contrasting programming techniques for Contrasting programming techniques for summarizing voluminous SAS® output using the SAS Output Delivery System (ODS) (PROC FREQ as an example) Macro Arrays Paper: 013-30 (SUGI 30)

383

384 DISCLAIMER: The contents of this paper are the work of the authors and do not necessarily represent the opinions, recommendations, or practices of Westat and Rho Inc.


Download ppt "Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long Westat, Durham,"

Similar presentations


Ads by Google