Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart...

Preview:

Citation preview

Adventures in ODS: Adventures in ODS: Producing Customized ReportsProducing Customized Reports

Using Output from Multiple Using Output from Multiple SAS® ProceduresSAS® Procedures

Stuart Long (long3@niehs.nih.gov) Westat, Durham, NC

Jeff Abolafia, Rho Inc, Chapel Hill, NC

Lawrence Park, Chapel Hill, NC

SAS tools for automating the SAS tools for automating the generation of customized reports generation of customized reports

SAS tools for automating the SAS tools for automating the generation of customized reports generation of customized reports

Output Delivery System (ODS)Output Delivery System (ODS)

SAS tools for automating the SAS tools for automating the generation of customized reports generation of customized reports

Output Delivery System (ODS)Output Delivery System (ODS)

SAS Macro facilitySAS Macro facility

Customized ReportsCustomized Reports

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 ReportsCustomized Reports

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 ReportsCustomized Reports PROC MEANS PROC MEANS

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 ReportsCustomized ReportsCrude PROC GLMCrude PROC GLM

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 ReportsCustomized ReportsAdjusted PROC GLMAdjusted PROC GLM

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 ReportsCustomized ReportsAdditional Descriptive InformationAdditional Descriptive Information

ODSODSAdditional Descriptive Information

PROCMEANS

ODSODSAdditional Descriptive Information

PROCMEANS

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-----------------------------------------------------

ODSODSAdditional Descriptive Information

PROCMEANS

CrudePROCGLM

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-----------------------------------------------------

ODSODSAdditional Descriptive Information

PROCMEANS

CrudePROCGLM

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 AHS43300.sas 09:30 Thursday, February 28, 2008 112109:30 Thursday, February 28, 2008 1121Phase 1 Release: P1REL0506Phase 1 Release: P1REL0506Phase 2 Release: P2REL0612.03Phase 2 Release: P2REL0612.03Phase 3 Release: Interim release P3REL0707.01Phase 3 Release: Interim release P3REL0707.01Spouses - Frequencies of Part 3: super-controlsSpouses - Frequencies of Part 3: super-controls

The GLM ProcedureThe GLM Procedure

Number of Observations Read 84742Number of Observations Read 84742Number of Observations Used 49624Number of Observations Used 49624

AHS43300.sas 09:30 Thursday, February AHS43300.sas 09:30 Thursday, February 28, 2008 112428, 2008 1124The GLM ProcedureThe GLM Procedure

Dependent Variable: bmi Body Mass IndexDependent Variable: bmi Body Mass Index

Sum ofSum ofSource DF Squares Mean Square F Value Pr > FSource DF Squares Mean Square F Value Pr > F

Model 1 14626.311 14626.311 695.33 <.0001Model 1 14626.311 14626.311 695.33 <.0001

Error 49622 1043803.927 21.035Error 49622 1043803.927 21.035

Corrected Total 49623 1058430.238Corrected Total 49623 1058430.238

R-Square Coeff Var Root MSE bmi MeanR-Square Coeff Var Root MSE bmi Mean

0.013819 17.55976 4.586404 26.118830.013819 17.55976 4.586404 26.11883

Source DF Type I SS Mean Square F Value Pr > FSource DF Type I SS Mean Square F Value Pr > F

years_on_farm 1 14626.31136 14626.31136 695.33 <.0001years_on_farm 1 14626.31136 14626.31136 695.33 <.0001

Source DF Type III SS Mean Square F Value Pr > FSource DF Type III SS Mean Square F Value Pr > F

years_on_farm 1 14626.31136 14626.31136 695.33 <.0001years_on_farm 1 14626.31136 14626.31136 695.33 <.0001

StandardStandardParameter Estimate Error t Value Pr > |t|Parameter Estimate Error t Value Pr > |t|

Intercept 25.02571119 0.04628587 540.68 <.0001Intercept 25.02571119 0.04628587 540.68 <.0001years_on_farm 0.02987844 0.00113309 26.37 <.0001years_on_farm 0.02987844 0.00113309 26.37 <.0001

ODSODSAdditional Descriptive InformationPROCMEANS

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-----------------------------------------------------

CrudePROCGLM

AHS43300.sas AHS43300.sas 09:30 Thursday, February 28, 2008 112109:30 Thursday, February 28, 2008 1121Phase 1 Release: P1REL0506Phase 1 Release: P1REL0506Phase 2 Release: P2REL0612.03Phase 2 Release: P2REL0612.03Phase 3 Release: Interim release P3REL0707.01Phase 3 Release: Interim release P3REL0707.01Spouses - Frequencies of Part 3: super-controlsSpouses - Frequencies of Part 3: super-controls

The GLM ProcedureThe GLM Procedure

Number of Observations Read 84742Number of Observations Read 84742Number of Observations Used 49624Number of Observations Used 49624

AHS43300.sas 09:30 Thursday, February AHS43300.sas 09:30 Thursday, February 28, 2008 112428, 2008 1124The GLM ProcedureThe GLM Procedure

Dependent Variable: bmi Body Mass IndexDependent Variable: bmi Body Mass Index

Sum ofSum ofSource DF Squares Mean Square F Value Pr > FSource DF Squares Mean Square F Value Pr > F

Model 1 14626.311 14626.311 695.33 <.0001Model 1 14626.311 14626.311 695.33 <.0001

Error 49622 1043803.927 21.035Error 49622 1043803.927 21.035

Corrected Total 49623 1058430.238Corrected Total 49623 1058430.238

R-Square Coeff Var Root MSE bmi MeanR-Square Coeff Var Root MSE bmi Mean

0.013819 17.55976 4.586404 26.118830.013819 17.55976 4.586404 26.11883

Source DF Type I SS Mean Square F Value Pr > FSource DF Type I SS Mean Square F Value Pr > F

years_on_farm 1 14626.31136 14626.31136 695.33 <.0001years_on_farm 1 14626.31136 14626.31136 695.33 <.0001

Source DF Type III SS Mean Square F Value Pr > FSource DF Type III SS Mean Square F Value Pr > F

years_on_farm 1 14626.31136 14626.31136 695.33 <.0001years_on_farm 1 14626.31136 14626.31136 695.33 <.0001

StandardStandardParameter Estimate Error t Value Pr > |t|Parameter Estimate Error t Value Pr > |t|

Intercept 25.02571119 0.04628587 540.68 <.0001Intercept 25.02571119 0.04628587 540.68 <.0001years_on_farm 0.02987844 0.00113309 26.37 <.0001years_on_farm 0.02987844 0.00113309 26.37 <.0001

AdjustedPROCGLM

ODSODSAdditional Descriptive InformationPROCMEANS

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-----------------------------------------------------

CrudePROCGLM

AHS43300.sas AHS43300.sas 09:30 Thursday, February 28, 2008 112109:30 Thursday, February 28, 2008 1121Phase 1 Release: P1REL0506Phase 1 Release: P1REL0506Phase 2 Release: P2REL0612.03Phase 2 Release: P2REL0612.03Phase 3 Release: Interim release P3REL0707.01Phase 3 Release: Interim release P3REL0707.01Spouses - Frequencies of Part 3: super-controlsSpouses - Frequencies of Part 3: super-controls

The GLM ProcedureThe GLM Procedure

Number of Observations Read 84742Number of Observations Read 84742Number of Observations Used 49624Number of Observations Used 49624

AHS43300.sas 09:30 Thursday, February AHS43300.sas 09:30 Thursday, February 28, 2008 112428, 2008 1124The GLM ProcedureThe GLM Procedure

Dependent Variable: bmi Body Mass IndexDependent Variable: bmi Body Mass Index

Sum ofSum ofSource DF Squares Mean Square F Value Pr > FSource DF Squares Mean Square F Value Pr > F

Model 1 14626.311 14626.311 695.33 <.0001Model 1 14626.311 14626.311 695.33 <.0001

Error 49622 1043803.927 21.035Error 49622 1043803.927 21.035

Corrected Total 49623 1058430.238Corrected Total 49623 1058430.238

R-Square Coeff Var Root MSE bmi MeanR-Square Coeff Var Root MSE bmi Mean

0.013819 17.55976 4.586404 26.118830.013819 17.55976 4.586404 26.11883

Source DF Type I SS Mean Square F Value Pr > FSource DF Type I SS Mean Square F Value Pr > F

years_on_farm 1 14626.31136 14626.31136 695.33 <.0001years_on_farm 1 14626.31136 14626.31136 695.33 <.0001

Source DF Type III SS Mean Square F Value Pr > FSource DF Type III SS Mean Square F Value Pr > F

years_on_farm 1 14626.31136 14626.31136 695.33 <.0001years_on_farm 1 14626.31136 14626.31136 695.33 <.0001

StandardStandardParameter Estimate Error t Value Pr > |t|Parameter Estimate Error t Value Pr > |t|

Intercept 25.02571119 0.04628587 540.68 <.0001Intercept 25.02571119 0.04628587 540.68 <.0001years_on_farm 0.02987844 0.00113309 26.37 <.0001years_on_farm 0.02987844 0.00113309 26.37 <.0001

AdjustedPROCGLM

AHS43300.sas 09:30 Thursday, February 28, 2008 AHS43300.sas 09:30 Thursday, February 28, 2008 11251125

The GLM ProcedureThe GLM Procedure

Class Level InformationClass Level Information

Class Levels ValuesClass Levels Values

race 5 1) White 2) Black 3) Native American 4) race 5 1) White 2) Black 3) Native American 4) Asian/PacificAsian/Pacific Islander 5) OtherIslander 5) Other

gender 2 1) Male 2) Femalegender 2 1) Male 2) Female

Number of Observations Read 84742Number of Observations Read 84742Number of Observations Used 31807Number of Observations Used 31807

AHS43300.sas 09:30 Thursday, February 28, 2008 1126AHS43300.sas 09:30 Thursday, February 28, 2008 1126

The GLM ProcedureThe GLM Procedure

Dependent Variable: bmi Body Mass IndexDependent Variable: bmi Body Mass Index

Sum ofSum ofSource DF Squares Mean Square F Value Pr > FSource DF Squares Mean Square F Value Pr > F

Model 8 25809.3778 3226.1722 140.96 <.0001Model 8 25809.3778 3226.1722 140.96 <.0001

Error 31798 727766.1040 22.8872Error 31798 727766.1040 22.8872

Corrected Total 31806 753575.4818Corrected Total 31806 753575.4818

R-Square Coeff Var Root MSE bmi MeanR-Square Coeff Var Root MSE bmi Mean

0.034249 18.68216 4.784053 25.607600.034249 18.68216 4.784053 25.60760

Source DF Type I SS Mean Square F Value Pr > FSource DF Type I SS Mean Square F Value Pr > F

race 4 5150.08 1287.520119 56.26 <.0001race 4 5150.08 1287.520119 56.26 <.0001gender 1 3862.26 3862.260203 168.75 <.0001gender 1 3862.26 3862.260203 168.75 <.0001height 1 7980.70 7980.705357 348.70 <.0001height 1 7980.70 7980.705357 348.70 <.0001age 1 7564.74 7564.740140 330.52 <.0001age 1 7564.74 7564.740140 330.52 <.0001years_on_farm 1 1251.59 1251.591649 54.69 <.0001years_on_farm 1 1251.59 1251.591649 54.69 <.0001

Source DF Type III SS Mean Square F Value Pr > FSource DF Type III SS Mean Square F Value Pr > F

race 4 4126.20 1031.551901 45.07 <.0001race 4 4126.20 1031.551901 45.07 <.0001gender 1 9300.84 9300.847470 406.38 <.0001gender 1 9300.84 9300.847470 406.38 <.0001height 1 5814.95 5814.952222 254.07 <.0001height 1 5814.95 5814.952222 254.07 <.0001age 1 1974.05 1974.050855 86.25 <.0001age 1 1974.05 1974.050855 86.25 <.0001years_on_farm 1 1251.59 1251.591649 54.69 <.0001years_on_farm 1 1251.59 1251.591649 54.69 <.0001

ODSODSAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AHS43300.sas AHS43300.sas 09:30 Thursday, February 28, 2008 112109:30 Thursday, February 28, 2008 1121Phase 1 Release: P1REL0506Phase 1 Release: P1REL0506Phase 2 Release: P2REL0612.03Phase 2 Release: P2REL0612.03Phase 3 Release: Interim release P3REL0707.01Phase 3 Release: Interim release P3REL0707.01Spouses - Frequencies of Part 3: super-controlsSpouses - Frequencies of Part 3: super-controls

The GLM ProcedureThe GLM Procedure

Number of Observations Read 84742Number of Observations Read 84742Number of Observations Used 49624Number of Observations Used 49624

AHS43300.sas 09:30 Thursday, February AHS43300.sas 09:30 Thursday, February 28, 2008 112428, 2008 1124The GLM ProcedureThe GLM Procedure

Dependent Variable: bmi Body Mass IndexDependent Variable: bmi Body Mass Index

Sum ofSum ofSource DF Squares Mean Square F Value Pr > FSource DF Squares Mean Square F Value Pr > F

Model 1 14626.311 14626.311 695.33 <.0001Model 1 14626.311 14626.311 695.33 <.0001

Error 49622 1043803.927 21.035Error 49622 1043803.927 21.035

Corrected Total 49623 1058430.238Corrected Total 49623 1058430.238

R-Square Coeff Var Root MSE bmi MeanR-Square Coeff Var Root MSE bmi Mean

0.013819 17.55976 4.586404 26.118830.013819 17.55976 4.586404 26.11883

Source DF Type I SS Mean Square F Value Pr > FSource DF Type I SS Mean Square F Value Pr > F

years_on_farm 1 14626.31136 14626.31136 695.33 <.0001years_on_farm 1 14626.31136 14626.31136 695.33 <.0001

Source DF Type III SS Mean Square F Value Pr > FSource DF Type III SS Mean Square F Value Pr > F

years_on_farm 1 14626.31136 14626.31136 695.33 <.0001years_on_farm 1 14626.31136 14626.31136 695.33 <.0001

StandardStandardParameter Estimate Error t Value Pr > |t|Parameter Estimate Error t Value Pr > |t|

Intercept 25.02571119 0.04628587 540.68 <.0001Intercept 25.02571119 0.04628587 540.68 <.0001years_on_farm 0.02987844 0.00113309 26.37 <.0001years_on_farm 0.02987844 0.00113309 26.37 <.0001

AdjustedPROCGLM

AHS43300.sas 09:30 Thursday, February 28, 2008 AHS43300.sas 09:30 Thursday, February 28, 2008 11251125

The GLM ProcedureThe GLM Procedure

Class Level InformationClass Level Information

Class Levels ValuesClass Levels Values

race 5 1) White 2) Black 3) Native American 4) race 5 1) White 2) Black 3) Native American 4) Asian/PacificAsian/Pacific Islander 5) OtherIslander 5) Other

gender 2 1) Male 2) Femalegender 2 1) Male 2) Female

Number of Observations Read 84742Number of Observations Read 84742Number of Observations Used 31807Number of Observations Used 31807

AHS43300.sas 09:30 Thursday, February 28, 2008 1126AHS43300.sas 09:30 Thursday, February 28, 2008 1126

The GLM ProcedureThe GLM Procedure

Dependent Variable: bmi Body Mass IndexDependent Variable: bmi Body Mass Index

Sum ofSum ofSource DF Squares Mean Square F Value Pr > FSource DF Squares Mean Square F Value Pr > F

Model 8 25809.3778 3226.1722 140.96 <.0001Model 8 25809.3778 3226.1722 140.96 <.0001

Error 31798 727766.1040 22.8872Error 31798 727766.1040 22.8872

Corrected Total 31806 753575.4818Corrected Total 31806 753575.4818

R-Square Coeff Var Root MSE bmi MeanR-Square Coeff Var Root MSE bmi Mean

0.034249 18.68216 4.784053 25.607600.034249 18.68216 4.784053 25.60760

Source DF Type I SS Mean Square F Value Pr > FSource DF Type I SS Mean Square F Value Pr > F

race 4 5150.08 1287.520119 56.26 <.0001race 4 5150.08 1287.520119 56.26 <.0001gender 1 3862.26 3862.260203 168.75 <.0001gender 1 3862.26 3862.260203 168.75 <.0001height 1 7980.70 7980.705357 348.70 <.0001height 1 7980.70 7980.705357 348.70 <.0001age 1 7564.74 7564.740140 330.52 <.0001age 1 7564.74 7564.740140 330.52 <.0001years_on_farm 1 1251.59 1251.591649 54.69 <.0001years_on_farm 1 1251.59 1251.591649 54.69 <.0001

Source DF Type III SS Mean Square F Value Pr > FSource DF Type III SS Mean Square F Value Pr > F

race 4 4126.20 1031.551901 45.07 <.0001race 4 4126.20 1031.551901 45.07 <.0001gender 1 9300.84 9300.847470 406.38 <.0001gender 1 9300.84 9300.847470 406.38 <.0001height 1 5814.95 5814.952222 254.07 <.0001height 1 5814.95 5814.952222 254.07 <.0001age 1 1974.05 1974.050855 86.25 <.0001age 1 1974.05 1974.050855 86.25 <.0001years_on_farm 1 1251.59 1251.591649 54.69 <.0001years_on_farm 1 1251.59 1251.591649 54.69 <.0001

Data set

ODSODSAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

AHS43300.sas 09:30 Thursday, February 28, 2008 AHS43300.sas 09:30 Thursday, February 28, 2008 11251125

The GLM ProcedureThe GLM Procedure

Class Level InformationClass Level Information

Class Levels ValuesClass Levels Values

race 5 1) White 2) Black 3) Native American 4) race 5 1) White 2) Black 3) Native American 4) Asian/PacificAsian/Pacific Islander 5) OtherIslander 5) Other

gender 2 1) Male 2) Femalegender 2 1) Male 2) Female

Number of Observations Read 84742Number of Observations Read 84742Number of Observations Used 31807Number of Observations Used 31807

AHS43300.sas 09:30 Thursday, February 28, 2008 1126AHS43300.sas 09:30 Thursday, February 28, 2008 1126

The GLM ProcedureThe GLM Procedure

Dependent Variable: bmi Body Mass IndexDependent Variable: bmi Body Mass Index

Sum ofSum ofSource DF Squares Mean Square F Value Pr > FSource DF Squares Mean Square F Value Pr > F

Model 8 25809.3778 3226.1722 140.96 <.0001Model 8 25809.3778 3226.1722 140.96 <.0001

Error 31798 727766.1040 22.8872Error 31798 727766.1040 22.8872

Corrected Total 31806 753575.4818Corrected Total 31806 753575.4818

R-Square Coeff Var Root MSE bmi MeanR-Square Coeff Var Root MSE bmi Mean

0.034249 18.68216 4.784053 25.607600.034249 18.68216 4.784053 25.60760

Source DF Type I SS Mean Square F Value Pr > FSource DF Type I SS Mean Square F Value Pr > F

race 4 5150.08 1287.520119 56.26 <.0001race 4 5150.08 1287.520119 56.26 <.0001gender 1 3862.26 3862.260203 168.75 <.0001gender 1 3862.26 3862.260203 168.75 <.0001height 1 7980.70 7980.705357 348.70 <.0001height 1 7980.70 7980.705357 348.70 <.0001age 1 7564.74 7564.740140 330.52 <.0001age 1 7564.74 7564.740140 330.52 <.0001years_on_farm 1 1251.59 1251.591649 54.69 <.0001years_on_farm 1 1251.59 1251.591649 54.69 <.0001

Source DF Type III SS Mean Square F Value Pr > FSource DF Type III SS Mean Square F Value Pr > F

race 4 4126.20 1031.551901 45.07 <.0001race 4 4126.20 1031.551901 45.07 <.0001gender 1 9300.84 9300.847470 406.38 <.0001gender 1 9300.84 9300.847470 406.38 <.0001height 1 5814.95 5814.952222 254.07 <.0001height 1 5814.95 5814.952222 254.07 <.0001age 1 1974.05 1974.050855 86.25 <.0001age 1 1974.05 1974.050855 86.25 <.0001years_on_farm 1 1251.59 1251.591649 54.69 <.0001years_on_farm 1 1251.59 1251.591649 54.69 <.0001

Data set Data set

ODSODSAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

Data set Data set Data set

ODSODSAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

CompositeData set

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

CompositeData set

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

Data set Data set Data set

CompositeData set

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

CompositeData set

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

Data set Data set Data set

CompositeData set

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

CompositeData set

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

Data set Data set Data set

CompositeData set

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

CompositeData set

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

Data set Data set Data set

CompositeData set

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

CompositeData set

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

Data set Data set Data set

CompositeData set

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

CompositeData set

The programmer must identify the mainThe programmer must identify the main

