384
Adventures in ODS: Adventures in ODS: Producing Customized Producing Customized Reports Reports Using Output from Multiple Using Output from Multiple SAS® Procedures SAS® Procedures Stuart Long ([email protected] ) Westat, Durham, NC Jeff Abolafia, Rho Inc, Chapel Hill, NC Lawrence Park, Chapel Hill, NC

Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long ([email protected]) Westat, Durham, [email protected]

Embed Size (px)

Citation preview

Page 1: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

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

Stuart Long ([email protected]) Westat, Durham, NC

Jeff Abolafia, Rho Inc, Chapel Hill, NC

Lawrence Park, Chapel Hill, NC

Page 2: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 3: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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)

Page 4: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 5: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

Customized ReportsCustomized Reports

Page 6: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 7: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 8: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 9: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 10: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 11: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

ODSODSAdditional Descriptive Information

PROCMEANS

Page 12: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 13: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 14: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 15: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 16: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 17: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 18: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 19: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

ODSODSAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

Data set Data set Data set

Page 20: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

ODSODSAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

CompositeData set

Page 21: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

CompositeData set

Page 22: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

Data set Data set Data set

CompositeData set

Page 23: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

CompositeData set

Page 24: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

Data set Data set Data set

CompositeData set

Page 25: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

CompositeData set

Page 26: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

Data set Data set Data set

CompositeData set

Page 27: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

CompositeData set

Page 28: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

Data set Data set Data set

CompositeData set

Page 29: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

CompositeData set

Page 30: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

Data set Data set Data set

CompositeData set

Page 31: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SAS Macro FacilitySAS Macro FacilityAdditional Descriptive InformationPROCMEANS

CrudePROCGLM

AdjustedPROCGLM

CompositeData set

Page 32: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

The programmer must identify the mainThe programmer must identify the main

tasks required to complete this analysistasks required to complete this analysis

Page 33: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 34: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 35: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 36: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 37: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 38: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 39: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 40: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 41: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 42: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 43: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 44: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

Initialize the Base Data SetInitialize the Base Data Set

Page 45: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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.

Page 46: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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.

Page 47: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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.

Page 48: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

Initialize the Base Data SetInitialize the Base Data Set

%%MACROMACRO initbase;%%MACROMACRO initbase;

Page 49: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

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

Initialize the Base Data SetInitialize the Base Data Set

Page 50: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

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

AssignAssign AttributesAttributes toto UnitializedUnitialized VariablesVariables

Page 51: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

AssignAssign AttributesAttributes toto UnitializedUnitialized VariablesVariables

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

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

Page 52: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 53: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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"

Page 54: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 55: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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"

Page 56: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 57: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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"

Page 58: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 59: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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"

Page 60: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 61: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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"

Page 62: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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"

Page 63: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 64: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 65: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 66: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 67: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 68: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 69: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 70: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 71: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 72: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 73: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 74: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 75: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 76: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 77: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 78: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 79: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 80: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 81: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 82: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 83: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Data Set Containing a Mean StatisticData Set Containing a Mean Statistic

Page 84: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 85: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 86: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 87: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 88: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 89: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 90: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

• 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

Page 91: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

• 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

Page 92: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

• 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

Page 93: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

• 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

Page 94: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

• 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

Page 95: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

• 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

Page 96: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

• 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

Page 97: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

• 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

Page 98: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 99: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 100: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 101: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 102: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 103: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 104: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 105: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 106: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 107: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 108: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 109: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 110: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 111: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 112: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 113: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 114: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 115: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 116: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 117: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Estimates And Standard ErrorsEstimates And Standard Errors

Page 118: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 119: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 120: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 121: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

%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

Page 122: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

%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

Page 123: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 124: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 125: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 126: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 127: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 128: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 129: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 130: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 131: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 132: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 133: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 134: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Estimates And Standard ErrorsEstimates And Standard Errors

Page 135: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 136: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 137: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 138: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 139: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 140: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 141: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 142: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 143: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

Two Versions of Two Versions of

SUMMARY_GLM SUMMARY_GLM

Obs key_var Estimate StdErr

6 years_on_farm 0.0139 0.0019

Page 144: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

Adjusted_ Adjusted_ Obs key_var Estimate StdErr

6 years_on_farm 0.0139 0.0019

SUMMARY_CRUDE_GLM

SUMMARY_ADJUSTED_GLM SUMMARY_ADJUSTED_GLM

Page 145: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 146: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 147: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 148: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 149: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 150: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 151: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 152: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 153: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 154: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 155: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 156: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SUMMARYSET( ) macro moduleSUMMARYSET( ) macro module

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

Page 157: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

%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

Page 158: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

%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

Page 159: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

%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

Page 160: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

%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

Page 161: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

%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

Page 162: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

%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

Page 163: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

%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

Page 164: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

%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

Page 165: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 166: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 167: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 168: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 169: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 170: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

%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

Page 171: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

  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

Page 172: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

  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

Page 173: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

      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

Page 174: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

          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

Page 175: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

            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

Page 176: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

      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

Page 177: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 178: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 179: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 180: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 181: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 182: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 183: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 184: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 185: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 186: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 187: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 188: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 189: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 190: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 191: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 192: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 193: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 194: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 195: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 196: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 197: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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.