tasks required to complete this analysistasks required to complete this analysis

1.1. Initialize the Base Data Set Initialize the Base Data Set

The programmer must identify the mainThe programmer must identify the main

tasks required to complete this analysistasks required to complete this analysis

The programmer must identify the mainThe programmer must identify the main

tasks required to complete this analysistasks required to complete this analysis

1.1. Initialize the Base Data Set Initialize the Base Data Set

2.2. Produce a Summary Data Set of Mean StatisticsProduce a Summary Data Set of Mean Statistics

The programmer must identify the mainThe programmer must identify the main

tasks required to complete this analysistasks required to complete this analysis

1.1. Initialize the Base Data Set Initialize the Base Data Set

2.2. Produce a Summary Data Set of Mean StatisticsProduce a Summary Data Set of Mean Statistics

3.3. Produce a Summary Data Set of Crude Model EstimatesProduce a Summary Data Set of Crude Model Estimates

The programmer must identify the mainThe programmer must identify the main

tasks required to complete this analysistasks required to complete this analysis

1.1. Initialize the Base Data Set Initialize the Base Data Set

2.2. Produce a Summary Data Set of Mean StatisticsProduce a Summary Data Set of Mean Statistics

3.3. Produce a Summary Data Set of Crude Model EstimatesProduce a Summary Data Set of Crude Model Estimates

4.4. Produce a Summary Data Set of Adjusted Model EstimatesProduce a Summary Data Set of Adjusted Model Estimates

The programmer must identify the mainThe programmer must identify the main

tasks required to complete this analysistasks required to complete this analysis

1.1. Initialize the Base Data Set Initialize the Base Data Set

2.2. Produce a Summary Data Set of Mean StatisticsProduce a Summary Data Set of Mean Statistics

3.3. Produce a Summary Data Set of Crude Model EstimatesProduce a Summary Data Set of Crude Model Estimates

4.4. Produce a Summary Data Set of Adjusted Model EstimatesProduce a Summary Data Set of Adjusted Model Estimates

5.5. Append the Summary Data Sets to the Base Data SetAppend the Summary Data Sets to the Base Data Set

The programmer must identify the mainThe programmer must identify the main

tasks required to complete this analysistasks required to complete this analysis

1.1. Initialize the Base Data Set Initialize the Base Data Set

2.2. Produce a Summary Data Set of Mean StatisticsProduce a Summary Data Set of Mean Statistics

3.3. Produce a Summary Data Set of Crude Model EstimatesProduce a Summary Data Set of Crude Model Estimates

4.4. Produce a Summary Data Set of Adjusted Model EstimatesProduce a Summary Data Set of Adjusted Model Estimates

5.5. Append the Summary Data Sets to the Base Data SetAppend the Summary Data Sets to the Base Data Set

6.6. Create a Supervisory Macro to Delegate these Tasks through Create a Supervisory Macro to Delegate these Tasks through Invocations of other Macro ModulesInvocations of other Macro Modules

Secondary Tasks are Required to Secondary Tasks are Required to

Support these Main TasksSupport these Main Tasks

1.1. Initialize the Base Data Set Initialize the Base Data Set

2.2. Produce a Summary Data Set of Mean StatisticsProduce a Summary Data Set of Mean Statistics

3.3. Produce a Summary Data Set of Crude Model EstimatesProduce a Summary Data Set of Crude Model Estimates

4.4. Produce a Summary Data Set of Adjusted Model EstimatesProduce a Summary Data Set of Adjusted Model Estimates

5.5. Append the Summary Data Sets to the Base Data SetAppend the Summary Data Sets to the Base Data Set

6.6. Create a Supervisory Macro to Delegate these Tasks through Create a Supervisory Macro to Delegate these Tasks through Invocations of other Macro ModulesInvocations of other Macro Modules

1.1. Initialize the Base Data Set Initialize the Base Data Set

2.2. Produce a Summary Data Set of Mean StatisticsProduce a Summary Data Set of Mean Statistics

3.3. Produce a Summary Data Set of Crude Model EstimatesProduce a Summary Data Set of Crude Model Estimates

4.4. Produce a Summary Data Set of Adjusted Model EstimatesProduce a Summary Data Set of Adjusted Model Estimates

5.5. Append the Summary Data Sets to the Base Data SetAppend the Summary Data Sets to the Base Data Set

6.6. Create a Supervisory Macro to Delegate these Tasks through Create a Supervisory Macro to Delegate these Tasks through Invocations of other Macro ModulesInvocations of other Macro Modules

7.7. Validate the User Supplied InformationValidate the User Supplied Information

Secondary Tasks are Required to Secondary Tasks are Required to

Support these Main TasksSupport these Main Tasks

1.1. Initialize the Base Data Set Initialize the Base Data Set

2.2. Produce a Summary Data Set of Mean StatisticsProduce a Summary Data Set of Mean Statistics

3.3. Produce a Summary Data Set of Crude Model EstimatesProduce a Summary Data Set of Crude Model Estimates

4.4. Produce a Summary Data Set of Adjusted Model EstimatesProduce a Summary Data Set of Adjusted Model Estimates

5.5. Append the Summary Data Sets to the Base Data SetAppend the Summary Data Sets to the Base Data Set

6.6. Create a Supervisory Macro to Delegate these Tasks through Create a Supervisory Macro to Delegate these Tasks through Invocations of other Macro ModulesInvocations of other Macro Modules

7.7. Validate the User Supplied InformationValidate the User Supplied Information

8.8. Specify the Covariates for the Adjusted ModelSpecify the Covariates for the Adjusted Model

Secondary Tasks are Required to Secondary Tasks are Required to

Support these Main TasksSupport these Main Tasks

1.1. Initialize the Base Data Set Initialize the Base Data Set

2.2. Produce a Summary Data Set of Mean StatisticsProduce a Summary Data Set of Mean Statistics

3.3. Produce a Summary Data Set of Crude Model EstimatesProduce a Summary Data Set of Crude Model Estimates

4.4. Produce a Summary Data Set of Adjusted Model EstimatesProduce a Summary Data Set of Adjusted Model Estimates

5.5. Append the Summary Data Sets to the Base Data SetAppend the Summary Data Sets to the Base Data Set

6.6. Create a Supervisory Macro to Delegate these Tasks through Create a Supervisory Macro to Delegate these Tasks through Invocations of other Macro ModulesInvocations of other Macro Modules

7.7. Validate the User Supplied InformationValidate the User Supplied Information

8.8. Specify the Covariates for the Adjusted ModelSpecify the Covariates for the Adjusted Model

9.9. Create an Analysis Data SetCreate an Analysis Data Set

Secondary Tasks are Required to Secondary Tasks are Required to

Support these Main TasksSupport these Main Tasks

1.1. Initialize the Base Data Set Initialize the Base Data Set

2.2. Produce a Summary Data Set of Mean StatisticsProduce a Summary Data Set of Mean Statistics

3.3. Produce a Summary Data Set of Crude Model EstimatesProduce a Summary Data Set of Crude Model Estimates

4.4. Produce a Summary Data Set of Adjusted Model EstimatesProduce a Summary Data Set of Adjusted Model Estimates

5.5. Append the Summary Data Sets to the Base Data SetAppend the Summary Data Sets to the Base Data Set

6.6. Create a Supervisory Macro to Delegate these Tasks through Create a Supervisory Macro to Delegate these Tasks through Invocations of other Macro ModulesInvocations of other Macro Modules

7.7. Validate the User Supplied InformationValidate the User Supplied Information

8.8. Specify the Covariates for the Adjusted ModelSpecify the Covariates for the Adjusted Model

9.9. Create an Analysis Data SetCreate an Analysis Data Set

10.10. Generate the Summary ReportGenerate the Summary Report

Secondary Tasks are Required to Secondary Tasks are Required to

Support these Main TasksSupport these Main Tasks

Initialize the Base Data SetInitialize the Base Data Set

Initialize the Base Data SetInitialize the Base Data Set

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

Initialize the Base Data SetInitialize 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.

Initialize the Base Data SetInitialize 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: Remove the initial observation from this data set: xxxxResulting in a data set containing zero observations.Resulting in a data set containing zero observations.

Initialize the Base Data SetInitialize the Base Data Set

%%MACROMACRO initbase;%%MACROMACRO initbase;

%MACROMACRO initbase(base = ); DATA &base;

%MACROMACRO initbase(base = ); DATA &base;

Initialize the Base Data SetInitialize the Base Data Set

%MACROMACRO initbase(base = ); OPTIONS NONOTESOPTIONS NONOTES; DATA &base;

%MACROMACRO initbase(base = ); OPTIONS NONOTESOPTIONS NONOTES; DATA &base;

AssignAssign AttributesAttributes toto UnitializedUnitialized VariablesVariables

AssignAssign AttributesAttributes toto UnitializedUnitialized VariablesVariables

%MACROMACRO initbase(base = ); OPTIONS NONOTESOPTIONS NONOTES; DATADATA &base;

%MACROMACRO initbase(base = ); OPTIONS NONOTESOPTIONS NONOTES; DATADATA &base;

Assign Length AttributesAssign Length Attributes

%MACROMACRO initbase(base = ); OPTIONS NONOTESOPTIONS NONOTES; DATADATA &base; LENGTHLENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.;

%MACROMACRO initbase(base = ); OPTIONS NONOTESOPTIONS NONOTES; DATADATA &base; LENGTHLENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.;

Assign Label AttributesAssign Label Attributes

%MACROMACRO initbase(base = ); OPTIONS NONOTESOPTIONS NONOTES; DATADATA &base; LENGTHLENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABELLABEL 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"

%MACROMACRO initbase(base = ); OPTIONS NONOTESOPTIONS NONOTES; DATADATA &base; LENGTHLENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABELLABEL 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"

OPTIONS NONOTESOPTIONS NONOTES; DATADATA &base; LENGTHLENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABELLABEL 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 NONOTESOPTIONS NONOTES; DATADATA &base; LENGTHLENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABELLABEL 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

DATADATA &base; LENGTHLENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABELLABEL 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"

DATADATA &base; LENGTHLENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABELLABEL 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"

LENGTHLENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABELLABEL 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

LENGTHLENGTH key_var response_var $32 key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABELLABEL 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

key_label response_label $40 mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABELLABEL 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.; LABELLABEL 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"

mean stddev stderror n crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABELLABEL 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.; LABELLABEL 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

crude_estimate adjusted_estimate crude_stderr adjusted_stderr 8.; LABELLABEL 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.; LABELLABEL 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_stderr adjusted_stderr 8.; LABELLABEL 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.; LABELLABEL 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

LABELLABEL 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"

LABELLABEL 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"

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"

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";

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

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

Assign Format AttributesAssign 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;

Assign Format AttributesAssign 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"; FORMATFORMAT crude_estimate adjusted_estimate PVALUE6.4PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3ODDSR8.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"; FORMATFORMAT crude_estimate adjusted_estimate PVALUE6.4PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3ODDSR8.3; RUN;

OPTION NOTES;

DATA &base; SET &base; STOP; RUN;

%MEND initbase;

Do Not Output the ObservationDo 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"; FORMATFORMAT crude_estimate adjusted_estimate PVALUE6.4PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3ODDSR8.3; DELETEDELETE; 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"; FORMATFORMAT crude_estimate adjusted_estimate PVALUE6.4PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3ODDSR8.3; DELETEDELETE; RUN;RUN;; OPTION NOTES;

DATA &base; SET &base; STOP; RUN;

%MEND initbase;

Resume NOTES to the SAS LogResume 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"; FORMATFORMAT crude_estimate adjusted_estimate PVALUE6.4PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3ODDSR8.3; DELETEDELETE; RUNRUN;;

OPTION NOTESOPTION NOTES;

%MENDMEND 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"; FORMATFORMAT crude_estimate adjusted_estimate PVALUE6.4PVALUE6.4 crude_stderr adjusted_stderr ODDSR8.3ODDSR8.3; DELETEDELETE; RUNRUN;;

OPTION NOTESOPTION NOTES;

%MENDMEND initbase;

Invoke the INITBASE( ) Macro ModuleInvoke the INITBASE( ) Macro Module

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

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

Invoke the INITBASE( ) Macro ModuleInvoke the INITBASE( ) Macro Module

Only if the BASE data set does not existOnly if the BASE data set does not exist

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile) NENE 1 %THENTHEN %initbase(base=&outfile);

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile) NENE 1 %THENTHEN %initbase(base=&outfile);

The CONTENTS Procedure (abbreviated)

Data Set Name WORK.GLM_SUMMARY Observations 00

# 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 Variable10 n Num 8 PROC MEANS: N of Independent Variable11 crude_estimate Num 8 PVALUE6.4 Crude PROC GLM: Parameter Estimate12 adjusted_estimate Num 8 PVALUE6.4 Adjusted PROC GLM: Parameter Estimate13 crude_stderr Num 8 ODDSR8.3 Crude PROC GLM: Standard Error of Estimate14 adjusted_stderr Num 8 ODDSR8.3 Adjusted PROC GLM: Standard Error of Estimate

Produces the Following Data Set with Produces the Following Data Set with Zero ObservationsZero Observations

Design a Macro Module to Produce aDesign a Macro Module to Produce a

Data Set Containing a Mean StatisticData Set Containing a Mean Statistic

Design a Macro Module to Produce aDesign a Macro Module to Produce a

Data Set Containing a Mean StatisticData Set Containing a Mean Statistic

Add Labels for Reporting PurposesAdd Labels for Reporting Purposes

1.1. One Major task per moduleOne Major task per module

Design a Macro Module to Produce aDesign a Macro Module to Produce a

Data Set Containing a Mean StatisticData Set Containing a Mean Statistic

1.1. One Major task per moduleOne Major task per module

2.2. Keep the coding as simple as possibleKeep the coding as simple as possible

Design a Macro Module to Produce aDesign a Macro Module to Produce a

Data Set Containing a Mean StatisticData Set Containing a Mean Statistic

1.1. One Major task per moduleOne Major task per module

2.2. Keep the coding as simple as possibleKeep the coding as simple as possible

3.3. Should the Module be Should the Module be

a. Customizeda. Customized

Design a Macro Module to Produce aDesign a Macro Module to Produce a

Data Set Containing a Mean StatisticData Set Containing a Mean Statistic

1.1. One Major task per moduleOne Major task per module

2.2. Keep the coding as simple as possibleKeep the coding as simple as possible

3.3. Should the Module be Should the Module be

a. Customizeda. Customized

b. Portableb. Portable

Design a Macro Module to Produce aDesign a Macro Module to Produce a

Data Set Containing a Mean StatisticData Set Containing a Mean Statistic

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

• PROC MEANSPROC MEANS

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

• PROC MEANSPROC MEANS

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

Requires 2 VARS for Labels to OutputRequires 2 VARS for Labels to Output

• PROC MEANSPROC MEANS

• PROC UNIVARIATEPROC UNIVARIATE

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

• PROC MEANSPROC MEANS

• PROC UNIVARIATEPROC UNIVARIATE

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

No LabelsNo Labels

• PROC MEANSPROC MEANS

• PROC UNIVARIATEPROC UNIVARIATE

• PROC SUMMARYPROC SUMMARY

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

• PROC MEANSPROC MEANS

• PROC UNIVARIATEPROC UNIVARIATE

• PROC SUMMARYPROC SUMMARY

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

Need to Massage Output Data SetsNeed to Massage Output Data Sets

• PROC MEANSPROC MEANS

• PROC UNIVARIATEPROC UNIVARIATE

• PROC SUMMARYPROC SUMMARY

• DATA Step ProcessingDATA Step Processing

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

• PROC MEANSPROC MEANS

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

Requires 2 VARS for Labels to OutputRequires 2 VARS for Labels to Output

PROC MEANS PROC MEANS

Produces the following Contents

PROC MEANS DATA PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm; years_on_farm;RUNRUN;;

PROC MEANS DATA PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm; years_on_farm;RUNRUN;;

PROC MEANS PROC MEANS

Produces the following Contents

ODS OUTPUTODS OUTPUT summary=summary_means;PROC MEANS DATA PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm; years_on_farm;RUNRUN;;ODS OUTPUT CLOSEODS OUTPUT CLOSE;

ODS OUTPUTODS OUTPUT summary=summary_means;PROC MEANS DATA PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm; years_on_farm;RUNRUN;;ODS OUTPUT CLOSEODS OUTPUT CLOSE;

PROC MEANS PROC MEANS

Produces the following Data SetProduces the following Data Set

ODS OUTPUTODS OUTPUT summary=summary_means;PROC MEANS DATA PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm; years_on_farm;RUNRUN;;ODS OUTPUT CLOSEODS OUTPUT CLOSE;

ODS OUTPUTODS OUTPUT summary=summary_means;PROC MEANS DATA PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm; years_on_farm;RUNRUN;;ODS OUTPUT CLOSEODS 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

PROC MEANS PROC MEANS

Produces the following ContentsProduces the following Contents

ODS OUTPUTODS OUTPUT summary=summary_means;PROC MEANS DATA PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm; years_on_farm;RUNRUN;;ODS OUTPUT CLOSEODS OUTPUT CLOSE;

ODS OUTPUTODS OUTPUT summary=summary_means;PROC MEANS DATA PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm; years_on_farm;RUNRUN;;ODS OUTPUT CLOSEODS 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

PROC MEANS PROC MEANS

Produces the following Contents

ODS OUTPUTODS OUTPUT summary=summary_means;PROC MEANS DATA PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm years_on_farm bmibmi;;RUNRUN;;ODS OUTPUT CLOSEODS OUTPUT CLOSE;

ODS OUTPUTODS OUTPUT summary=summary_means;PROC MEANS DATA PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm years_on_farm bmibmi;;RUNRUN;;ODS OUTPUT CLOSEODS OUTPUT CLOSE;

PROC MEANS PROC MEANS

Produces the following ContentsProduces the following Contents

PROC CONTENTS(abbreviated)

# Variable Type Len Format Label ----------------------------------------------------------------------------- 1 VName_years_on_farm Char 13 Variable1 VName_years_on_farm Char 13 Variable 2 Label_years_on_farm Char 29 Label2 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 Variable7 VName_bmi Char 3 Variable 8 Label_bmi Char 15 Label8 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

PROC MEANS PROC MEANS

Drop BMI statisticsDrop 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

PROC MEANS PROC MEANS

Rename the VariablesRename 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

PROC MEANS PROC MEANS

ODS OUTPUTODS 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 PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm bmi; years_on_farm bmi;RUNRUN;;ODS OUTPUT CLOSEODS OUTPUT CLOSE;

ODS OUTPUTODS 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 PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm bmi; years_on_farm bmi;RUNRUN;;ODS OUTPUT CLOSEODS OUTPUT CLOSE;

PROC MEANS PROC MEANS

Drop Response Variable StatisticsDrop Response Variable Statistics

ODS OUTPUTODS OUTPUT summary=summary_means (DROPDROP=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 PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm bmi; years_on_farm bmi;RUNRUN;;ODS OUTPUT CLOSEODS OUTPUT CLOSE;

ODS OUTPUTODS OUTPUT summary=summary_means (DROPDROP=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 PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm bmi; years_on_farm bmi;RUNRUN;;ODS OUTPUT CLOSEODS OUTPUT CLOSE;

PROC MEANS PROC MEANS

RenameRename OutputOutput toto MatchMatch BASEBASE DataData SetSet

ODS OUTPUTODS OUTPUT summary=summary_means (DROPDROP=bmi:) RENAMERENAME=(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 PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm bmi; years_on_farm bmi;RUNRUN;;ODS OUTPUT CLOSEODS OUTPUT CLOSE;

ODS OUTPUTODS OUTPUT summary=summary_means (DROPDROP=bmi:) RENAMERENAME=(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 PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm bmi; years_on_farm bmi;RUNRUN;;ODS OUTPUT CLOSEODS OUTPUT CLOSE;

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 PROC MEANS

Contents of Final Summary Data SetContents of Final Summary Data Set

Attributes after Appending to Attributes after Appending to

BASEBASE DataData SetSet

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

PROC MEANS PROC MEANS (macrotize)%MACRO procmeans(data= var1= var2= );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT summary=summary_means (DROPDROP=bmi: ) RENAMERENAME=(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 PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm bmi ; years_on_farm bmi ; RUNRUN;; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MEND procmeans;

%MACRO procmeans(data= var1= var2= );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT summary=summary_means (DROPDROP=bmi: ) RENAMERENAME=(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 PROC MEANS DATA = mydata MEAN N STDERR STDMEAN N STDERR STD;; VARVAR years_on_farm bmi ; years_on_farm bmi ; RUNRUN;; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MEND procmeans;

PROC MEANS (macrotize)PROC MEANS (macrotize)%MACRO procmeans(data= var1= var2= );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT summary=summary_means (DROPDROP==&var1&var1:) RENAMERENAME=(vname__&var1&var1 =response_var =response_var label_label_&var1&var1 =response_label =response_label vname_vname_&var2&var2 =key_var =key_var label_label_&var2&var2 =key_label =key_label &var2&var2._mean =mean._mean =mean &var2&var2._n =n._n =n &var2&var2._stderr =stderror._stderr =stderror &var2&var2._._stddev =stddev )); ; PROC MEANS DATA PROC MEANS DATA = &data&data MEAN N STDERR STDMEAN N STDERR STD;; VARVAR &var2 &var1&var2 &var1;; RUNRUN;; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MEND procmeans;

%MACRO procmeans(data= var1= var2= );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT summary=summary_means (DROPDROP==&var1&var1:) RENAMERENAME=(vname__&var1&var1 =response_var =response_var label_label_&var1&var1 =response_label =response_label vname_vname_&var2&var2 =key_var =key_var label_label_&var2&var2 =key_label =key_label &var2&var2._mean =mean._mean =mean &var2&var2._n =n._n =n &var2&var2._stderr =stderror._stderr =stderror &var2&var2._._stddev =stddev )); ; PROC MEANS DATA PROC MEANS DATA = &data&data MEAN N STDERR STDMEAN N STDERR STD;; VARVAR &var2 &var1&var2 &var1;; RUNRUN;; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MEND procmeans;

PROC MEANS (macrotize)PROC MEANS (macrotize)%MACRO %MACRO procmeans(data= var1= var2= );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT summary=summary_means (DROPDROP=&var1:) RENAMERENAME=(vname_&var1 =response_var =response_var labellabel_&var1 =response_label =response_label vname_&var2 =key_varvname_&var2 =key_var label_&var2 =key_labellabel_&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 PROC MEANS DATA = &data MEAN N STDERR STDMEAN N STDERR STD;; VARVAR &var2 &var1;; RUNRUN;; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procmeans;

%MACRO %MACRO procmeans(data= var1= var2= );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT summary=summary_means (DROPDROP=&var1:) RENAMERENAME=(vname_&var1 =response_var =response_var labellabel_&var1 =response_label =response_label vname_&var2 =key_varvname_&var2 =key_var label_&var2 =key_labellabel_&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 PROC MEANS DATA = &data MEAN N STDERR STDMEAN N STDERR STD;; VARVAR &var2 &var1;; RUNRUN;; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procmeans;

PROC MEANS (macrotize)PROC MEANS (macrotize)%MACRO %MACRO procmeans(data= var1= var2= );

ODS LISTING CLOSEODS LISTING CLOSE; ODS OUTPUTODS OUTPUT summary=summary_means (DROPDROP=&var1:) RENAMERENAME=(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 PROC MEANS DATA = &data MEAN N STDERR STDMEAN N STDERR STD;; VARVAR &var2 &var1;; RUNRUN;; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTINGODS LISTING;

%MENDMEND procmeans;

%MACRO %MACRO procmeans(data= var1= var2= );

ODS LISTING CLOSEODS LISTING CLOSE; ODS OUTPUTODS OUTPUT summary=summary_means (DROPDROP=&var1:) RENAMERENAME=(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 PROC MEANS DATA = &data MEAN N STDERR STDMEAN N STDERR STD;; VARVAR &var2 &var1;; RUNRUN;; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTINGODS LISTING;

%MENDMEND procmeans;

PROC MEANS (invoke)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;

PROC MEANS PROC MEANS

Contents after AppendingContents 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

Create a Data Set with Crude ModelCreate a Data Set with Crude Model

Estimates And Standard ErrorsEstimates And Standard Errors

%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"))); PROCPROC GLMGLM DATADATA=mydata;

MODELMODEL bmi = years_on_farm; QUITQUIT;

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"))); PROCPROC GLMGLM DATADATA=mydata;

MODELMODEL bmi = years_on_farm; QUITQUIT;

ODS LISTING;

%MEND procglm;

PROC GLMPROC GLM(macrotize)

%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 DATAPROC GLM DATA=&data&data;

MODELMODEL &response&response = &independent&independent ; QUITQUIT;

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 DATAPROC GLM DATA=&data&data;

MODELMODEL &response&response = &independent&independent ; QUITQUIT;

ODS OUTPUT CLOSE; %MEND procglm;

PROC GLM(macrotize)

%MACROMACRO 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 DATAPROC GLM DATA=&data;

MODELMODEL &response = &independent&response = &independent ; QUITQUIT;

ODS LISTING;

%MENDMEND procglm;

%MACROMACRO 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 DATAPROC GLM DATA=&data;

MODELMODEL &response = &independent&response = &independent ; QUITQUIT;

ODS LISTING;

%MENDMEND procglm;

PROC GLM(macrotize)PROC GLM(macrotize)

%MACROMACRO procglm (data = , response = , independent = ); independent = , class_vars = , continuous_vars = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glmsummary_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 DATAPROC GLM DATA=&data;

MODELMODEL &response = &independent&response = &independent ; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE;

%MENDMEND procglm;

%MACROMACRO procglm (data = , response = , independent = ); independent = , class_vars = , continuous_vars = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glmsummary_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 DATAPROC GLM DATA=&data;

MODELMODEL &response = &independent&response = &independent ; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE;

%MENDMEND procglm;

Route Output to a SAS Data SetRoute Output to a SAS Data Set

%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( ) ModuleInvoke the PROCGLM( ) Module

PROC PRINT of the Data Set PROC PRINT of the Data Set

SUMMARY_GLM 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

PROC PRINT of the Data Set PROC PRINT of the Data Set

SUMMARY_GLM SUMMARY_GLM

Remove Unwanted informationRemove 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

PROC PRINT of the Data Set PROC PRINT of the Data Set

SUMMARY_GLM SUMMARY_GLM

Remove Unwanted informationRemove Unwanted information

Obs Parameter Estimate StdErr

1 Intercept 25.039 0.0463 2 years_on_farm 0.0299 0.0011

PROC PRINT of the Data Set PROC PRINT of the Data Set

SUMMARY_GLM SUMMARY_GLM

Keep Only the Row for years_on_farmKeep 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

PROC PRINT of the Data Set PROC PRINT of the Data Set

SUMMARY_GLM SUMMARY_GLM

Keep Only the Row for years_on_farmKeep Only the Row for years_on_farm

Obs Parameter Estimate StdErr

2 years_on_farm 0.0299 0.0011

PROC PRINT of the Data Set PROC PRINT of the Data Set

SUMMARY_GLM SUMMARY_GLM

Create the key_varCreate the key_var

Obs Parameter Estimate StdErr

2 years_on_farm 0.0299 0.0011

PROC PRINT of the Data Set PROC PRINT of the Data Set

SUMMARY_GLM SUMMARY_GLM

Create the key_varCreate the key_var

Obs key_var Estimate StdErr

2 years_on_farm 0.0299 0.0011

%MACROMACRO procglm (data = , response = , independent = ); independent = , class_vars = , continuous_vars = );

ODS LISTING CLOSE; ODS OUTPUTODS 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 DATAPROC GLM DATA=&data;

MODELMODEL &response = &independent&response = &independent ; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%MACROMACRO procglm (data = , response = , independent = ); independent = , class_vars = , continuous_vars = );

ODS LISTING CLOSE; ODS OUTPUTODS 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 DATAPROC GLM DATA=&data;

MODELMODEL &response = &independent&response = &independent ; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%MACROMACRO procglm (data = , response = , independent = ); independent = , class_vars = , continuous_vars = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glm (DROPDROP = dependent probt tvaluedependent probt tvalue); RENAME = (Parameter = Key_var = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATAPROC GLM DATA=&data; MODELMODEL &response = &independent ; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%MACROMACRO procglm (data = , response = , independent = ); independent = , class_vars = , continuous_vars = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glm (DROPDROP = dependent probt tvaluedependent probt tvalue); RENAME = (Parameter = Key_var = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATAPROC GLM DATA=&data; MODELMODEL &response = &independent ; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%MACROMACRO procglm (data = , response = , independent = ); independent = , class_vars = , continuous_vars = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var)); = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATAPROC GLM DATA=&data;

MODELMODEL &response = &independent ; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%MACROMACRO procglm (data = , response = , independent = ); independent = , class_vars = , continuous_vars = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var)); = Estimate WHERE=(UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATAPROC GLM DATA=&data;

MODELMODEL &response = &independent ; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%MACROMACRO procglm (data = , response = , independent = ); independent = , class_vars = , continuous_vars = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var) = Estimate WHERE WHERE=(UPCASE(key_var)=UPCASE("&independent")UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATAPROC GLM DATA=&data; MODELMODEL &response = &independent ; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%MACROMACRO procglm (data = , response = , independent = ); independent = , class_vars = , continuous_vars = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var) = Estimate WHERE WHERE=(UPCASE(key_var)=UPCASE("&independent")UPCASE(key_var)=UPCASE("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATAPROC GLM DATA=&data; MODELMODEL &response = &independent ; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

Create a Data Set with Adjusted ModelCreate a Data Set with Adjusted Model

Estimates And Standard ErrorsEstimates And Standard Errors

%MACROMACRO procglm (data = , response = , independent = ); class_vars = ,independent = , continuous_vars = ); continuous_vars = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var) = Estimate WHEREWHERE=(UPCASEUPCASE(key_var)=(key_var)=UPCASEUPCASE("&independent")("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATAPROC GLM DATA=&data; MODELMODEL &response = &independent ; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%MACROMACRO procglm (data = , response = , independent = ); class_vars = ,independent = , continuous_vars = ); continuous_vars = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var) = Estimate WHEREWHERE=(UPCASEUPCASE(key_var)=(key_var)=UPCASEUPCASE("&independent")("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATAPROC GLM DATA=&data; MODELMODEL &response = &independent ; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%MACROMACRO procglm (data = , response = , independent = , class_varsclass_vars = ,independent = , continuous_varscontinuous_vars = ); continuous_vars = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var) = Estimate WHEREWHERE=(UPCASEUPCASE(key_var)=(key_var)=UPCASEUPCASE("&independent")("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATAPROC GLM DATA=&data; MODELMODEL &response = &independent ; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%MACROMACRO procglm (data = , response = , independent = , class_varsclass_vars = ,independent = , continuous_varscontinuous_vars = ); continuous_vars = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var) = Estimate WHEREWHERE=(UPCASEUPCASE(key_var)=(key_var)=UPCASEUPCASE("&independent")("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATAPROC GLM DATA=&data; MODELMODEL &response = &independent ; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%MACROMACRO procglm (data = , response = , independent = , class_vars = ,independent = , continuous_vars = ); continuous_vars = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var) = Estimate WHEREWHERE=(UPCASEUPCASE(key_var)=(key_var)=UPCASEUPCASE("&independent")("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATAPROC GLM DATA=&data; CLASSCLASS &class_vars&class_vars; MODELMODEL &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%MACROMACRO procglm (data = , response = , independent = , class_vars = ,independent = , continuous_vars = ); continuous_vars = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var) = Estimate WHEREWHERE=(UPCASEUPCASE(key_var)=(key_var)=UPCASEUPCASE("&independent")("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATAPROC GLM DATA=&data; CLASSCLASS &class_vars&class_vars; MODELMODEL &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND 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;

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( ) ModuleInvoke the PROCGLM( ) Module

PROC PRINT of the Data Set PROC PRINT of the Data Set

SUMMARY_GLM 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

PROC PRINT of the Data Set PROC PRINT of the Data Set

SUMMARY_GLM 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

Final Version of the Data Set Final Version of the Data Set

SUMMARY_GLM SUMMARY_GLM

Obs Parameter Estimate StdErr

6 years_on_farm 0.0139 0.0019

Final Version of the Data Set Final Version of the Data Set

SUMMARY_GLM SUMMARY_GLM

Obs key_var Estimate StdErr

6 years_on_farm 0.0139 0.0019

Two Versions of Two Versions of

SUMMARY_GLM SUMMARY_GLM

Obs key_var Estimate StdErr

6 years_on_farm 0.0139 0.0019

Adjusted_ Adjusted_ Obs key_var Estimate StdErr

6 years_on_farm 0.0139 0.0019

SUMMARY_CRUDE_GLM

SUMMARY_ADJUSTED_GLM SUMMARY_ADJUSTED_GLM

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.0019

SUMMARY_CRUDE_GLMSUMMARY_CRUDE_GLM

SUMMARY_ADJUSTED_GLM SUMMARY_ADJUSTED_GLM

%MACROMACRO procglm (data = , response = , independent = , class_vars = ,independent = , continuous_vars = ); test = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var) = Estimate WHEREWHERE=(UPCASEUPCASE(key_var)=(key_var)=UPCASEUPCASE("&independent")("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATAPROC GLM DATA=&data; CLASSCLASS &class_vars&class_vars; MODELMODEL &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%MACROMACRO procglm (data = , response = , independent = , class_vars = ,independent = , continuous_vars = ); test = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var) = Estimate WHEREWHERE=(UPCASEUPCASE(key_var)=(key_var)=UPCASEUPCASE("&independent")("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATAPROC GLM DATA=&data; CLASSCLASS &class_vars&class_vars; MODELMODEL &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%MACROMACRO procglm (data = , response = , independent = , class_vars = ,independent = , continuous_vars = , testtest = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var) = Estimate WHEREWHERE=(UPCASEUPCASE(key_var)=(key_var)=UPCASEUPCASE("&independent")("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATAPROC GLM DATA=&data; CLASSCLASS &class_vars&class_vars; MODELMODEL &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MEND MEND procglm;

%MACROMACRO procglm (data = , response = , independent = , class_vars = ,independent = , continuous_vars = , testtest = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var) = Estimate WHEREWHERE=(UPCASEUPCASE(key_var)=(key_var)=UPCASEUPCASE("&independent")("&independent"))); stderr = stderr) WHERE=(UPCASE(key_var)=UPCASE("&independent"))); PROC GLM DATAPROC GLM DATA=&data; CLASSCLASS &class_vars&class_vars; MODELMODEL &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MEND MEND procglm;

%MACROMACRO procglm (data = , response = , independent = , class_vars = ,independent = , continuous_vars = , testtest = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary__&test&test._glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var Estimate = Estimate = &test&test._estimate._estimate StdErr = StdErr = &test&test._stderr._stderr) = Estimate WHEREWHERE=(UPCASEUPCASE(key_var)=(key_var)=UPCASEUPCASE("&independent")("&independent"))); PROC GLM DATAPROC GLM DATA=&data; CLASSCLASS &class_vars&class_vars; MODELMODEL &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%MACROMACRO procglm (data = , response = , independent = , class_vars = ,independent = , continuous_vars = , testtest = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary__&test&test._glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var Estimate = Estimate = &test&test._estimate._estimate StdErr = StdErr = &test&test._stderr._stderr) = Estimate WHEREWHERE=(UPCASEUPCASE(key_var)=(key_var)=UPCASEUPCASE("&independent")("&independent"))); PROC GLM DATAPROC GLM DATA=&data; CLASSCLASS &class_vars&class_vars; MODELMODEL &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%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( )Two Invocations of PROCGLM( )

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.0019

SUMMARY_CRUDE_GLMSUMMARY_CRUDE_GLM

SUMMARY_ADJUSTED_GLM SUMMARY_ADJUSTED_GLM

%MACRO MACRO procglm (data = , response = , independent = , class_vars = ,independent = , continuous_vars = , testtest = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_&test_&test._glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var Estimate = &test._estimateEstimate = &test._estimate StdErr = &test._stderrStdErr = &test._stderr) = Estimate WHEREWHERE=(UPCASEUPCASE(key_var)=(key_var)=UPCASEUPCASE("&independent")("&independent"))); PROC GLM DATAPROC GLM DATA=&data; CLASS CLASS &class_vars&class_vars; MODELMODEL &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%MACRO MACRO procglm (data = , response = , independent = , class_vars = ,independent = , continuous_vars = , testtest = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_&test_&test._glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var Estimate = &test._estimateEstimate = &test._estimate StdErr = &test._stderrStdErr = &test._stderr) = Estimate WHEREWHERE=(UPCASEUPCASE(key_var)=(key_var)=UPCASEUPCASE("&independent")("&independent"))); PROC GLM DATAPROC GLM DATA=&data; CLASS CLASS &class_vars&class_vars; MODELMODEL &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MENDMEND procglm;

%MACRO MACRO procglm (data = , response = , independent = , class_vars = ,independent = , continuous_vars = , testtest = );

ODS LISTING CLOSEODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_&test_&test._glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var Estimate = &test._estimateEstimate = &test._estimate StdErr = &test._stderrStdErr = &test._stderr) = Estimate WHEREWHERE=(UPCASEUPCASE(key_var)=(key_var)=UPCASEUPCASE("&independent")("&independent"))); PROC GLM DATAPROC GLM DATA=&data; CLASSCLASS &class_vars&class_vars; MODELMODEL &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTINGODS LISTING;

%MEND MEND procglm;

%MACRO MACRO procglm (data = , response = , independent = , class_vars = ,independent = , continuous_vars = , testtest = );

ODS LISTING CLOSEODS LISTING CLOSE; ODS OUTPUTODS OUTPUT parameterestimates=summary_&test_&test._glm (DROPDROP = dependent probt tvalue RENAMERENAME = (Parameter = Key_varKey_var Estimate = &test._estimateEstimate = &test._estimate StdErr = &test._stderrStdErr = &test._stderr) = Estimate WHEREWHERE=(UPCASEUPCASE(key_var)=(key_var)=UPCASEUPCASE("&independent")("&independent"))); PROC GLM DATAPROC GLM DATA=&data; CLASSCLASS &class_vars&class_vars; MODELMODEL &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars; QUITQUIT; ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTINGODS LISTING;

%MEND MEND procglm;

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_MEANS

SUMMARY_CRUDE_GLMSUMMARY_CRUDE_GLM

SUMMARY_ADJUSTED_GLM SUMMARY_ADJUSTED_GLM

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_MEANS

SUMMARY_CRUDE_GLMSUMMARY_CRUDE_GLM

SUMMARY_ADJUSTED_GLM SUMMARY_ADJUSTED_GLM key_var response_var mean n stderr stddev years_on_farm bmi 36.213 53482 0.079 18.259

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_MEANS

SUMMARY_CRUDE_GLMSUMMARY_CRUDE_GLM

SUMMARY_ADJUSTED_GLM SUMMARY_ADJUSTED_GLM key_var response_var mean n stderr stddev years_on_farm bmi 36.213 53482 0.079 18.259

SUMMARYSET( ) macro moduleSUMMARYSET( ) macro module

Merge these three datasets into a Merge these three datasets into a composite summary datasetcomposite summary dataset

%MACRO summaryset(merge_var = , base = , setlist = , delsets = , class_vars = , continuous_vars = ); %LOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECT TRIMSELECT TRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTOINTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROM DICTIONARYFROM DICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" ANDAND          MEMNAME LIKEMEMNAME LIKE " "SUMMARY_SUMMARY_";"; QUIT QUIT ; ;

%MACRO summaryset(merge_var = , base = , setlist = , delsets = , class_vars = , continuous_vars = ); %LOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECT TRIMSELECT TRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTOINTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROM DICTIONARYFROM DICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" ANDAND          MEMNAME LIKEMEMNAME LIKE " "SUMMARY_SUMMARY_";"; QUIT QUIT ; ;

SUMMARYSET( ) macro moduleSUMMARYSET( ) macro module

%MACRO summaryset(merge_var = , base = , setlist = , delsets = , class_vars = , continuous_vars = ); %LOCAL i dsets;

%%LETLET dsetsdsets == SUMMARY_SUMMARY_MEANSMEANS SUMMARY_SUMMARY_CRUDE_GLMCRUDE_GLM SUMMARY_SUMMARY_ADJUSTED_GLM;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;

%%LETLET dsetsdsets == SUMMARY_SUMMARY_MEANSMEANS SUMMARY_SUMMARY_CRUDE_GLMCRUDE_GLM SUMMARY_SUMMARY_ADJUSTED_GLM;ADJUSTED_GLM;      SELECT TRIM(LIBNAME) || "." || MEMNAME     INTO :dsets SEPARATED BY " "      FROM DICTIONARY.TABLES   WHERE LIBNAME = "WORK" AND     MEMNAME LIKE "SUMMARY_"; QUIT ;

SUMMARYSET( ) macro moduleSUMMARYSET( ) macro module

%MACRO summaryset(merge_var = , base = , setlist = , delsets = , class_vars = , continuous_vars = ); %LOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("("&setlist&setlist%");%"); QUITQUIT ; ;

%MACRO summaryset(merge_var = , base = , setlist = , delsets = , class_vars = , continuous_vars = ); %LOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("("&setlist&setlist%");%"); QUITQUIT ; ;

SUMMARYSET( ) macro module SUMMARYSET( ) macro module

%MACROMACRO summaryset(setlist = ); base = , setlist = , delsets = , class_vars = , continuous_vars = ); %LOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("("&setlist&setlist%");%"); QUITQUIT ; ;

%MACROMACRO summaryset(setlist = ); base = , setlist = , delsets = , class_vars = , continuous_vars = ); %LOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("("&setlist&setlist%");%"); QUITQUIT ; ;