Page 198: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 199: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 200: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 201: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 202: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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.

Page 203: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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.

Page 204: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 205: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 206: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 207: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SPLIT( ) Macro ModuleSPLIT( ) Macro Module

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

Page 208: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SPLIT( ) Macro ModuleSPLIT( ) Macro Module

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

Page 209: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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.

Page 210: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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.

Page 211: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 212: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 213: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 214: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SPLIT( ) Macro FunctionSPLIT( ) Macro Function

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

Page 215: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 216: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 217: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 218: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 219: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 220: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

ANALYSISSET( ) Macro ModuleANALYSISSET( ) Macro Module

Create an analysis dataset that can be

uniformly processed by all three procedures

Page 221: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 222: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 223: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 224: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 225: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 226: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 227: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 228: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 229: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 230: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 231: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 232: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 233: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 234: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 235: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 236: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SUPERVISOR( )SUPERVISOR( )

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

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

Page 237: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SUPERVISOR( )SUPERVISOR( )

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

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

Page 238: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SUPERVISOR( )SUPERVISOR( )

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

%LOCALLOCAL echeck;

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

%LOCALLOCAL echeck;

Page 239: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 240: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 241: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 242: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 243: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 244: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SUPERVISOR( )SUPERVISOR( )

report = );

%LOCALLOCAL echeck;

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

report = );

%LOCALLOCAL echeck;

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

Page 245: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SUPERVISOR( )SUPERVISOR( )

%LOCALLOCAL echeck;

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

%LOCALLOCAL echeck;

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

Page 246: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SUPERVISOR( )SUPERVISOR( )

%LOCALLOCAL echeck;

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

%LOCALLOCAL echeck;

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

Page 247: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 248: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 249: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 250: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 251: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 252: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 253: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 254: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 255: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 256: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 257: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 258: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 259: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 260: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 261: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 262: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SUPERVISOR( )SUPERVISOR( )

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

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

Page 263: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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=@);

Page 264: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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=@);

Page 265: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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=@);

Page 266: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 267: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 268: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 269: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 270: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 271: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 272: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 273: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 274: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 275: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 276: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 277: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SUPERVISOR( )SUPERVISOR( )

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

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

Page 278: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SUPERVISOR( )SUPERVISOR( )

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

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

Page 279: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 280: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 281: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 282: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 283: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 284: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 285: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 286: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 287: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 288: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 289: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 290: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 291: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 292: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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)

Page 293: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 294: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 295: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 296: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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)

Page 297: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 298: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 299: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 300: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 301: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

Flexibility of the DesignFlexibility of the Design

Page 302: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

Flexibility of the DesignFlexibility of the Design

Change from a Linear to a Logistic Regression AnalysisChange from a Linear to a Logistic Regression Analysis

Page 303: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 304: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

Five Main ChangesFive Main Changes

Change from Analysis of Variance to Logistic Regression

Alter the Continuous Independent Variable to Categorical

Page 305: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

Five Main ChangesFive Main Changes

1.1. Adjust BASE data set to handle the new analysisAdjust BASE data set to handle the new analysis

Page 306: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 307: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 308: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 309: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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)

Page 310: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

INITBASE( )INITBASE( )

Page 311: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

PROCFREQ( ) Macro ModulePROCFREQ( ) Macro Module

Page 312: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

PROCFREQ( ) Macro ModulePROCFREQ( ) Macro Module

Produce a dataset of counts & percentagesProduce a dataset of counts & percentages

Page 313: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

PROCFREQ( ) Macro ModulePROCFREQ( ) Macro Module

Produce a dataset of counts & percentagesProduce a dataset of counts & percentagesPROC FREQPROC FREQ

Page 314: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 315: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 316: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 317: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 318: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 319: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 320: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 321: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 322: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 323: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 324: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 325: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 326: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 327: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 328: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 329: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 330: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 331: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 332: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

PROCLOGISTIC( )PROCLOGISTIC( )

Page 333: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 334: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 335: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 336: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 337: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 338: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 339: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 340: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 341: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 342: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 343: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 344: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 345: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 346: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 347: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 348: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 349: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 350: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SUPERVISOR( )SUPERVISOR( )

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

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

Page 351: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

SUPERVISOR( )SUPERVISOR( )

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

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

Page 352: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 353: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 354: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 355: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 356: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 357: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 358: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 359: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 360: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 361: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 362: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 363: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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;

Page 364: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 365: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 366: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

Create an Iteration MacroCreate an Iteration Macro

Page 367: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 368: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 369: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 370: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 371: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 372: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 373: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 374: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 375: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 376: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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 )

Page 377: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 378: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

CONCLUSIONCONCLUSION

ODS provides the programmer with a ODS provides the programmer with a

method tomethod to extract and summarize statistics

from SAS procedures.

Page 379: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 380: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

CONCLUSIONCONCLUSION

………………………………......

Page 381: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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

Page 382: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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)

Page 383: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov
Page 384: Adventures in ODS: Producing Customized Reports Using Output from Multiple SAS® Procedures Stuart Long (long3@niehs.nih.gov) Westat, Durham, NClong3@niehs.nih.gov

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.