SUMMARYSET( ) macro moduleSUMMARYSET( ) macro module

%MACROMACRO summaryset(merge_var = , base = , setlist = , delsets = , class_vars = , continuous_vars = ); %LOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ; ;;

%MACROMACRO summaryset(merge_var = , base = , setlist = , delsets = , class_vars = , continuous_vars = ); %LOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ; ;;

SUMMARYSET( ) macro moduleSUMMARYSET( ) macro module

%MACROMACRO summaryset(merge_var = , base = , setlist = , delsets = , class_vars = , continuous_vars = ); %LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%MACROMACRO summaryset(merge_var = , base = , setlist = , delsets = , class_vars = , continuous_vars = ); %LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

SUMMARYSET( ) macro moduleSUMMARYSET( ) macro module

%MACROMACRO summaryset(merge_var = , base = , setlist = , delsets = , class_vars = , continuous_vars = ); %LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( ))));

%MACROMACRO summaryset(merge_var = , base = , setlist = , delsets = , class_vars = , continuous_vars = ); %LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%DO %UNTIL (NOT %LENGTH(%SCAN(&dsets,&i, %STR( ))));

SUMMARYSET( ) macro module

%MACROMACRO summaryset(merge_var = , base = , setlist = , delsets = , class_vars = , continuous_vars = ); %LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( ));

%MACROMACRO summaryset(merge_var = , base = , setlist = , delsets = , class_vars = , continuous_vars = ); %LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( ));

SUMMARYSET( ) macro module

base = , setlist = , delsets = , class_vars = , continuous_vars = ); %LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var;

base = , setlist = , delsets = , class_vars = , continuous_vars = ); %LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var;

SUMMARYSET( ) macro module

setlist = , delsets = , class_vars = , continuous_vars = ); %LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN;

setlist = , delsets = , class_vars = , continuous_vars = ); %LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN;

SUMMARYSET( ) macro module

delsets = , class_vars = , continuous_vars = ); %LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1); (&i+1);

delsets = , class_vars = , continuous_vars = ); %LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1); (&i+1);

SUMMARYSET( ) macro module

class_vars = , continuous_vars = ); %LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

class_vars = , continuous_vars = ); %LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

SUMMARYSET( ) macro module

continuous_vars = ); %LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

continuous_vars = ); %LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

SUMMARYSET( ) macro module

%LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_;

%LOCALLOCAL i dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_;

SUMMARYSET( ) macro module

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets;

SUMMARYSET( ) macro module

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var;

  PROC SQL NOPRINTPROC SQL NOPRINT ; ;      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var;

SUMMARYSET( ) macro module

      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars";

      SELECTSELECT TRIMTRIM((LIBNAMELIBNAME) || "." || ) || "." || MEMNAMEMEMNAME          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars";

SUMMARYSET( ) macro module

          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars";

          INTO INTO :dsets :dsets SEPARATED BYSEPARATED BY " " " "            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars";

SUMMARYSET( ) macro module

            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

            FROMFROM DICTIONARYDICTIONARY..TABLESTABLES      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

SUMMARYSET( ) macro module

      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

      WHERE LIBNAMEWHERE LIBNAME = "WORK" = "WORK" AND AND MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

SUMMARYSET( ) macro module

MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;;

MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;;

SUMMARYSET( ) macro module

MEMNAME LIKE UPCASE("&setlist%"); QUIT ;

%LET i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var&merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPEND BASE=&base DATA=&setlist FORCE;

MEMNAME LIKE UPCASE("&setlist%"); QUIT ;

%LET i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var&merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPEND BASE=&base DATA=&setlist FORCE;

Sort the 3 Summary Sets by key_varSort the 3 Summary Sets by key_var

MEMNAME LIKE UPCASE("&setlist%"); QUIT ;

%LET i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var&merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var&merge_var;; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPEND BASE=&base DATA=&setlist FORCE;

MEMNAME LIKE UPCASE("&setlist%"); QUIT ;

%LET i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var&merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var&merge_var;; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPEND BASE=&base DATA=&setlist FORCE;

Merge the 3 Summary Sets by key_var Merge the 3 Summary Sets by key_var

MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;;

MEMNAME LIKE UPCASEMEMNAME LIKE UPCASE("&setlist%");("&setlist%"); QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;;

SUMMARYSET( ) macro module

QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

QUITQUIT ;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

SUMMARYSET( ) macro module

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

SUMMARYSET( ) macro module

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;;

%%LETLET i= 1; i= 1;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;;

SUMMARYSET( ) macro module

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;;

SUMMARYSET( ) macro module

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUIT;

%%DODO % %UNTILUNTIL ( (NOTNOT % %LENGTHLENGTH(%(%SCANSCAN(&dsets,&i, %(&dsets,&i, %STRSTR( ))));( )))); PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUIT;

SUMMARYSET( ) macro module

PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

PROC SORT DATAPROC SORT DATA=%SCANSCAN(&dsets,&i, %STRSTR( )); BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

SUMMARYSET( ) macro module

BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND summaryset;

BYBY &merge_var; RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND summaryset;

SUMMARYSET( ) macro module

RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND summaryset;

RUNRUN; %%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND summaryset;

SUMMARYSET( ) macro module

%%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND summaryset;

%%LETLET i = % i = %EVALEVAL(&i+1);(&i+1); %%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND summaryset;

SUMMARYSET( ) macro module

%%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND summaryset;

%%ENDEND;;

DATA DATA summary_;summary_; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND summaryset;

SUMMARYSET( ) macro module

DATA DATA &setlist;&setlist; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND summaryset;

DATA DATA &setlist;&setlist; MERGEMERGE &dsets; &dsets; BYBY &merge_var; &merge_var; class_vars="&class_vars";class_vars="&class_vars"; continuous_vars="&continuous_vars";continuous_vars="&continuous_vars"; RUNRUN;;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND summaryset;

SUMMARYSET( ) macro module

DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA==&setlist&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND summaryset;

DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN;

PROC APPENDPROC APPEND BASEBASE=&base=&base DATADATA==&setlist&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND summaryset;

Append the SUMMARY_ Data SetAppend the SUMMARY_ Data Set

DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN;

PROC APPENDPROC APPEND BASEBASE==&base&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND summaryset;

DATA summary_; MERGE &dsets; BY &merge_var; class_vars="&class_vars"; continuous_vars="&continuous_vars"; RUN;

PROC APPENDPROC APPEND BASEBASE==&base&base DATADATA=&setlist=&setlist FORCEFORCE;; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets / &setlist: &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND summaryset;

To the GLM_SUMMARY Data SetTo the GLM_SUMMARY Data Set

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 DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets&setlist: &delsets / / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND 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 DATASETSPROC DATASETS;; DELETEDELETE &setlist: &delsets&setlist: &delsets / / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND summaryset;

Remove all Temporary Data SetsRemove all Temporary Data Sets

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 DATASETSPROC DATASETS;; DELETEDELETE &setlist: &setlist: &delsets / &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND 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 DATASETSPROC DATASETS;; DELETEDELETE &setlist: &setlist: &delsets / &delsets / MEMTYPEMEMTYPE = = DATADATA;; QUITQUIT;

%MENDMEND summaryset;

New to SAS Version 9.2New to SAS Version 9.2

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 Variable10 n Num 8 PROC MEANS: N of Independent Variable11 crude_estimate Num 8 PVALUE6.4 Crude PROC GLM: Parameter Estimate12 adjusted_estimate Num 8 PVALUE6.4 Adjusted PROC GLM: Parameter Estimate13 crude_stderr Num 8 ODDSR8.3 Crude PROC GLM: Standard Error of Estimate14 adjusted_stderr Num 8 ODDSR8.3 Adjusted PROC GLM: Standard Error of Estimate

PopulatePopulate thethe GLM_SUMMARYGLM_SUMMARY DataData SetSet

These four macros perform These four macros perform primary main tasks for creating a primary main tasks for creating a

summary data set.summary data set.

Three secondary main tasks which Three secondary main tasks which support these primary tasks.support these primary tasks.

• Validate the user information passed into Validate the user information passed into the supervisory macrothe supervisory macro

Three secondary main tasks Three secondary main tasks which support these primary which support these primary

main tasks.main tasks.

• Validate the user information passed into Validate the user information passed into the supervisory macrothe supervisory macro

• Identify covariates as either Class or Identify covariates as either Class or Continuous.Continuous.

Three secondary main tasks Three secondary main tasks which support these primary which support these primary

main tasks.main tasks.

• Validate the user information passed into Validate the user information passed into the supervisory macrothe supervisory macro

• Identify covariates as either Class or Identify covariates as either Class or Continuous.Continuous.

• Create an analysis data set.Create an analysis data set.

Three secondary main tasks Three secondary main tasks which support these primary which support these primary

main tasks.main tasks.

VALIDATE( ) Macro ModuleVALIDATE( ) Macro Module

Perform checks on the user supplied parametersPerform checks on the user supplied parameters1. 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.

VALIDATE( ) Macro ModuleVALIDATE( ) Macro Module

Perform checks on the user supplied parametersPerform checks on the user supplied parameters1.1. Is the input dataset specified.Is the input dataset specified.

2.2. Does the input dataset exist.Does the input dataset exist.

3.3. Is the response variable specified.Is the response variable specified.

4.4. Does response variable exist within user supplied dataset.Does response variable exist within user supplied dataset.

5.5. Is the response variable numeric.Is the response variable numeric.

6.6. Is the independent variable of interest specified.Is the independent variable of interest specified.

7.7. Does independent variable exist within user supplied dataset.Does independent variable exist within user supplied dataset.

8.8. Is the independent variable numeric.Is the independent variable numeric.

9.9. Do all base co-variables exist within user supplied dataset. Do all base co-variables exist within user supplied dataset.

10.10. Are each of the base model co-variables numeric.Are each of the base model co-variables numeric.

11.11. Is the final output dataset specified.Is the final output dataset specified.

VALIDATE( ) Macro ModuleVALIDATE( ) Macro Module

%%MACROMACRO validate(__dset = , validate(__dset = , __var1 = ,__var1 = , __var2 = ,__var2 = , __ref = ,__ref = , __vars = ,__vars = , __out = ); __out = );

%GLOBAL _echeck ;

%MENDMEND validate;

%%MACROMACRO validate(__dset = , validate(__dset = , __var1 = ,__var1 = , __var2 = ,__var2 = , __ref = ,__ref = , __vars = ,__vars = , __out = ); __out = );

%GLOBAL _echeck ;

%MENDMEND validate;

VALIDATE( ) Macro ModuleVALIDATE( ) Macro Module

%%MACROMACRO validate(__dset = , validate(__dset = , __var1 = ,__var1 = , __var2 = ,__var2 = , __ref = ,__ref = , __vars = ,__vars = , __out = ); __out = ); %LOCAL _echeck; %GLOBAL _echeck ;

%LETLET echeck=1;

%MENDMEND validate;

%%MACROMACRO validate(__dset = , validate(__dset = , __var1 = ,__var1 = , __var2 = ,__var2 = , __ref = ,__ref = , __vars = ,__vars = , __out = ); __out = ); %LOCAL _echeck; %GLOBAL _echeck ;

%LETLET echeck=1;

%MENDMEND validate;

VALIDATE( ) Macro ModuleVALIDATE( ) Macro Module

%validate(data = &dataset ,%validate(data = &dataset , var1 = &response ,var1 = &response , var2 = &independent ,var2 = &independent , covariates = &covariates,covariates = &covariates, outfile = &outfile )outfile = &outfile )

%%IFIF &echeck = 1 &echeck = 1 %THEN %THEN %RETURN%RETURN;;

%validate(data = &dataset ,%validate(data = &dataset , var1 = &response ,var1 = &response , var2 = &independent ,var2 = &independent , covariates = &covariates,covariates = &covariates, outfile = &outfile )outfile = &outfile )

%%IFIF &echeck = 1 &echeck = 1 %THEN %THEN %RETURN%RETURN;;

SPLIT( ) Macro ModuleSPLIT( ) Macro Module

Co-variables to appear in the adjusted PROC LOGISTICCo-variables to appear in the adjusted PROC LOGISTIC

SPLIT( ) Macro ModuleSPLIT( ) Macro Module

No SAS code is generated.No SAS code is generated.

SPLIT( ) Macro ModuleSPLIT( ) Macro Module

No SAS code is generated.No SAS code is generated.

Design a User Define Macro Function.Design a User Define Macro Function.

SPLIT( ) Macro ModuleSPLIT( ) Macro Module

No SAS code is generated.No SAS code is generated.

Design a User Define Macro Function.Design a User Define Macro Function.

Returns a text string.Returns a text string.

SPLIT( ) Macro FunctionSPLIT( ) Macro Function

Co-variables to appear in the adjusted PROC GLMCo-variables to appear in the adjusted PROC GLM

&covariates = @height @age race gender&covariates = @height @age race gender

SPLIT( ) Macro FunctionSPLIT( ) Macro Function

Co-variables to appear in the adjusted PROC GLMCo-variables to appear in the adjusted PROC GLM

&covariates = @height @age &covariates = @height @age race genderrace gender

• Categorical variables: appear in CLASS & MODEL statementCategorical variables: appear in CLASS & MODEL statement

SPLIT( ) Macro FunctionSPLIT( ) Macro Function

Co-variables to appear in the adjusted PROC GLMCo-variables to appear in the adjusted PROC GLM

&covariates = @&covariates = @heightheight @ @ageage race gender race gender

• Categorical variables: appear in CLASS & MODEL statementCategorical variables: appear in CLASS & MODEL statement

• Continuous variables: appear only in the MODEL statement Continuous variables: appear only in the MODEL statement

SPLIT( ) Macro FunctionSPLIT( ) Macro Function

&covariates = @height @age race gender&covariates = @height @age race gender

SPLIT( ) Macro FunctionSPLIT( ) Macro Function

&covariates = @height @age race gender &covariates = @height @age race gender

%LET continuous_vars = %split(vars = &covariates, control = @);%LET continuous_vars = %split(vars = &covariates, control = @);

%LET class_vars = %split(vars = &covariates );%LET class_vars = %split(vars = &covariates );

SPLIT( ) Macro FunctionSPLIT( ) Macro Function

&covariates = @height @age race gender &covariates = @height @age race gender

%LET continuous_vars = height age;%LET continuous_vars = height age;

%LET class_vars = race gender;%LET class_vars = race gender;

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

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

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

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

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

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

ANALYSISSET( ) Macro ModuleANALYSISSET( ) Macro Module

Create an analysis dataset that can be

uniformly processed by all three procedures

ANALYSISSET( ) Macro ModuleANALYSISSET( ) Macro Module

%MACRO makeset(__dset = , __var1 = , __var2 = , __variables = ) ;

DATADATA analysis_setanalysis_set ; SETSET &data (KEEPKEEP = &var1 &var2 &variables); IFIF NMISSNMISS(OFOF _numeric__numeric_)) = 0 ; RUNRUN;

%MEND makeset;

%MACRO makeset(__dset = , __var1 = , __var2 = , __variables = ) ;

DATADATA analysis_setanalysis_set ; SETSET &data (KEEPKEEP = &var1 &var2 &variables); IFIF NMISSNMISS(OFOF _numeric__numeric_)) = 0 ; RUNRUN;

%MEND makeset;

ANALYSISSET( ) Macro ModuleANALYSISSET( ) Macro Module

%MACRO makeset(__dset = , __var1 = , __var2 = , __variables = ) ;

DATADATA analysis_setanalysis_set ; SETSET &data (KEEPKEEP = &var1 &var2 &variables&var1 &var2 &variables); IFIF NMISSNMISS(OFOF _numeric__numeric_)) = 0 ; RUNRUN;

%MEND makeset;

%MACRO makeset(__dset = , __var1 = , __var2 = , __variables = ) ;

DATADATA analysis_setanalysis_set ; SETSET &data (KEEPKEEP = &var1 &var2 &variables&var1 &var2 &variables); IFIF NMISSNMISS(OFOF _numeric__numeric_)) = 0 ; RUNRUN;

%MEND makeset;

ANALYSISSET( ) Macro ModuleANALYSISSET( ) Macro Module

%MACRO makeset(__dset = , __var1 = , __var2 = , __variables = ) ;

DATADATA analysis_setanalysis_set ; SETSET &data (KEEPKEEP = &var1 &var2 &variables&var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 ;IF NMISS(OF _numeric_) = 0 ; RUNRUN;

%MEND makeset;

%MACRO makeset(__dset = , __var1 = , __var2 = , __variables = ) ;

DATADATA analysis_setanalysis_set ; SETSET &data (KEEPKEEP = &var1 &var2 &variables&var1 &var2 &variables); IF NMISS(OF _numeric_) = 0 ;IF NMISS(OF _numeric_) = 0 ; RUNRUN;

%MEND makeset;

ANALYSISSET( ) Macro ModuleANALYSISSET( ) Macro Module

%MACROMACRO analysisset(data = , var1 = , var2 = , variables = ) ;

DATADATA analysis_setanalysis_set ; SETSET &data (KEEPKEEP = &var1 &var2 &variables&var1 &var2 &variables); IF NMISSNMISS((OFOF _numeric__numeric_) = 0 ;) = 0 ; RUNRUN;

%MENDMEND analysisset;

%MACROMACRO analysisset(data = , var1 = , var2 = , variables = ) ;

DATADATA analysis_setanalysis_set ; SETSET &data (KEEPKEEP = &var1 &var2 &variables&var1 &var2 &variables); IF NMISSNMISS((OFOF _numeric__numeric_) = 0 ;) = 0 ; RUNRUN;

%MENDMEND analysisset;

ANALYSISSET( ) Macro ModuleANALYSISSET( ) 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;

ANALYSISSET( ) Macro ModuleANALYSISSET( ) Macro Module

The CONTENTS Procedure(abbreviated)

Data Set Name ANALYSIS_SET Observations 5873Member 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

We Have Discussed the Coding We Have Discussed the Coding

Of Seven Macro ModulesOf 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=);%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 $40key_label response_label $40 class_vars continuous_vars $200class_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 mean = "PROC MEANS: Mean of Independent Variable"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.4FORMAT 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;%MEND initbase;

%MACRO initbase(base=);%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 $40key_label response_label $40 class_vars continuous_vars $200class_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 mean = "PROC MEANS: Mean of Independent Variable"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.4FORMAT 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;%MEND initbase;

%MACRO analysisset(data = ,%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 = ,%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 = ,%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_varRENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_labelLABEL_&var1 = response_label VNAME_&var2 = key_varVNAME_&var2 = key_var LABEL_&var2 = key_labelLABEL_&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 = ,%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_varRENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_labelLABEL_&var1 = response_label VNAME_&var2 = key_varVNAME_&var2 = key_var LABEL_&var2 = key_labelLABEL_&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=);%MACRO split(vars=, control=);   %LOCAL  count varlist chars;   %LOCAL  count varlist chars;   %IF &vars NE %THEN %DO;   %IF &vars NE %THEN %DO;       %IF &control NE %THEN %DO;       %IF &control NE %THEN %DO;        %LET count=1 ;        %LET count=1 ;         %DO %UNTIL (%QSCAN(&vars,&count)= ) ;         %DO %UNTIL (%QSCAN(&vars,&count)= ) ;         %LET var = %QSCAN(&vars,&count);         %LET var = %QSCAN(&vars,&count);         %IF %SUBSTR(&var,1,1)=&control %THEN          %IF %SUBSTR(&var,1,1)=&control %THEN     %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control))  ;%SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control))  ;   %LET count = %EVAL(&count+1);   %LET count = %EVAL(&count+1);      %END ;       %END ;    %END;   %END;   %ELSE %DO;   %ELSE %DO;     %LET count=1 ;     %LET count=1 ;    %DO %UNTIL (%QSCAN(&vars,&count)= ) ;    %DO %UNTIL (%QSCAN(&vars,&count)= ) ;        %LET var = %QSCAN(&vars,&count);        %LET var = %QSCAN(&vars,&count);          %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_,          %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN            %QSCAN(&vars,&count) ;           %QSCAN(&vars,&count) ;     %LET count = %EVAL(&count+1);     %LET count = %EVAL(&count+1);     %END ;      %END ;      %END;     %END; %END; %END; %MEND split; %MEND split;

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

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__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;

VALIDATE( )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=);%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 $40key_label response_label $40 class_vars continuous_vars $200class_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 mean = "PROC MEANS: Mean of Independent Variable"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.4FORMAT 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;%MEND initbase;

%MACRO initbase(base=);%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 $40key_label response_label $40 class_vars continuous_vars $200class_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 mean = "PROC MEANS: Mean of Independent Variable"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.4FORMAT 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;%MEND initbase;

%MACRO analysisset(data = ,%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 = ,%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 = ,%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_varRENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_labelLABEL_&var1 = response_label VNAME_&var2 = key_varVNAME_&var2 = key_var LABEL_&var2 = key_labelLABEL_&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 = ,%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_varRENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_labelLABEL_&var1 = response_label VNAME_&var2 = key_varVNAME_&var2 = key_var LABEL_&var2 = key_labelLABEL_&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=);%MACRO split(vars=, control=);   %LOCAL  count varlist chars;   %LOCAL  count varlist chars;   %IF &vars NE %THEN %DO;   %IF &vars NE %THEN %DO;       %IF &control NE %THEN %DO;       %IF &control NE %THEN %DO;        %LET count=1 ;        %LET count=1 ;         %DO %UNTIL (%QSCAN(&vars,&count)= ) ;         %DO %UNTIL (%QSCAN(&vars,&count)= ) ;         %LET var = %QSCAN(&vars,&count);         %LET var = %QSCAN(&vars,&count);         %IF %SUBSTR(&var,1,1)=&control %THEN          %IF %SUBSTR(&var,1,1)=&control %THEN     %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control))  ;%SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control))  ;   %LET count = %EVAL(&count+1);   %LET count = %EVAL(&count+1);      %END ;       %END ;    %END;   %END;   %ELSE %DO;   %ELSE %DO;     %LET count=1 ;     %LET count=1 ;    %DO %UNTIL (%QSCAN(&vars,&count)= ) ;    %DO %UNTIL (%QSCAN(&vars,&count)= ) ;        %LET var = %QSCAN(&vars,&count);        %LET var = %QSCAN(&vars,&count);          %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_,          %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN            %QSCAN(&vars,&count) ;           %QSCAN(&vars,&count) ;     %LET count = %EVAL(&count+1);     %LET count = %EVAL(&count+1);     %END ;      %END ;      %END;     %END; %END; %END; %MEND split; %MEND split;

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

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__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;

INITBASE( )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=);%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 $40key_label response_label $40 class_vars continuous_vars $200class_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 mean = "PROC MEANS: Mean of Independent Variable"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.4FORMAT 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;%MEND initbase;

%MACRO initbase(base=);%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 $40key_label response_label $40 class_vars continuous_vars $200class_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 mean = "PROC MEANS: Mean of Independent Variable"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.4FORMAT 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;%MEND initbase;

%MACRO analysisset(data = ,%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 = ,%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 = ,%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_varRENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_labelLABEL_&var1 = response_label VNAME_&var2 = key_varVNAME_&var2 = key_var LABEL_&var2 = key_labelLABEL_&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 = ,%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_varRENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_labelLABEL_&var1 = response_label VNAME_&var2 = key_varVNAME_&var2 = key_var LABEL_&var2 = key_labelLABEL_&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=);%MACRO split(vars=, control=);   %LOCAL  count varlist chars;   %LOCAL  count varlist chars;   %IF &vars NE %THEN %DO;   %IF &vars NE %THEN %DO;       %IF &control NE %THEN %DO;       %IF &control NE %THEN %DO;        %LET count=1 ;        %LET count=1 ;         %DO %UNTIL (%QSCAN(&vars,&count)= ) ;         %DO %UNTIL (%QSCAN(&vars,&count)= ) ;         %LET var = %QSCAN(&vars,&count);         %LET var = %QSCAN(&vars,&count);         %IF %SUBSTR(&var,1,1)=&control %THEN          %IF %SUBSTR(&var,1,1)=&control %THEN     %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control))  ;%SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control))  ;   %LET count = %EVAL(&count+1);   %LET count = %EVAL(&count+1);      %END ;       %END ;    %END;   %END;   %ELSE %DO;   %ELSE %DO;     %LET count=1 ;     %LET count=1 ;    %DO %UNTIL (%QSCAN(&vars,&count)= ) ;    %DO %UNTIL (%QSCAN(&vars,&count)= ) ;        %LET var = %QSCAN(&vars,&count);        %LET var = %QSCAN(&vars,&count);          %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_,          %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN            %QSCAN(&vars,&count) ;           %QSCAN(&vars,&count) ;     %LET count = %EVAL(&count+1);     %LET count = %EVAL(&count+1);     %END ;      %END ;      %END;     %END; %END; %END; %MEND split; %MEND split;

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

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__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;

SPLIT( )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=);%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 $40key_label response_label $40 class_vars continuous_vars $200class_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 mean = "PROC MEANS: Mean of Independent Variable"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.4FORMAT 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;%MEND initbase;

%MACRO initbase(base=);%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 $40key_label response_label $40 class_vars continuous_vars $200class_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 mean = "PROC MEANS: Mean of Independent Variable"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.4FORMAT 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;%MEND initbase;

%MACRO analysisset(data = ,%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 = ,%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 = ,%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_varRENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_labelLABEL_&var1 = response_label VNAME_&var2 = key_varVNAME_&var2 = key_var LABEL_&var2 = key_labelLABEL_&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 = ,%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_varRENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_labelLABEL_&var1 = response_label VNAME_&var2 = key_varVNAME_&var2 = key_var LABEL_&var2 = key_labelLABEL_&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=);%MACRO split(vars=, control=);   %LOCAL  count varlist chars;   %LOCAL  count varlist chars;   %IF &vars NE %THEN %DO;   %IF &vars NE %THEN %DO;       %IF &control NE %THEN %DO;       %IF &control NE %THEN %DO;        %LET count=1 ;        %LET count=1 ;         %DO %UNTIL (%QSCAN(&vars,&count)= ) ;         %DO %UNTIL (%QSCAN(&vars,&count)= ) ;         %LET var = %QSCAN(&vars,&count);         %LET var = %QSCAN(&vars,&count);         %IF %SUBSTR(&var,1,1)=&control %THEN          %IF %SUBSTR(&var,1,1)=&control %THEN     %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control))  ;%SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control))  ;   %LET count = %EVAL(&count+1);   %LET count = %EVAL(&count+1);      %END ;       %END ;    %END;   %END;   %ELSE %DO;   %ELSE %DO;     %LET count=1 ;     %LET count=1 ;    %DO %UNTIL (%QSCAN(&vars,&count)= ) ;    %DO %UNTIL (%QSCAN(&vars,&count)= ) ;        %LET var = %QSCAN(&vars,&count);        %LET var = %QSCAN(&vars,&count);          %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_,          %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN            %QSCAN(&vars,&count) ;           %QSCAN(&vars,&count) ;     %LET count = %EVAL(&count+1);     %LET count = %EVAL(&count+1);     %END ;      %END ;      %END;     %END; %END; %END; %MEND split; %MEND split;

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

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__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;

ANALYSISSET( )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=);%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 $40key_label response_label $40 class_vars continuous_vars $200class_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 mean = "PROC MEANS: Mean of Independent Variable"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.4FORMAT 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;%MEND initbase;

%MACRO initbase(base=);%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 $40key_label response_label $40 class_vars continuous_vars $200class_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 mean = "PROC MEANS: Mean of Independent Variable"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.4FORMAT 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;%MEND initbase;

%MACRO analysisset(data = ,%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 = ,%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 = ,%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_varRENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_labelLABEL_&var1 = response_label VNAME_&var2 = key_varVNAME_&var2 = key_var LABEL_&var2 = key_labelLABEL_&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 = ,%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_varRENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_labelLABEL_&var1 = response_label VNAME_&var2 = key_varVNAME_&var2 = key_var LABEL_&var2 = key_labelLABEL_&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=);%MACRO split(vars=, control=);   %LOCAL  count varlist chars;   %LOCAL  count varlist chars;   %IF &vars NE %THEN %DO;   %IF &vars NE %THEN %DO;       %IF &control NE %THEN %DO;       %IF &control NE %THEN %DO;        %LET count=1 ;        %LET count=1 ;         %DO %UNTIL (%QSCAN(&vars,&count)= ) ;         %DO %UNTIL (%QSCAN(&vars,&count)= ) ;         %LET var = %QSCAN(&vars,&count);         %LET var = %QSCAN(&vars,&count);         %IF %SUBSTR(&var,1,1)=&control %THEN          %IF %SUBSTR(&var,1,1)=&control %THEN     %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control))  ;%SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control))  ;   %LET count = %EVAL(&count+1);   %LET count = %EVAL(&count+1);      %END ;       %END ;    %END;   %END;   %ELSE %DO;   %ELSE %DO;     %LET count=1 ;     %LET count=1 ;    %DO %UNTIL (%QSCAN(&vars,&count)= ) ;    %DO %UNTIL (%QSCAN(&vars,&count)= ) ;        %LET var = %QSCAN(&vars,&count);        %LET var = %QSCAN(&vars,&count);          %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_,          %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN            %QSCAN(&vars,&count) ;           %QSCAN(&vars,&count) ;     %LET count = %EVAL(&count+1);     %LET count = %EVAL(&count+1);     %END ;      %END ;      %END;     %END; %END; %END; %MEND split; %MEND split;

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

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__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;

PROCMEANS( )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=);%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 $40key_label response_label $40 class_vars continuous_vars $200class_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 mean = "PROC MEANS: Mean of Independent Variable"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.4FORMAT 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;%MEND initbase;

%MACRO initbase(base=);%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 $40key_label response_label $40 class_vars continuous_vars $200class_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 mean = "PROC MEANS: Mean of Independent Variable"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.4FORMAT 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;%MEND initbase;

%MACRO analysisset(data = ,%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 = ,%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 = ,%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_varRENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_labelLABEL_&var1 = response_label VNAME_&var2 = key_varVNAME_&var2 = key_var LABEL_&var2 = key_labelLABEL_&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 = ,%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_varRENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_labelLABEL_&var1 = response_label VNAME_&var2 = key_varVNAME_&var2 = key_var LABEL_&var2 = key_labelLABEL_&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=);%MACRO split(vars=, control=);   %LOCAL  count varlist chars;   %LOCAL  count varlist chars;   %IF &vars NE %THEN %DO;   %IF &vars NE %THEN %DO;       %IF &control NE %THEN %DO;       %IF &control NE %THEN %DO;        %LET count=1 ;        %LET count=1 ;         %DO %UNTIL (%QSCAN(&vars,&count)= ) ;         %DO %UNTIL (%QSCAN(&vars,&count)= ) ;         %LET var = %QSCAN(&vars,&count);         %LET var = %QSCAN(&vars,&count);         %IF %SUBSTR(&var,1,1)=&control %THEN          %IF %SUBSTR(&var,1,1)=&control %THEN     %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control))  ;%SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control))  ;   %LET count = %EVAL(&count+1);   %LET count = %EVAL(&count+1);      %END ;       %END ;    %END;   %END;   %ELSE %DO;   %ELSE %DO;     %LET count=1 ;     %LET count=1 ;    %DO %UNTIL (%QSCAN(&vars,&count)= ) ;    %DO %UNTIL (%QSCAN(&vars,&count)= ) ;        %LET var = %QSCAN(&vars,&count);        %LET var = %QSCAN(&vars,&count);          %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_,          %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN            %QSCAN(&vars,&count) ;           %QSCAN(&vars,&count) ;     %LET count = %EVAL(&count+1);     %LET count = %EVAL(&count+1);     %END ;      %END ;      %END;     %END; %END; %END; %MEND split; %MEND split;

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

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__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;

PROCGLM( )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=);%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 $40key_label response_label $40 class_vars continuous_vars $200class_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 mean = "PROC MEANS: Mean of Independent Variable"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.4FORMAT 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;%MEND initbase;

%MACRO initbase(base=);%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 $40key_label response_label $40 class_vars continuous_vars $200class_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 mean = "PROC MEANS: Mean of Independent Variable"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.4FORMAT 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;%MEND initbase;

%MACRO analysisset(data = ,%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 = ,%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 = ,%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_varRENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_labelLABEL_&var1 = response_label VNAME_&var2 = key_varVNAME_&var2 = key_var LABEL_&var2 = key_labelLABEL_&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 = ,%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_varRENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_labelLABEL_&var1 = response_label VNAME_&var2 = key_varVNAME_&var2 = key_var LABEL_&var2 = key_labelLABEL_&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=);%MACRO split(vars=, control=);   %LOCAL  count varlist chars;   %LOCAL  count varlist chars;   %IF &vars NE %THEN %DO;   %IF &vars NE %THEN %DO;       %IF &control NE %THEN %DO;       %IF &control NE %THEN %DO;        %LET count=1 ;        %LET count=1 ;         %DO %UNTIL (%QSCAN(&vars,&count)= ) ;         %DO %UNTIL (%QSCAN(&vars,&count)= ) ;         %LET var = %QSCAN(&vars,&count);         %LET var = %QSCAN(&vars,&count);         %IF %SUBSTR(&var,1,1)=&control %THEN          %IF %SUBSTR(&var,1,1)=&control %THEN     %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control))  ;%SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control))  ;   %LET count = %EVAL(&count+1);   %LET count = %EVAL(&count+1);      %END ;       %END ;    %END;   %END;   %ELSE %DO;   %ELSE %DO;     %LET count=1 ;     %LET count=1 ;    %DO %UNTIL (%QSCAN(&vars,&count)= ) ;    %DO %UNTIL (%QSCAN(&vars,&count)= ) ;        %LET var = %QSCAN(&vars,&count);        %LET var = %QSCAN(&vars,&count);          %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_,          %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN            %QSCAN(&vars,&count) ;           %QSCAN(&vars,&count) ;     %LET count = %EVAL(&count+1);     %LET count = %EVAL(&count+1);     %END ;      %END ;      %END;     %END; %END; %END; %MEND split; %MEND split;

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

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__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;

SUMMARYSET( )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=);%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 $40key_label response_label $40 class_vars continuous_vars $200class_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 mean = "PROC MEANS: Mean of Independent Variable"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.4FORMAT 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;%MEND initbase;

%MACRO initbase(base=);%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 $40key_label response_label $40 class_vars continuous_vars $200class_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 mean = "PROC MEANS: Mean of Independent Variable"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.4FORMAT 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;%MEND initbase;

%MACRO analysisset(data = ,%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 = ,%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 = ,%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_varRENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_labelLABEL_&var1 = response_label VNAME_&var2 = key_varVNAME_&var2 = key_var LABEL_&var2 = key_labelLABEL_&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 = ,%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_varRENAME = (VNAME_&var1 = response_var LABEL_&var1 = response_labelLABEL_&var1 = response_label VNAME_&var2 = key_varVNAME_&var2 = key_var LABEL_&var2 = key_labelLABEL_&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=);%MACRO split(vars=, control=);   %LOCAL  count varlist chars;   %LOCAL  count varlist chars;   %IF &vars NE %THEN %DO;   %IF &vars NE %THEN %DO;       %IF &control NE %THEN %DO;       %IF &control NE %THEN %DO;        %LET count=1 ;        %LET count=1 ;         %DO %UNTIL (%QSCAN(&vars,&count)= ) ;         %DO %UNTIL (%QSCAN(&vars,&count)= ) ;         %LET var = %QSCAN(&vars,&count);         %LET var = %QSCAN(&vars,&count);         %IF %SUBSTR(&var,1,1)=&control %THEN          %IF %SUBSTR(&var,1,1)=&control %THEN     %SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control))  ;%SYSFUNC(COMPRESS(%QSCAN(&vars,&count),&control))  ;   %LET count = %EVAL(&count+1);   %LET count = %EVAL(&count+1);      %END ;       %END ;    %END;   %END;   %ELSE %DO;   %ELSE %DO;     %LET count=1 ;     %LET count=1 ;    %DO %UNTIL (%QSCAN(&vars,&count)= ) ;    %DO %UNTIL (%QSCAN(&vars,&count)= ) ;        %LET var = %QSCAN(&vars,&count);        %LET var = %QSCAN(&vars,&count);          %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_,          %IF %INDEX(ABCDEFGHIJKLMNOPQRSTUVWXYZ_, %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN %UPCASE(%SUBSTR(&var,1,1))) NE 0 %THEN            %QSCAN(&vars,&count) ;           %QSCAN(&vars,&count) ;     %LET count = %EVAL(&count+1);     %LET count = %EVAL(&count+1);     %END ;      %END ;      %END;     %END; %END; %END; %MEND split; %MEND split;

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

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__dset Execution terminating.; %end; %end; %* check that response variable is numeric *;%* check that response variable is numeric *;

%MACRO validate(__dset = ,%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 %put Summary-> THE __DSET PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE INPUT DATASET [ &__dset ] DOES NOT EXIST SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE __VAR1 PARAMETER WAS NOT SPECIFIED SUMMARY WILL STOP EXECUTING;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 %put Summary-> THE VARIABLE &__var1 NOT FOUND IN DATASET &__dset Execution terminating.;&__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;

%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);

%%validatevalidate(dset = &dataset,(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 %%IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbaseinitbase(base=&outfile);(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=@);

%%analysissetanalysisset(data = &dataset ,(data = &dataset , var1 = &response ,var1 = &response , var2 = &independent ,var2 = &independent , variables = &class_vars &continuous_vars )variables = &class_vars &continuous_vars )

%%procmeansprocmeans(data = analysis_set,(data = analysis_set, var1 = &response ,var1 = &response ,

var2 = &independent )var2 = &independent )

%%procglmprocglm (test = Crude, (test = Crude, data = analysis_set,data = analysis_set, response = &response,response = &response, independent = &independent )independent = &independent )

%%procglmprocglm (test = Adjusted, (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 )

%%summarysetsummaryset(merge_var = key_var,(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 %%IF %UPCASE(&report) = YES %THEN %PrintReportPrintReport(data=&outfile);(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);

%%validatevalidate(dset = &dataset,(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 %%IF %SYSFUNC(EXIST(&outfile)) NE 1 %THEN %initbaseinitbase(base=&outfile);(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=@);

%%analysissetanalysisset(data = &dataset ,(data = &dataset , var1 = &response ,var1 = &response , var2 = &independent ,var2 = &independent , variables = &class_vars &continuous_vars )variables = &class_vars &continuous_vars )

%%procmeansprocmeans(data = analysis_set,(data = analysis_set, var1 = &response ,var1 = &response ,

var2 = &independent )var2 = &independent )

%%procglmprocglm (test = Crude, (test = Crude, data = analysis_set,data = analysis_set, response = &response,response = &response, independent = &independent )independent = &independent )

%%procglmprocglm (test = Adjusted, (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 )

%%summarysetsummaryset(merge_var = key_var,(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 %%IF %UPCASE(&report) = YES %THEN %PrintReportPrintReport(data=&outfile);(data=&outfile);

%MEND supervisor;%MEND supervisor;

SUPERVISOR( )SUPERVISOR( )

SUPERVISOR( )SUPERVISOR( )

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

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

SUPERVISOR( )SUPERVISOR( )

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

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

SUPERVISOR( )SUPERVISOR( )

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

%LOCALLOCAL echeck;

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

%LOCALLOCAL echeck;

SUPERVISOR( )SUPERVISOR( )

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

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

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

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

SUPERVISOR( )SUPERVISOR( )

response = , independent = , covariates = , outfile = , report = );

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

response = , independent = , covariates = , outfile = , report = );

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

SUPERVISOR( )SUPERVISOR( )

independent = , covariates = , outfile = , report = );

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

independent = , covariates = , outfile = , report = );

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

SUPERVISOR( )SUPERVISOR( )

covariates = , outfile = , report = );

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

covariates = , outfile = , report = );

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

SUPERVISOR( )SUPERVISOR( )

outfile = , report = );

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

outfile = , report = );

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

SUPERVISOR( )SUPERVISOR( )

report = );

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

report = );

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

SUPERVISOR( )SUPERVISOR( )

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

SUPERVISOR( )SUPERVISOR( )

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

SUPERVISOR( )SUPERVISOR( )

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile )

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile )

SUPERVISOR( )SUPERVISOR( )

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset&dataset, var1 = &response&response, var2 = &independent&independent , basevs = &covariates&covariates, out = &outfile&outfile )

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset&dataset, var1 = &response&response, var2 = &independent&independent , basevs = &covariates&covariates, out = &outfile&outfile )

SUPERVISOR( )SUPERVISOR( )

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

SUPERVISOR( )SUPERVISOR( )

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

SUPERVISOR( )SUPERVISOR( )

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

SUPERVISOR( )SUPERVISOR( )

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

SUPERVISOR( )SUPERVISOR( )

%LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

SUPERVISOR( )SUPERVISOR( )

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

SUPERVISOR( )SUPERVISOR( )

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

SUPERVISOR( )SUPERVISOR( )

var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

SUPERVISOR( )SUPERVISOR( )

var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

SUPERVISOR( )SUPERVISOR( )

basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

SUPERVISOR( )SUPERVISOR( )

out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

SUPERVISOR( )SUPERVISOR( )

%IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

SUPERVISOR( )SUPERVISOR( )

%IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

SUPERVISOR( )SUPERVISOR( )

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

SUPERVISOR( )SUPERVISOR( )

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%LET class_vars =%split(vars=&covariates,control=); %LET continuous_vars=%split(vars=&covariates,control=@);

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%LET class_vars =%split(vars=&covariates,control=); %LET continuous_vars=%split(vars=&covariates,control=@);

SUPERVISOR( )SUPERVISOR( )

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%LETLET class_vars =%split(vars=&covariates,control=); %LET continuous_vars=%split(vars=&covariates,control=@);

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%LETLET class_vars =%split(vars=&covariates,control=); %LET continuous_vars=%split(vars=&covariates,control=@);

SUPERVISOR( )SUPERVISOR( )

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%LETLET class_vars =%split(vars=&covariates,control=); %LETLET continuous_vars=%split(vars=&covariates,control=@);

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%LETLET class_vars =%split(vars=&covariates,control=); %LETLET continuous_vars=%split(vars=&covariates,control=@);

SUPERVISOR( )SUPERVISOR( )

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%LETLET class_vars =%split(vars=&covariates,control=); %LETLET continuous_vars=%split(vars=&covariates,control=@);

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

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%LETLET class_vars =%split(vars=&covariates,control=); %LETLET continuous_vars=%split(vars=&covariates,control=@);

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

SUPERVISOR( )SUPERVISOR( )

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%LETLET class_vars =%split(vars=&covariates,control=); %LETLET 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 )

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%LETLET class_vars =%split(vars=&covariates,control=); %LETLET 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 )

SUPERVISOR( )SUPERVISOR( )

%initbase(base=&outfile);

%LETLET class_vars =%split(vars=&covariates,control=); %LETLET 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);

%LETLET class_vars =%split(vars=&covariates,control=); %LETLET 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 )

SUPERVISOR( )SUPERVISOR( )

%LETLET class_vars =%split(vars=&covariates,control=); %LETLET 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 )

%LETLET class_vars =%split(vars=&covariates,control=); %LETLET 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 )

SUPERVISOR( )SUPERVISOR( )

%LETLET class_vars =%split(vars=&covariates,control=); %LETLET 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 )

%LETLET class_vars =%split(vars=&covariates,control=); %LETLET 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 )

SUPERVISOR( )SUPERVISOR( )

%LETLET 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 )

%LETLET 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 )

SUPERVISOR( )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 )

SUPERVISOR( )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 )

SUPERVISOR( )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 )

SUPERVISOR( )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 )

SUPERVISOR( )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 )

SUPERVISOR( )SUPERVISOR( )

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

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

SUPERVISOR( )SUPERVISOR( )

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

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

SUPERVISOR( )SUPERVISOR( )

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

%procglm (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

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

%procglm (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

SUPERVISOR( )SUPERVISOR( )

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

%procglm (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

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

%procglm (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

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_MEANS

SUMMARY_CRUDE_GLMSUMMARY_CRUDE_GLM

SUMMARY_ADJUSTED_GLM SUMMARY_ADJUSTED_GLM key_var response_var mean n stderr stddev years_on_farm bmi 36.213 53482 0.079 18.259

SUPERVISOR( )SUPERVISOR( )

var1 = &response , var2 = &independent )

%procglm (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

var1 = &response , var2 = &independent )

%procglm (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

SUPERVISOR( )SUPERVISOR( )

var2 = &independent )

%procglm (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

var2 = &independent )

%procglm (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

SUPERVISOR( )SUPERVISOR( )

%procglm (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

%procglm (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

SUPERVISOR( )SUPERVISOR( )

%procglm (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

%procglm (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

SUPERVISOR( )SUPERVISOR( )

data = analysis_set, response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

data = analysis_set, response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

SUPERVISOR( )SUPERVISOR( )

response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

SUPERVISOR( )SUPERVISOR( )

independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

SUPERVISOR( )SUPERVISOR( )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

SUPERVISOR( )SUPERVISOR( )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

SUPERVISOR( )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 )

SUPERVISOR( )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)

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 Variable10 n Num 8 PROC MEANS: N of Independent Variable11 crude_estimate Num 8 PVALUE6.4 Crude PROC GLM: Parameter Estimate12 adjusted_estimate Num 8 PVALUE6.4 Adjusted PROC GLM: Parameter Estimate13 crude_stderr Num 8 ODDSR8.3 Crude PROC GLM: Standard Error of Estimate14 adjusted_stderr Num 8 ODDSR8.3 Adjusted PROC GLM: Standard Error of Estimate

Creates the GLM_SUMMARY Data SetCreates the GLM_SUMMARY Data Set

SUPERVISOR( )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)

%IFIF %UPCASEUPCASE(&report) = YES %THENTHEN %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)

%IFIF %UPCASEUPCASE(&report) = YES %THENTHEN %PrintReport(data=&outfile);

SUPERVISOR( )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)

%IFIF %UPCASEUPCASE(&report) = YES %THENTHEN %PrintReport(data=&outfile);

%MENDMEND 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)

%IFIF %UPCASEUPCASE(&report) = YES %THENTHEN %PrintReport(data=&outfile);

%MENDMEND supervisor;

Two Invocatoins of the MacroTwo 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, report = YESYES)

%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, report = YESYES)

Produce the Following ReportProduce 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

Produce the Following ReportProduce 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 2816636.21 0.08 28166 0.030 0.001 0.021 0.002 Acres planted crops 47.03 0.04 2820947.03 0.04 28209 0.022 0.001 0.024 0.002

(a) (a) PROC MEANS PROC MEANS

Produce the Following ReportProduce 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 2816636.21 0.08 28166 0.030 0.0010.030 0.001 0.021 0.002 Acres planted crops 47.03 0.04 2820947.03 0.04 28209 0.022 0.0010.022 0.001 0.024 0.002

(a)(a) PROC MEANS PROC MEANS

(b)(b) Crude PROC GLMCrude PROC GLM

Produce the Following ReportProduce 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 2816636.21 0.08 28166 0.030 0.0010.030 0.001 0.021 0.0020.021 0.002 Acres planted crops 47.03 0.04 2820947.03 0.04 28209 0.022 0.0010.022 0.001 0.024 0.0020.024 0.002

(a)(a) PROC MEANS PROC MEANS

(b)(b) Crude PROC GLMCrude PROC GLM

(c)(c) Adjusted PROC GLMAdjusted PROC GLM

Flexibility of the DesignFlexibility of the Design

Flexibility of the DesignFlexibility of the Design

Change from a Linear to a Logistic Regression AnalysisChange from a Linear to a Logistic Regression Analysis

Flexibility of the DesignFlexibility of the Design

Change from a Linear to a Logistic Regression AnalysisChange from a Linear to a Logistic Regression Analysis

In this Example we are Switching from a Continuous to a In this Example we are Switching from a Continuous to a Categorical Independent VariableCategorical Independent Variable

Five Main ChangesFive Main Changes

Change from Analysis of Variance to Logistic Regression

Alter the Continuous Independent Variable to Categorical

Five Main ChangesFive Main Changes

1.1. Adjust BASE data set to handle the new analysisAdjust BASE data set to handle the new analysis

Five Main ChangesFive Main Changes

1.1. Adjust BASE data set to handle the new analysisAdjust BASE data set to handle the new analysis

2.2. Replace the PROCMEANS module with a Replace the PROCMEANS module with a PROCFREQ modulePROCFREQ module

Five Main ChangesFive 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

Five Main ChangesFive 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

Five Main ChangesFive 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)

INITBASE( )INITBASE( )

PROCFREQ( ) Macro ModulePROCFREQ( ) Macro Module

PROCFREQ( ) Macro ModulePROCFREQ( ) Macro Module

Produce a dataset of counts & percentagesProduce a dataset of counts & percentages

PROCFREQ( ) Macro ModulePROCFREQ( ) Macro Module

Produce a dataset of counts & percentagesProduce a dataset of counts & percentagesPROC FREQPROC FREQ

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

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 ‚ 66586658 ‚ 346 346 ‚ 7004 ‚ 38.15 ‚ 1.98 ‚ 40.14 ‚ 95.06 ‚ 4.94 ‚ ‚ 39.8439.84 ‚ 46.9546.95 ‚ ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ 1-90 Days‚ 63586358 ‚ 278278 ‚ 6636 ‚ 36.44 ‚ 1.59 ‚ 38.03 ‚ 95.81 ‚ 4.19 ‚ ‚ 38.0438.04 ‚ 37.7237.72 ‚ ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ > 90 Days‚ 3697 3697 ‚ 113 113 ‚ 3810 ‚ 21.19 ‚ 0.65 ‚ 21.83 ‚ 97.03 ‚ 2.97 ‚ ‚ 22.1222.12 ‚ 15.3315.33 ‚ ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ Total 16713 737 17450 95.78 4.22 100.00

Frequency Missing = 4945

%MACRO ctab(__dset = , __col_var = , __row_var = );

ODS LISTING CLOSE; ODS OUTPUT CrossTabFreqs = __ctab (KEEP = &__col_var &__row_var _TYPE_ FREQUENCY COLPERCENT);

PROC FREQ DATAPROC FREQ DATA=&data; TABLESTABLES &row_var * &col_var; RUNRUN;

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 DATAPROC FREQ DATA=&data; TABLESTABLES &row_var * &col_var; RUNRUN;

ODS OUTPUT CLOSE; ODS LISTING;

PROCFREQ( )PROCFREQ( )

%MACRO ctab(__dset = , __col_var = , __row_var = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT CrossTabFreqs = summary_freq (KEEPKEEP = &col_var &row_var _TYPE_ FREQUENCY COLPERCENT);

PROC FREQ DATAPROC FREQ DATA=&data; TABLESTABLES &row_var * &col_var; RUNRUN;

ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MACRO ctab(__dset = , __col_var = , __row_var = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT CrossTabFreqs = summary_freq (KEEPKEEP = &col_var &row_var _TYPE_ FREQUENCY COLPERCENT);

PROC FREQ DATAPROC FREQ DATA=&data; TABLESTABLES &row_var * &col_var; RUNRUN;

ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

PROCFREQ( )PROCFREQ( )

%MACRO ctab(__dset = , __col_var = , __row_var = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT CrossTabFreqs = summary_freq (KEEPKEEP = &col_var &row_var _TYPE_ FREQUENCY COLPERCENT); WHEREWHERE = (_type_="11")); PROC FREQ DATAPROC FREQ DATA=&data; TABLESTABLES &row_var * &col_var; RUNRUN;

ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

%MACRO ctab(__dset = , __col_var = , __row_var = );

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT CrossTabFreqs = summary_freq (KEEPKEEP = &col_var &row_var _TYPE_ FREQUENCY COLPERCENT); WHEREWHERE = (_type_="11")); PROC FREQ DATAPROC FREQ DATA=&data; TABLESTABLES &row_var * &col_var; RUNRUN;

ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTING;

PROCFREQ( )PROCFREQ( )

%MACRO ctab(__dset = , __col_var = , __row_var = );

ODS LISTING CLOSEODS LISTING CLOSE; ODS OUTPUTODS OUTPUT CrossTabFreqs = summary_freq (KEEPKEEP = &col_var &row_var _TYPE_ FREQUENCY COLPERCENT); WHEREWHERE = (_type_="11")); PROC FREQ DATAPROC FREQ DATA=&data; TABLESTABLES &row_var * &col_var; RUNRUN;

ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTINGODS LISTING;

%MACRO ctab(__dset = , __col_var = , __row_var = );

ODS LISTING CLOSEODS LISTING CLOSE; ODS OUTPUTODS OUTPUT CrossTabFreqs = summary_freq (KEEPKEEP = &col_var &row_var _TYPE_ FREQUENCY COLPERCENT); WHEREWHERE = (_type_="11")); PROC FREQ DATAPROC FREQ DATA=&data; TABLESTABLES &row_var * &col_var; RUNRUN;

ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTINGODS LISTING;

PROCFREQ( )PROCFREQ( )

%MACROMACRO ctab(data = , col_var = , row_var = );

ODS LISTING CLOSEODS LISTING CLOSE; ODS OUTPUTODS OUTPUT CrossTabFreqs = summary_freq (KEEPKEEP = &col_var &row_var _TYPE_ FREQUENCY COLPERCENT) WHEREWHERE = (_type_="11")); PROC FREQ DATAPROC FREQ DATA=&data; TABLESTABLES &row_var * &col_var; RUNRUN;

ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTINGODS LISTING;

%MACROMACRO ctab(data = , col_var = , row_var = );

ODS LISTING CLOSEODS LISTING CLOSE; ODS OUTPUTODS OUTPUT CrossTabFreqs = summary_freq (KEEPKEEP = &col_var &row_var _TYPE_ FREQUENCY COLPERCENT) WHEREWHERE = (_type_="11")); PROC FREQ DATAPROC FREQ DATA=&data; TABLESTABLES &row_var * &col_var; RUNRUN;

ODS OUTPUT CLOSEODS OUTPUT CLOSE; ODS LISTINGODS LISTING;

PROCFREQ( )PROCFREQ( )

Row Col Obs DaysMix asthma _type_ Frequency Percent Percent Percent Missing

1 None No 1111 6658 6658 38.155 95.0600 39.837339.8373 . 2 None Yes 11 11 346 346 1.983 4.9400 46.947146.9471 . 3 None . 10 7004 40.138 . . . 4 1-90 Days No 11 11 6358 6358 36.436 95.8107 38.042238.0422 . 5 1-90 Days Yes 11 11 278 278 1.593 4.1893 37.720537.7205 . 6 1-90 Days . 10 6636 38.029 . . . 7 > 90 Days No 1111 3697 3697 21.186 97.0341 22.120522.1205 . 8 > 90 Days Yes 11 11 113 113 0.648 2.9659 15.3324 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( )PROCFREQ( )

Row Col Obs DaysMix asthma _type_ Frequency Percent Percent Percent Missing

1 None No 1111 6658 6658 38.155 95.0600 39.837339.8373 . 2 None Yes 11 11 346 346 1.983 4.9400 46.947146.9471 . 3 None . 10 7004 40.138 . . . 4 1-90 Days No 11 11 6358 6358 36.436 95.8107 38.042238.0422 . 5 1-90 Days Yes 11 11 278 278 1.593 4.1893 37.720537.7205 . 6 1-90 Days . 10 6636 38.029 . . . 7 > 90 Days No 1111 3697 3697 21.186 97.0341 22.120522.1205 . 8 > 90 Days Yes 11 11 113 113 0.648 2.9659 15.3324 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( )PROCFREQ( )

PROCFREQ( )PROCFREQ( )

Row Col Obs DaysMix asthma _type_ Frequency Percent Percent Percent Missing

1 None No 1111 66586658 38.155 95.0600 39.837339.8373 . 2 None Yes 11 11 346 346 1.983 4.9400 46.947146.9471 . 3 None . 10 7004 40.138 . . . 4 1-90 Days No 1111 63586358 36.436 95.8107 38.042238.0422 . 5 1-90 Days Yes 11 11 278278 1.593 4.1893 37.720537.7205 . 6 1-90 Days . 10 6636 38.029 . . . 7 > 90 Days No 1111 36973697 21.186 97.0341 22.120522.1205 . 8 > 90 Days Yes 1111 113 113 0.648 2.9659 15.332415.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( )PROCFREQ( )

Row Col Obs DaysMix asthma _type_ Frequency Percent Percent Percent Missing

1 None No 1111 6658 6658 38.155 95.0600 39.837339.8373 . 2 None Yes 1111 346 346 1.983 4.9400 46.947146.9471 . 3 None . 10 7004 40.138 . . . 4 1-90 Days No 1111 6358 6358 36.436 95.8107 38.042238.0422 . 5 1-90 Days Yes 1111 278 278 1.593 4.1893 37.720537.7205 . 6 1-90 Days . 10 6636 38.029 . . . 7 > 90 Days No 1111 3697 3697 21.186 97.0341 22.120522.1205 . 8 > 90 Days Yes 11 11 113 113 0.648 2.9659 15.3324 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

DATADATA summary_freq ( KEEPKEEP = key_value n_col1 p_col1 n_col2 p_col2 ) ; SETSET summary_freq ; BYBY &row_var &col_var; RETAINRETAIN n_col1 p_col1; IF FIRST.IF FIRST.&row_var THEN DO; n_col1 = frequency; p_col1 = colpercent; ENDEND; ELSEELSE IF LAST.IF LAST.&row_var THEN DOTHEN DO; n_col2 = frequency; p_col2 = colpercent; key_value = &row_var ; OUTPUTOUTPUT summary_freq; ENDEND; RUNRUN;

%MENDMEND ctab;

DATADATA summary_freq ( KEEPKEEP = key_value n_col1 p_col1 n_col2 p_col2 ) ; SETSET summary_freq ; BYBY &row_var &col_var; RETAINRETAIN n_col1 p_col1; IF FIRST.IF FIRST.&row_var THEN DO; n_col1 = frequency; p_col1 = colpercent; ENDEND; ELSEELSE IF LAST.IF LAST.&row_var THEN DOTHEN DO; n_col2 = frequency; p_col2 = colpercent; key_value = &row_var ; OUTPUTOUTPUT summary_freq; ENDEND; RUNRUN;

%MENDMEND ctab;

PROCFREQ( )PROCFREQ( )

PROCFREQ( )PROCFREQ( )

DATADATA summary_freq ( KEEPKEEP = key_value n_col1 p_col1 n_col2 p_col2 ) ; SETSET summary_freq; (WHERE = (_type_="11")); BYBY &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; ENDEND; ELSEELSE IF LAST.IF LAST.&row_var THEN DOTHEN DO; n_col2 = frequency; p_col2 = colpercent; key_value = &row_var ; OUTPUTOUTPUT summary_freq; ENDEND; RUNRUN;

%MENDMEND ctab;

DATADATA summary_freq ( KEEPKEEP = key_value n_col1 p_col1 n_col2 p_col2 ) ; SETSET summary_freq; (WHERE = (_type_="11")); BYBY &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; ENDEND; ELSEELSE IF LAST.IF LAST.&row_var THEN DOTHEN DO; n_col2 = frequency; p_col2 = colpercent; key_value = &row_var ; OUTPUTOUTPUT summary_freq; ENDEND; RUNRUN;

%MENDMEND ctab;

PROCFREQ( )PROCFREQ( )

DATADATA summary_freq ( KEEPKEEP = key_value n_col1 p_col1 n_col2 p_col2 ) ; SETSET summary_freq; (WHERE = (_type_="11")); BYBY &row_var &col_var; RETAINRETAIN n_col1 p_col1; IF FIRST.IF FIRST.&row_var THEN DO; n_col1 = frequency; p_col1 = colpercent; ENDEND; ELSEELSE IF LAST.&row_var THEN DO;IF LAST.&row_var THEN DO; n_col2 = frequency; p_col2 = colpercent; key_value = &row_var ; OUTPUT summary_freq;OUTPUT summary_freq; ENDEND; RUNRUN;

%MENDMEND ctab;

DATADATA summary_freq ( KEEPKEEP = key_value n_col1 p_col1 n_col2 p_col2 ) ; SETSET summary_freq; (WHERE = (_type_="11")); BYBY &row_var &col_var; RETAINRETAIN n_col1 p_col1; IF FIRST.IF FIRST.&row_var THEN DO; n_col1 = frequency; p_col1 = colpercent; ENDEND; ELSEELSE IF LAST.&row_var THEN DO;IF LAST.&row_var THEN DO; n_col2 = frequency; p_col2 = colpercent; key_value = &row_var ; OUTPUT summary_freq;OUTPUT summary_freq; ENDEND; RUNRUN;

%MENDMEND ctab;

PROCFREQ( )PROCFREQ( )

Row Col Obs DaysMix asthma _type_ Frequency Percent Percent Percent Missing

1 None None No 1111 6658 6658 38.155 95.0600 39.837339.8373 . 2 None None Yes 11 11 346 346 1.983 4.9400 46.947146.9471 . 3 None . 10 7004 40.138 . . . 4 1-90 Days1-90 Days No 11 11 6358 6358 36.436 95.8107 38.042238.0422 . 5 1-90 Days1-90 Days Yes 11 11 278 278 1.593 4.1893 37.720537.7205 . 6 1-90 Days . 10 6636 38.029 . . . 7 > 90 Days> 90 Days No 1111 3697 3697 21.186 97.0341 22.120522.1205 . 8 > 90 Days> 90 Days Yes 1111 113 113 0.648 2.9659 15.3324 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( )PROCFREQ( )

Row Col Obs Key_Value asthm a _type_ Frequency Percent Percent Percent Missing

1 00 No 1111 6658 6658 38.155 95.0600 39.837339.8373 . 2 0 0 Yes 11 11 346 346 1.983 4.9400 46.947146.9471 . 3 None . 10 7004 40.138 . . . 4 11 N o 11 11 6358 6358 36.436 95.8107 38.042238.0422 . 5 11 Yes 11 11 278 278 1.593 4.1893 37.720537.7205 . 6 1-90 Days . 10 6636 38.029 . . . 7 2 2 No 1111 3697 3697 21.186 97.0341 22.120522.1205 . 8 2 2 Yes 1111 113 113 0.648 2.9659 15.3324 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

Obs Key_Value asthma _type_ N_Col1 N_Col2 P_Col1 P_Col2

1 0 No 11 6658 3466658 346 39.8373 39.8373 46.947146.9471 2 0 Yes 11 346 1.983 4.9400 46.9471 3 None . 10 7004 40.138 . . . 4 1 No 11 6358 2786358 278 38.042238.0422 37.720537.7205 5 1 Yes 11 278 1.593 4.1893 37.7205 6 1-90 Days . 10 6636 38.029 . . . 7 2 No 11 3697 1133697 113 22.120522.1205 15.332415.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( )PROCFREQ( )

The CONTENTS Procedure

Data Set Name WORK.SUMMARY_FREQ Observations 3Member 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( )PROCFREQ( )

PROCLOGISTIC( )PROCLOGISTIC( )

%%MACROMACRO proclogistic(test = , proclogistic(test = , data = ,data = , response = ,response = , independent = ,independent = , ref = ,ref = , class_vars = ,class_vars = , continuous_vars = );continuous_vars = );

PROC LOGISTIC DATA = &__dset DESCENDING;

%%MACROMACRO proclogistic(test = , proclogistic(test = , data = ,data = , response = ,response = , independent = ,independent = , ref = ,ref = , class_vars = ,class_vars = , continuous_vars = );continuous_vars = );

PROC LOGISTIC DATA = &__dset DESCENDING;

PROCLOGISTIC( )PROCLOGISTIC( )

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 DATAPROC LOGISTIC DATA=&data =&data DESCENDINGDESCENDING ORDERORDER==INTERNALINTERNAL NAMELENNAMELEN==3232;; CLASSCLASS &independent (PARAMPARAM=REFREF REFREF="&ref"); MODELMODEL &response = &independent ; &response = &independent ; &__class_vars &__continuous_vars FORMAT &__independent; RUNRUN; ; 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 DATAPROC LOGISTIC DATA=&data =&data DESCENDINGDESCENDING ORDERORDER==INTERNALINTERNAL NAMELENNAMELEN==3232;; CLASSCLASS &independent (PARAMPARAM=REFREF REFREF="&ref"); MODELMODEL &response = &independent ; &response = &independent ; &__class_vars &__continuous_vars FORMAT &__independent; RUNRUN; ; ODS OUTPUT CLOSE; ODS LISTING;

PROCLOGISTIC( )PROCLOGISTIC( )

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 DATAPROC LOGISTIC DATA=&data =&data DESCENDINGDESCENDING ORDERORDER==INTERNALINTERNAL NAMELENNAMELEN==3232;; CLASSCLASS &independent (PARAMPARAM=REFREF REFREF="&ref"); MODELMODEL &response = &independent ; &response = &independent ; &__class_vars &__continuous_vars FORMAT &independent;FORMAT &independent; RUNRUN; ;

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 DATAPROC LOGISTIC DATA=&data =&data DESCENDINGDESCENDING ORDERORDER==INTERNALINTERNAL NAMELENNAMELEN==3232;; CLASSCLASS &independent (PARAMPARAM=REFREF REFREF="&ref"); MODELMODEL &response = &independent ; &response = &independent ; &__class_vars &__continuous_vars FORMAT &independent;FORMAT &independent; RUNRUN; ;

ODS OUTPUT CLOSE;

PROCLOGISTIC( )PROCLOGISTIC( )

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 DATAPROC LOGISTIC DATA=&data =&data DESCENDINGDESCENDING ORDERORDER==INTERNALINTERNAL NAMELENNAMELEN==3232;; CLASSCLASS &class_vars &class_vars &independent (PARAMPARAM=REFREF REFREF="&ref"); MODELMODEL &response = &independent &response = &independent &class_vars &continuous_vars &class_vars &continuous_vars ;; FORMATFORMAT &independent; &independent; RUNRUN; ; 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 DATAPROC LOGISTIC DATA=&data =&data DESCENDINGDESCENDING ORDERORDER==INTERNALINTERNAL NAMELENNAMELEN==3232;; CLASSCLASS &class_vars &class_vars &independent (PARAMPARAM=REFREF REFREF="&ref"); MODELMODEL &response = &independent &response = &independent &class_vars &continuous_vars &class_vars &continuous_vars ;; FORMATFORMAT &independent; &independent; RUNRUN; ; ODS OUTPUT CLOSE; ODS LISTING;

PROCLOGISTIC( )PROCLOGISTIC( )

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT ParameterEstimates = ParameterEstimatesParameterEstimates (KEEP = variable classval0 probchisq estimate StdErr RENAME = (ProbChiSq = &__test._p_value) )

OddsRatios = OddsRatiosOddsRatios; (KEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAME = (OddsRatioEst =&__test._OddsRatio LowerCL =&__test._LowerCL UpperCL = &__test._UpperCL ) ); PROC LOGISTIC DATAPROC LOGISTIC DATA=&data =&data DESCENDINGDESCENDING ORDERORDER==INTERNALINTERNAL NAMELENNAMELEN==3232;; CLASSCLASS &class_vars &class_vars &independent (PARAMPARAM=REFREF REFREF="&ref"); MODELMODEL &response = &independent &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars ;; FORMATFORMAT &independent; &independent; RUNRUN; ; ODS OUTPUT CLOSEODS OUTPUT CLOSE;; ODS LISTING;

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT ParameterEstimates = ParameterEstimatesParameterEstimates (KEEP = variable classval0 probchisq estimate StdErr RENAME = (ProbChiSq = &__test._p_value) )

OddsRatios = OddsRatiosOddsRatios; (KEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAME = (OddsRatioEst =&__test._OddsRatio LowerCL =&__test._LowerCL UpperCL = &__test._UpperCL ) ); PROC LOGISTIC DATAPROC LOGISTIC DATA=&data =&data DESCENDINGDESCENDING ORDERORDER==INTERNALINTERNAL NAMELENNAMELEN==3232;; CLASSCLASS &class_vars &class_vars &independent (PARAMPARAM=REFREF REFREF="&ref"); MODELMODEL &response = &independent &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars ;; FORMATFORMAT &independent; &independent; RUNRUN; ; ODS OUTPUT CLOSEODS OUTPUT CLOSE;; ODS LISTING;

PROCLOGISTIC( )PROCLOGISTIC( )

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT ParameterEstimates = ParameterEstimatesParameterEstimates (KEEP = variable classval0 probchisq(KEEP = variable classval0 probchisq estimate StdErrestimate StdErr RENAME = (ProbChiSq = &test._p_value) )RENAME = (ProbChiSq = &test._p_value) ) WHERE = (UPCASE(variable)="&independent"))WHERE = (UPCASE(variable)="&independent")) OddsRatios = OddsRatiosOddsRatios; (KEEP = EFFECT OddsRatioEst LowerCL UpperCL (KEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAME = (OddsRatioEst = &test._OddsRatioRENAME = (OddsRatioEst = &test._OddsRatio LowerCL = &test._LowerCLLowerCL = &test._LowerCL UpperCL = &test._UpperCL ) );UpperCL = &test._UpperCL ) ); WHEREWHERE == (UPCASE(SCAN(EFFECT,1))="&independent"))(UPCASE(SCAN(EFFECT,1))="&independent"));; PROC LOGISTIC DATAPROC LOGISTIC DATA=&data =&data DESCENDINGDESCENDING ORDERORDER==INTERNALINTERNAL NAMELENNAMELEN==3232;; CLASSCLASS &class_vars &class_vars &independent (PARAMPARAM=REFREF REFREF="&ref"); MODELMODEL &response = &independent &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars ;; FORMATFORMAT &independent; &independent; RUNRUN; ; ODS OUTPUT CLOSEODS OUTPUT CLOSE;; ODS LISTING;

ODS LISTING CLOSE; ODS OUTPUTODS OUTPUT ParameterEstimates = ParameterEstimatesParameterEstimates (KEEP = variable classval0 probchisq(KEEP = variable classval0 probchisq estimate StdErrestimate StdErr RENAME = (ProbChiSq = &test._p_value) )RENAME = (ProbChiSq = &test._p_value) ) WHERE = (UPCASE(variable)="&independent"))WHERE = (UPCASE(variable)="&independent")) OddsRatios = OddsRatiosOddsRatios; (KEEP = EFFECT OddsRatioEst LowerCL UpperCL (KEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAME = (OddsRatioEst = &test._OddsRatioRENAME = (OddsRatioEst = &test._OddsRatio LowerCL = &test._LowerCLLowerCL = &test._LowerCL UpperCL = &test._UpperCL ) );UpperCL = &test._UpperCL ) ); WHEREWHERE == (UPCASE(SCAN(EFFECT,1))="&independent"))(UPCASE(SCAN(EFFECT,1))="&independent"));; PROC LOGISTIC DATAPROC LOGISTIC DATA=&data =&data DESCENDINGDESCENDING ORDERORDER==INTERNALINTERNAL NAMELENNAMELEN==3232;; CLASSCLASS &class_vars &class_vars &independent (PARAMPARAM=REFREF REFREF="&ref"); MODELMODEL &response = &independent &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars ;; FORMATFORMAT &independent; &independent; RUNRUN; ; ODS OUTPUT CLOSEODS OUTPUT CLOSE;; ODS LISTING;

PROCLOGISTIC( )PROCLOGISTIC( )

ODS LISTING CLOSEODS LISTING CLOSE;; ODS OUTPUTODS OUTPUT ParameterEstimates = ParameterEstimatesParameterEstimates (KEEPKEEP = variable classval0 probchisq estimate StdErr RENAMERENAME = (ProbChiSq = &test._p_value) ) WHERE WHERE = (UPCASEUPCASE(variable)="&independent")) OddsRatios = OddsRatiosOddsRatios; (KEEPKEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAMERENAME = (OddsRatioEst = &test._OddsRatio LowerCL = &test._LowerCL UpperCL = &test._UpperCL ) ); WHEREWHERE == ((UPCASEUPCASE((SCANSCAN(EFFECT,1))="&independent"));(EFFECT,1))="&independent")); PROC LOGISTIC DATAPROC LOGISTIC DATA=&data =&data DESCENDINGDESCENDING ORDERORDER==INTERNALINTERNAL NAMELENNAMELEN==3232;; CLASSCLASS &class_vars &class_vars &independent (PARAMPARAM=REFREF REFREF="&ref"); MODELMODEL &response = &independent &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars ;; FORMATFORMAT &independent; &independent; RUNRUN; ; ODS OUTPUT CLOSEODS OUTPUT CLOSE;; ODS LISTINGODS LISTING;

ODS LISTING CLOSEODS LISTING CLOSE;; ODS OUTPUTODS OUTPUT ParameterEstimates = ParameterEstimatesParameterEstimates (KEEPKEEP = variable classval0 probchisq estimate StdErr RENAMERENAME = (ProbChiSq = &test._p_value) ) WHERE WHERE = (UPCASEUPCASE(variable)="&independent")) OddsRatios = OddsRatiosOddsRatios; (KEEPKEEP = EFFECT OddsRatioEst LowerCL UpperCL RENAMERENAME = (OddsRatioEst = &test._OddsRatio LowerCL = &test._LowerCL UpperCL = &test._UpperCL ) ); WHEREWHERE == ((UPCASEUPCASE((SCANSCAN(EFFECT,1))="&independent"));(EFFECT,1))="&independent")); PROC LOGISTIC DATAPROC LOGISTIC DATA=&data =&data DESCENDINGDESCENDING ORDERORDER==INTERNALINTERNAL NAMELENNAMELEN==3232;; CLASSCLASS &class_vars &class_vars &independent (PARAMPARAM=REFREF REFREF="&ref"); MODELMODEL &response = &independent &response = &independent &class_vars &continuous_vars&class_vars &continuous_vars ;; FORMATFORMAT &independent; &independent; RUNRUN; ; ODS OUTPUT CLOSEODS OUTPUT CLOSE;; ODS LISTINGODS LISTING;

PROCLOGISTIC( )PROCLOGISTIC( )

DATADATA ParameterEstimates ( ParameterEstimates ( KEEPKEEP = key_value &test._p_value ); = key_value &test._p_value ); SETSET ParameterEstimates ; ParameterEstimates ; Key_Value = Key_Value = INPUTINPUT(classval0,8.); (classval0,8.); RUNRUN;;

DATADATA OddsRatios ( OddsRatios ( KEEPKEEP = key_value &test._OddsRatio = key_value &test._OddsRatio &test._LowerCL &test._UpperCL ); &test._LowerCL &test._UpperCL ); SETSET OddsRatios ; OddsRatios ; Key_Value = Key_Value = INPUTINPUT((((SCANSCAN(EFFECT,(EFFECT,22)),)),2.2.); ); RUNRUN;;

DATADATA ParameterEstimates ( ParameterEstimates ( KEEPKEEP = key_value &test._p_value ); = key_value &test._p_value ); SETSET ParameterEstimates ; ParameterEstimates ; Key_Value = Key_Value = INPUTINPUT(classval0,8.); (classval0,8.); RUNRUN;;

DATADATA OddsRatios ( OddsRatios ( KEEPKEEP = key_value &test._OddsRatio = key_value &test._OddsRatio &test._LowerCL &test._UpperCL ); &test._LowerCL &test._UpperCL ); SETSET OddsRatios ; OddsRatios ; Key_Value = Key_Value = INPUTINPUT((((SCANSCAN(EFFECT,(EFFECT,22)),)),2.2.); ); RUNRUN;;

PROCLOGISTIC( )PROCLOGISTIC( )

DATADATA ParameterEstimates ( ParameterEstimates ( KEEPKEEP = key_value &test._p_value ); = key_value &test._p_value ); SETSET ParameterEstimates ; ParameterEstimates ; Key_ValueKey_Value = INPUT(classval0,8.);= INPUT(classval0,8.); RUNRUN;;

DATADATA OddsRatios ( OddsRatios ( KEEPKEEP = key_value &test._OddsRatio = key_value &test._OddsRatio &test._LowerCL &test._UpperCL ); &test._LowerCL &test._UpperCL ); SETSET OddsRatios ; OddsRatios ; Key_Value = Key_Value = INPUTINPUT((((SCANSCAN(EFFECT,(EFFECT,22)),)),2.2.); ); RUNRUN;;

DATADATA ParameterEstimates ( ParameterEstimates ( KEEPKEEP = key_value &test._p_value ); = key_value &test._p_value ); SETSET ParameterEstimates ; ParameterEstimates ; Key_ValueKey_Value = INPUT(classval0,8.);= INPUT(classval0,8.); RUNRUN;;

DATADATA OddsRatios ( OddsRatios ( KEEPKEEP = key_value &test._OddsRatio = key_value &test._OddsRatio &test._LowerCL &test._UpperCL ); &test._LowerCL &test._UpperCL ); SETSET OddsRatios ; OddsRatios ; Key_Value = Key_Value = INPUTINPUT((((SCANSCAN(EFFECT,(EFFECT,22)),)),2.2.); ); RUNRUN;;

PROCLOGISTIC( )PROCLOGISTIC( )

DATADATA ParameterEstimates ( ParameterEstimates ( KEEPKEEP = key_value &test._p_value ); = key_value &test._p_value ); SETSET ParameterEstimates ; ParameterEstimates ; Key_Value = Key_Value = INPUTINPUT(classval0,8.); (classval0,8.); RUNRUN;;

DATADATA OddsRatios ( OddsRatios ( KEEPKEEP = key_value &test._OddsRatio = key_value &test._OddsRatio &test._LowerCL &test._UpperCL ); &test._LowerCL &test._UpperCL ); SETSET OddsRatios ; OddsRatios ; Key_Value = INPUT((SCAN(EFFECT,Key_Value = INPUT((SCAN(EFFECT,22)),)),2.2.);); RUNRUN;;

DATADATA ParameterEstimates ( ParameterEstimates ( KEEPKEEP = key_value &test._p_value ); = key_value &test._p_value ); SETSET ParameterEstimates ; ParameterEstimates ; Key_Value = Key_Value = INPUTINPUT(classval0,8.); (classval0,8.); RUNRUN;;

DATADATA OddsRatios ( OddsRatios ( KEEPKEEP = key_value &test._OddsRatio = key_value &test._OddsRatio &test._LowerCL &test._UpperCL ); &test._LowerCL &test._UpperCL ); SETSET OddsRatios ; OddsRatios ; Key_Value = INPUT((SCAN(EFFECT,Key_Value = INPUT((SCAN(EFFECT,22)),)),2.2.);); RUNRUN;;

PROCLOGISTIC( )PROCLOGISTIC( )

PROC SORTPROC SORT DATADATA=ParameterEstimates;=ParameterEstimates; BYBY key_value; key_value; RUNRUN;;

PROC SORTPROC SORT DATADATA=OddsRatios;=OddsRatios; BYBY key_value; key_value; RUNRUN;;

DATADATA summary_&test._logistic ; summary_&test._logistic ; MERGEMERGE ParameterEstimates OddsRatios ; ParameterEstimates OddsRatios ; BYBY key_value; key_value; RUNRUN;;

PROC SORTPROC SORT DATADATA=ParameterEstimates;=ParameterEstimates; BYBY key_value; key_value; RUNRUN;;

PROC SORTPROC SORT DATADATA=OddsRatios;=OddsRatios; BYBY key_value; key_value; RUNRUN;;

DATADATA summary_&test._logistic ; summary_&test._logistic ; MERGEMERGE ParameterEstimates OddsRatios ; ParameterEstimates OddsRatios ; BYBY key_value; key_value; RUNRUN;;

PROCLOGISTIC( )PROCLOGISTIC( )

PROC SORTPROC SORT DATADATA=ParameterEstimates;=ParameterEstimates; BYBY key_value key_value; ; RUNRUN;;

PROC SORTPROC SORT DATADATA=OddsRatios;=OddsRatios; BYBY key_valuekey_value; ; RUNRUN;;

DATADATA summary_&test._logistic ; summary_&test._logistic ; MERGEMERGE ParameterEstimates OddsRatios ; ParameterEstimates OddsRatios ; BYBY key_valuekey_value;; RUNRUN;;

PROC SORTPROC SORT DATADATA=ParameterEstimates;=ParameterEstimates; BYBY key_value key_value; ; RUNRUN;;

PROC SORTPROC SORT DATADATA=OddsRatios;=OddsRatios; BYBY key_valuekey_value; ; RUNRUN;;

DATADATA summary_&test._logistic ; summary_&test._logistic ; MERGEMERGE ParameterEstimates OddsRatios ; ParameterEstimates OddsRatios ; BYBY key_valuekey_value;; RUNRUN;;

PROCLOGISTIC( )PROCLOGISTIC( )

PROC SORTPROC SORT DATADATA=ParameterEstimates;=ParameterEstimates; BYBY key_value; key_value; RUNRUN;;

PROC SORTPROC SORT DATADATA=OddsRatios;=OddsRatios; BYBY key_value; key_value; RUNRUN;;

DATADATA summary_&test._logistic ; summary_&test._logistic ; MERGEMERGE ParameterEstimates OddsRatios ; ParameterEstimates OddsRatios ; BYBY key_value; key_value; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE ParameterEstimates OddsRatiosParameterEstimates OddsRatios;; QUITQUIT;; RUNRUN;;

%MEND proclogistic;

PROC SORTPROC SORT DATADATA=ParameterEstimates;=ParameterEstimates; BYBY key_value; key_value; RUNRUN;;

PROC SORTPROC SORT DATADATA=OddsRatios;=OddsRatios; BYBY key_value; key_value; RUNRUN;;

DATADATA summary_&test._logistic ; summary_&test._logistic ; MERGEMERGE ParameterEstimates OddsRatios ; ParameterEstimates OddsRatios ; BYBY key_value; key_value; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE ParameterEstimates OddsRatiosParameterEstimates OddsRatios;; QUITQUIT;; RUNRUN;;

%MEND proclogistic;

PROCLOGISTIC( )PROCLOGISTIC( )

PROC SORTPROC SORT DATADATA=ParameterEstimates;=ParameterEstimates; BYBY key_value; key_value; RUNRUN;;

PROC SORTPROC SORT DATADATA=OddsRatios;=OddsRatios; BYBY key_value; key_value; RUNRUN;;

DATADATA summary_&test._logistic ; summary_&test._logistic ; MERGEMERGE ParameterEstimates OddsRatios ; ParameterEstimates OddsRatios ; BYBY key_value; key_value; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE ParameterEstimates OddsRatios; ParameterEstimates OddsRatios; QUITQUIT;; RUNRUN;;

%MENDMEND proclogistic;

PROC SORTPROC SORT DATADATA=ParameterEstimates;=ParameterEstimates; BYBY key_value; key_value; RUNRUN;;

PROC SORTPROC SORT DATADATA=OddsRatios;=OddsRatios; BYBY key_value; key_value; RUNRUN;;

DATADATA summary_&test._logistic ; summary_&test._logistic ; MERGEMERGE ParameterEstimates OddsRatios ; ParameterEstimates OddsRatios ; BYBY key_value; key_value; RUNRUN;;

PROC DATASETSPROC DATASETS;; DELETEDELETE ParameterEstimates OddsRatios; ParameterEstimates OddsRatios; QUITQUIT;; RUNRUN;;

%MENDMEND proclogistic;

PROCLOGISTIC( )PROCLOGISTIC( )

The CONTENTS Procedure

Data Set Name WORK.SUMMARY_CRUDECRUDE_LOGISTIC Observations 2Member Type DATA Variables 5

Alphabetic List of Variables and Attributes

# Variable Type Len Format Label

4 CrudeCrude_LowerCL Num 8 ODDSR8.3 Crude PROC LOGISTIC Lower 95% CI3 CrudeCrude_OddsRatio Num 8 ODDSR8.3 Crude PROC LOGISTIC Odds Ratio 5 CrudeCrude_UpperCL Num 8 ODDSR8.3 Crude PROC LOGISTIC Upper 95% CI1 CrudeCrude_p_value Num 8 PVALUE6.4 Crude PROC LOGISTIC Chi-Square prob2 key_value Num 8

PROCLOGISTIC( )PROCLOGISTIC( )

The CONTENTS Procedure

Data Set Name WORK.SUMMARY_ADJUSTED_LOGISTIC Observations 2Member Type DATA Variables 5

Alphabetic List of Variables and Attributes

# Variable Type Len Format Label

4 AdjustedAdjusted_LowerCL Num 8 ODDSR8.3 Adjusted PROC LOGISTIC Lower 95% CI3 AdjustedAdjusted_OddsRatio Num 8 ODDSR8.3 Adjusted PROC LOGISTIC Odds Ratio 5 AdjustedAdjusted_UpperCL Num 8 ODDSR8.3 Adjusted PROC LOGISTIC Upper 95% CI1 AdjustedAdjusted_p_value Num 8 PVALUE6.4 Adjusted PROC LOGISTIC Chi-Square prob2 var2_value Num 8

PROCLOGISTIC( )PROCLOGISTIC( )

%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; %%splitsplit(__vars=&__basevs)(__vars=&__basevs)

%%makesetmakeset(__dset = &__dset ,(__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 )

%%ctabctab(__dset = __analysis_set, (__dset = __analysis_set, __col_var = &__var1 ,__col_var = &__var1 , __row_var = &__var2 )__row_var = &__var2 )

%%logitlogit(__test = Crude, (__test = Crude, __dset = __analysis_set,__dset = __analysis_set, __response = &__var1,__response = &__var1, __independent = &__var2,__independent = &__var2, __ref = &__ref )__ref = &__ref )

%%logitlogit(__test = Adjusted, (__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 )

%%summarysetsummaryset(__base = &__out)(__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; %%splitsplit(__vars=&__basevs)(__vars=&__basevs)

%%makesetmakeset(__dset = &__dset ,(__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 )

%%ctabctab(__dset = __analysis_set, (__dset = __analysis_set, __col_var = &__var1 ,__col_var = &__var1 , __row_var = &__var2 )__row_var = &__var2 )

%%logitlogit(__test = Crude, (__test = Crude, __dset = __analysis_set,__dset = __analysis_set, __response = &__var1,__response = &__var1, __independent = &__var2,__independent = &__var2, __ref = &__ref )__ref = &__ref )

%%logitlogit(__test = Adjusted, (__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 )

%%summarysetsummaryset(__base = &__out)(__base = &__out) %nodata: %nodata:

%MEND summary;%MEND summary;

SUPERVISOR( )SUPERVISOR( )

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

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

SUPERVISOR( )SUPERVISOR( )

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

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

Add a Paramater for the Referent LevelAdd a Paramater for the Referent Level

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

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

SUPERVISOR( )SUPERVISOR( )

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

PassPass ReferentReferent ParameterParameter toto VALIDATE(VALIDATE( ))

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , ref = &referent ,ref = &referent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , ref = &referent ,ref = &referent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase(base=&outfile);

Adjust INITBASE(Adjust INITBASE( ))

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , ref = &referent ,ref = &referent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase%initbase(base=&outfile);

%LOCALLOCAL echeck;

%LETLET response = %UPCASEUPCASE(&response); %LETLET independent = %UPCASEUPCASE(&independent);

%validate(dset = &dataset, var1 = &response, var2 = &independent , ref = &referent ,ref = &referent , basevs = &covariates, out = &outfile ) %IFIF &echeck = 1 %THENTHEN %RETURNRETURN;

%IFIF %SYSFUNCSYSFUNC(EXISTEXIST(&outfile)) NENE 1 %THENTHEN %initbase%initbase(base=&outfile);

SUPERVISOR( )SUPERVISOR( )

%LETLET class_vars =%split(vars=&covariates,control=); %LETLET 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 )

%LETLET class_vars =%split(vars=&covariates,control=); %LETLET 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 )

SUPERVISOR( )SUPERVISOR( )

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

%procglm (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

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

%procglm (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

Replace PROCMEANS( )Replace PROCMEANS( )

%procfreq%procfreq (data = analysis_set, var1 = &response , var2 = &independent )

%procglm (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

%procfreq%procfreq (data = analysis_set, var1 = &response , var2 = &independent )

%procglm (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

%procglm (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

Replace PROCGLM( )Replace PROCGLM( )

%procfreq%procfreq (data = analysis_set, var1 = &response , var2 = &independent )

%proclogistic%proclogistic (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

%proclogistic%proclogistic (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

%procfreq%procfreq (data = analysis_set, var1 = &response , var2 = &independent )

%proclogistic%proclogistic (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent )

%proclogistic%proclogistic (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , class_vars = &class_vars, continuous_vars = &continuous_vars )

Pass Referent to PROCLOGISTIC( )Pass Referent to PROCLOGISTIC( )

%procfreq%procfreq (data = analysis_set, var1 = &response , var2 = &independent )

%proclogistic%proclogistic (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent, ref = &referent ref = &referent )

%proclogistic%proclogistic (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , ref = &referent ,ref = &referent , class_vars = &class_vars, continuous_vars = &continuous_vars )

%procfreq%procfreq (data = analysis_set, var1 = &response , var2 = &independent )

%proclogistic%proclogistic (test = CrudeCrude, data = analysis_set, response = &response, independent = &independent, ref = &referent ref = &referent )

%proclogistic%proclogistic (test = AdjustedAdjusted, data = analysis_set, response = &response, independent = &independent , ref = &referent ,ref = &referent , class_vars = &class_vars, continuous_vars = &continuous_vars )

SUPERVISOR( )SUPERVISOR( )

%summaryset(merge_var = key_var, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars , continuous_vars = &continuous_vars)

%IFIF %UPCASEUPCASE(&report) = YES %THENTHEN %PrintReport(data=&outfile);

%MENDMEND supervisor;

%summaryset(merge_var = key_var, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars , continuous_vars = &continuous_vars)

%IFIF %UPCASEUPCASE(&report) = YES %THENTHEN %PrintReport(data=&outfile);

%MENDMEND supervisor;

Change merge_var to key_valueChange merge_var to key_value

%summaryset(merge_var = key_value,key_value, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars , continuous_vars = &continuous_vars)

%IFIF %UPCASEUPCASE(&report) = YES %THENTHEN %PrintReport(data=&outfile);

%MENDMEND supervisor;

%summaryset(merge_var = key_value,key_value, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars , continuous_vars = &continuous_vars)

%IFIF %UPCASEUPCASE(&report) = YES %THENTHEN %PrintReport(data=&outfile);

%MENDMEND supervisor;

Adjust PRINTREPORT( )Adjust PRINTREPORT( )

%summaryset(merge_var = key_value,key_value, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars , continuous_vars = &continuous_vars)

%IFIF %UPCASEUPCASE(&report) = YES %THENTHEN %PrintReport%PrintReport(data=&outfile);

%MENDMEND supervisor;

%summaryset(merge_var = key_value,key_value, base = GLM_summary, setlist = SUMMARY_, delsets = analysis_set, class_vars = &class_vars , continuous_vars = &continuous_vars)

%IFIF %UPCASEUPCASE(&report) = YES %THENTHEN %PrintReport%PrintReport(data=&outfile);

%MENDMEND supervisor;

ThisThis InvocationInvocation ofof SUPERVISOR(SUPERVISOR( ))

%supervisor(dataset = mydata ,%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 ,%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);

Produces the Following ReportProduces the Following Report

Class Covariates = state race Continuous Covariates = age Ever Diagnosed with asthma Variable Yes No P-Value OR 95% CILabel/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

Create an Iteration MacroCreate an Iteration Macro

%supervisor(dataset = mydata ,%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 ,%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 )

%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 EXECUTECALL EXECUTE ( (CATSCATS('%('%NRSTRNRSTR('(' ,'%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 EXECUTECALL EXECUTE ( (CATSCATS('%('%NRSTRNRSTR('(' ,'%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 = ); DATADATA _NULL__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 EXECUTECALL EXECUTE ( (CATSCATS('%('%NRSTRNRSTR('(' ,'%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; RUNRUN;%MEND callexecute;

%MACRO callexecute(arrayvars = ); DATADATA _NULL__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 EXECUTECALL EXECUTE ( (CATSCATS('%('%NRSTRNRSTR('(' ,'%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; RUNRUN;%MEND callexecute;

%MACRO callexecute(arrayvars = ); DATADATA _NULL__NULL_; LENGTH independent $ 32 print_report $3; IF 0 THEN SET mydata; ARRAYARRAY i_var (*) &array_vars; DODO i = 1 TO DIMTO DIM ( i_var ); independent = VNAMEVNAME ( i_var[i] ); IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTECALL EXECUTE ( (CATSCATS('%('%NRSTRNRSTR('(' ,'%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 ,")" , ")" ) );,")" , ")" ) ); ENDEND; RUNRUN;%MEND callexecute;

%MACRO callexecute(arrayvars = ); DATADATA _NULL__NULL_; LENGTH independent $ 32 print_report $3; IF 0 THEN SET mydata; ARRAYARRAY i_var (*) &array_vars; DODO i = 1 TO DIMTO DIM ( i_var ); independent = VNAMEVNAME ( i_var[i] ); IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTECALL EXECUTE ( (CATSCATS('%('%NRSTRNRSTR('(' ,'%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 ,")" , ")" ) );,")" , ")" ) ); ENDEND; RUNRUN;%MEND callexecute;

%MACRO callexecute(arrayvars = ); DATADATA _NULL__NULL_; LENGTH independent $ 32 print_report $3; IFIF 0 THEN SETTHEN SET mydata; ARRAYARRAY i_var (*) &array_vars; DODO i = 1 TO DIMTO DIM ( i_var ); independent = VNAMEVNAME ( i_var[i] ); IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTECALL EXECUTE ( (CATSCATS('%('%NRSTRNRSTR('(' ,'%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 ,")" , ")" ) );,")" , ")" ) ); ENDEND; RUNRUN;%MEND callexecute;

%MACRO callexecute(arrayvars = ); DATADATA _NULL__NULL_; LENGTH independent $ 32 print_report $3; IFIF 0 THEN SETTHEN SET mydata; ARRAYARRAY i_var (*) &array_vars; DODO i = 1 TO DIMTO DIM ( i_var ); independent = VNAMEVNAME ( i_var[i] ); IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTECALL EXECUTE ( (CATSCATS('%('%NRSTRNRSTR('(' ,'%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 ,")" , ")" ) );,")" , ")" ) ); ENDEND; RUNRUN;%MEND callexecute;

%MACRO callexecute(arrayvars = ); DATADATA _NULL__NULL_; LENGTHLENGTH independent $ 32 print_report $3; IFIF 0 THEN SETTHEN SET mydata; ARRAYARRAY i_var (*) &array_vars; DODO i = 1 TO DIMTO DIM ( i_var ); independent = VNAMEVNAME ( i_var[i] ); IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTECALL EXECUTE ( (CATSCATS('%('%NRSTRNRSTR('(' ,'%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 ,")" , ")" ) );,")" , ")" ) ); ENDEND; RUNRUN;%MEND callexecute;

%MACRO callexecute(arrayvars = ); DATADATA _NULL__NULL_; LENGTHLENGTH independent $ 32 print_report $3; IFIF 0 THEN SETTHEN SET mydata; ARRAYARRAY i_var (*) &array_vars; DODO i = 1 TO DIMTO DIM ( i_var ); independent = VNAMEVNAME ( i_var[i] ); IF i = DIM(i_var) THEN print_report="Yes "; ELSE print_report="No "; CALL EXECUTECALL EXECUTE ( (CATSCATS('%('%NRSTRNRSTR('(' ,'%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 ,")" , ")" ) );,")" , ")" ) ); ENDEND; RUNRUN;%MEND callexecute;

%MACRO callexecute(arrayvars = ); DATADATA _NULL__NULL_; LENGTHLENGTH independent $ 32 print_report $3; IFIF 0 THEN SETTHEN SET mydata; ARRAYARRAY i_var (*) &array_vars; DODO i = 1 TO DIMTO DIM ( i_var ); independent = VNAMEVNAME ( i_var[i] ); IFIF i = DIMDIM(i_var) THENTHEN print_report="Yes "; ELSEELSE print_report="No "; CALL EXECUTECALL EXECUTE ( (CATSCATS('%('%NRSTRNRSTR('(' ,'%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 ,")" , ")" ) );,")" , ")" ) ); ENDEND; RUNRUN;%MEND callexecute;

%MACRO callexecute(arrayvars = ); DATADATA _NULL__NULL_; LENGTHLENGTH independent $ 32 print_report $3; IFIF 0 THEN SETTHEN SET mydata; ARRAYARRAY i_var (*) &array_vars; DODO i = 1 TO DIMTO DIM ( i_var ); independent = VNAMEVNAME ( i_var[i] ); IFIF i = DIMDIM(i_var) THENTHEN print_report="Yes "; ELSEELSE print_report="No "; CALL EXECUTECALL EXECUTE ( (CATSCATS('%('%NRSTRNRSTR('(' ,'%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 ,")" , ")" ) );,")" , ")" ) ); ENDEND; RUNRUN;%MEND callexecute;

%MACROMACRO callexecute(arrayvars = ); DATADATA _NULL__NULL_; LENGTHLENGTH independent $ 32 print_report $3; IFIF 0 THEN SETTHEN SET mydata; ARRAYARRAY i_var (*) &array_vars; DODO i = 1 TO DIMTO DIM ( i_var ); independent = VNAMEVNAME ( i_var[i] ); IFIF i = DIMDIM(i_var) THENTHEN print_report="Yes "; ELSEELSE print_report="No "; CALL EXECUTECALL EXECUTE ( (CATSCATS('%('%NRSTRNRSTR('(' ,'%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 ,")" , ")" ) );,")" , ")" ) ); ENDEND; RUNRUN;%MENDMEND callexecute;

%MACROMACRO callexecute(arrayvars = ); DATADATA _NULL__NULL_; LENGTHLENGTH independent $ 32 print_report $3; IFIF 0 THEN SETTHEN SET mydata; ARRAYARRAY i_var (*) &array_vars; DODO i = 1 TO DIMTO DIM ( i_var ); independent = VNAMEVNAME ( i_var[i] ); IFIF i = DIMDIM(i_var) THENTHEN print_report="Yes "; ELSEELSE print_report="No "; CALL EXECUTECALL EXECUTE ( (CATSCATS('%('%NRSTRNRSTR('(' ,'%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 ,")" , ")" ) );,")" , ")" ) ); ENDEND; RUNRUN;%MENDMEND callexecute;

%MACROMACRO callexecute(arrayvarsarrayvars = ); DATADATA _NULL__NULL_; LENGTHLENGTH independent $ 32 print_report $3; IFIF 0 THEN SETTHEN SET mydata; ARRAYARRAY i_var (*) &array_vars&array_vars; DODO i = 1 TO DIMTO DIM ( i_var ); independent = VNAMEVNAME ( i_var[i] ); IFIF i = DIMDIM(i_var) THENTHEN print_report="Yes "; ELSEELSE print_report="No "; CALL EXECUTECALL EXECUTE ( (CATSCATS('%('%NRSTRNRSTR('(' ,'%supervisor(dataset = mydata','%supervisor(dataset = mydata' ,",response = asthma",",response = asthma" ,",independent = ", ,",independent = ", independentindependent ,",referent = 1",",referent = 1" ,",covariates = @age state race,",covariates = @age state race "" ,",outfile = logistic_summary ",",outfile = logistic_summary " ,",report = ", print_report,",report = ", print_report ,")" , ")" ) );,")" , ")" ) ); ENDEND; RUNRUN;%MENDMEND callexecute;

%MACROMACRO callexecute(arrayvarsarrayvars = ); DATADATA _NULL__NULL_; LENGTHLENGTH independent $ 32 print_report $3; IFIF 0 THEN SETTHEN SET mydata; ARRAYARRAY i_var (*) &array_vars&array_vars; DODO i = 1 TO DIMTO DIM ( i_var ); independent = VNAMEVNAME ( i_var[i] ); IFIF i = DIMDIM(i_var) THENTHEN print_report="Yes "; ELSEELSE print_report="No "; CALL EXECUTECALL EXECUTE ( (CATSCATS('%('%NRSTRNRSTR('(' ,'%supervisor(dataset = mydata','%supervisor(dataset = mydata' ,",response = asthma",",response = asthma" ,",independent = ", ,",independent = ", independentindependent ,",referent = 1",",referent = 1" ,",covariates = @age state race,",covariates = @age state race "" ,",outfile = logistic_summary ",",outfile = logistic_summary " ,",report = ", print_report,",report = ", print_report ,")" , ")" ) );,")" , ")" ) ); ENDEND; RUNRUN;%MENDMEND callexecute;

Farmsize,Farmsize, Milkcows,Milkcows, Tractor,Tractor, GrainyearsGrainyears

%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 )

Ever Diagnosed with asthma Variable Yes No P-Value OR 95% CILabel/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 ReportGenerates a Summary Report

CONCLUSIONCONCLUSION

ODS provides the programmer with a ODS provides the programmer with a

method tomethod to extract and summarize statistics

from SAS procedures.

CONCLUSIONCONCLUSION

When combined with the SAS Macro facilityWhen combined with the SAS Macro facility

summarization of procedural statistics, usingsummarization of procedural statistics, using

ODS, can be automatedODS, can be automated

CONCLUSIONCONCLUSION

………………………………......

Long, S, Heaton, ELong, S, Heaton, E

Using the SAS® DATA Step and PROCUsing the SAS® DATA Step and PROC

SQL to Create SQL to Create Macro ArraysMacro Arrays

Macro ArraysMacro ArraysPaper: 030-2008Paper: 030-2008

Long, S., Park, L. Long, S., Park, L.

Contrasting programming techniques forContrasting programming techniques for

summarizing voluminous SAS® output using thesummarizing voluminous SAS® output using the

SAS Output Delivery System (ODS) SAS Output Delivery System (ODS)

(PROC FREQ as an example)(PROC FREQ as an example)

Macro ArraysMacro ArraysPaper: 013-30 (SUGI 30)Paper: 013-30 (SUGI 30)

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. 

Recommended