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

Slides:



Advertisements
Similar presentations
Statistical Techniques I EXST7005 Start here Measures of Dispersion.
Advertisements

A. The Basic Principle We consider the multivariate extension of multiple linear regression – modeling the relationship between m responses Y 1,…,Y m and.
The %LRpowerCorr10 SAS Macro Power Estimation for Logistic Regression Models with Several Predictors of Interest in the Presence of Covariates D. Keith.
Statistical Techniques I EXST7005 Multiple Regression.
Statistical Analysis Professor Lynne Stokes Department of Statistical Science Lecture #19 Analysis of Designs with Random Factor Levels.
Experimental design and analyses of experimental data Lesson 2 Fitting a model to data and estimating its parameters.
Analysis of Variance Compares means to determine if the population distributions are not similar Uses means and confidence intervals much like a t-test.
EPI 809/Spring Probability Distribution of Random Error.
Regression with Autocorrelated Errors U.S. Wine Consumption and Adult Population –
Statistical Analysis Professor Richard F. Gunst Department of Statistical Science Lecture 16 Analysis of Data from Unbalanced Experiments.
Creating Graphs on Saturn GOPTIONS DEVICE = png HTITLE=2 HTEXT=1.5 GSFMODE = replace; PROC REG DATA=agebp; MODEL sbp = age; PLOT sbp*age; RUN; This will.
Some Terms Y =  o +  1 X Regression of Y on X Regress Y on X X called independent variable or predictor variable or covariate or factor Which factors.
Multiple regression analysis
Chapter 11: Inferential methods in Regression and Correlation
Reading – Linear Regression Le (Chapter 8 through 8.1.6) C &S (Chapter 5:F,G,H)
Be humble in our attribute, be loving and varying in our attitude, that is the way to live in heaven.
ANalysis Of VAriance (ANOVA) Comparing > 2 means Frequently applied to experimental data Why not do multiple t-tests? If you want to test H 0 : m 1 = m.
Nemours Biomedical Research Statistics April 2, 2009 Tim Bunnell, Ph.D. & Jobayer Hossain, Ph.D. Nemours Bioinformatics Core Facility.
OLS versus MLE Example YX Here is the data:
WLS for Categorical Data
This Week Continue with linear regression Begin multiple regression –Le 8.2 –C & S 9:A-E Handout: Class examples and assignment 3.
Understanding SAS Data Step Processing Alan C. Elliott stattutorials.com.
Week 3 Topic - Descriptive Procedures Program 3 in course notes Cody & Smith (Chapter 2)
Chapter Outline 5.0 PROC GLM
Topic 28: Unequal Replication in Two-Way ANOVA. Outline Two-way ANOVA with unequal numbers of observations in the cells –Data and model –Regression approach.
1 Experimental Statistics - week 7 Chapter 15: Factorial Models (15.5) Chapter 17: Random Effects Models.
1 Experimental Statistics - week 6 Chapter 15: Randomized Complete Block Design (15.3) Factorial Models (15.5)
 Combines linear regression and ANOVA  Can be used to compare g treatments, after controlling for quantitative factor believed to be related to response.
1 Experimental Statistics - week 4 Chapter 8: 1-factor ANOVA models Using SAS.
1 Experimental Statistics - week 10 Chapter 11: Linear Regression and Correlation.
23-1 Analysis of Covariance (Chapter 16) A procedure for comparing treatment means that incorporates information on a quantitative explanatory variable,
1 Experimental Statistics - week 10 Chapter 11: Linear Regression and Correlation Note: Homework Due Thursday.
6-3 Multiple Regression Estimation of Parameters in Multiple Regression.
Regression Examples. Gas Mileage 1993 SOURCES: Consumer Reports: The 1993 Cars - Annual Auto Issue (April 1993), Yonkers, NY: Consumers Union. PACE New.
Regression For the purposes of this class: –Does Y depend on X? –Does a change in X cause a change in Y? –Can Y be predicted from X? Y= mX + b Predicted.
Testing Multiple Means and the Analysis of Variance (§8.1, 8.2, 8.6) Situations where comparing more than two means is important. The approach to testing.
April 6 Logistic Regression –Estimating probability based on logistic model –Testing differences among multiple groups –Assumptions for model.
Xuhua Xia Polynomial Regression A biologist is interested in the relationship between feeding time and body weight in the males of a mammalian species.
6-1 Introduction To Empirical Models Based on the scatter diagram, it is probably reasonable to assume that the mean of the random variable Y is.
The Completely Randomized Design (§8.3)
March 28, 30 Return exam Analyses of covariance 2-way ANOVA Analyses of binary outcomes.
6-3 Multiple Regression Estimation of Parameters in Multiple Regression.
1 Experimental Statistics - week 14 Multiple Regression – miscellaneous topics.
PSYC 3030 Review Session April 19, Housekeeping Exam: –April 26, 2004 (Monday) –RN 203 –Use pencil, bring calculator & eraser –Make use of your.
Lecture 3 Topic - Descriptive Procedures Programs 3-4 LSB 4:1-4.4; 4:9:4:11; 8:1-8:5; 5:1-5.2.
By: Corey T. Williams 03 May Situation Objective.
Simple Linear Regression. Data available : (X,Y) Goal : To predict the response Y. (i.e. to obtain the fitted response function f(X)) Least Squares Fitting.
Environmental Modeling Basic Testing Methods - Statistics III.
Chapter 17: Formatting Data 1 STAT 541 ©Spring 2012 Imelda Go, John Grego, Jennifer Lasecki and the University of South Carolina.
1 Experimental Statistics - week 12 Chapter 12: Multiple Regression Chapter 13: Variable Selection Model Checking.
1 Experimental Statistics - week 9 Chapter 17: Models with Random Effects Chapter 18: Repeated Measures.
Lesson 8 - Topics Creating SAS datasets from procedures Using ODS and data steps to make reports Using PROC RANK Programs in course notes LSB 4:11;5:3.
Experimental Statistics - week 3
Today: March 7 Data Transformations Rank Tests for Non-Normal data Solutions for Assignment 4.
Customize SAS Output Using ODS Joan Dong. The Output Delivery System (ODS) gives you greater flexibility in generating, storing, and reproducing SAS procedure.
1 Statistics 262: Intermediate Biostatistics Regression Models for longitudinal data: Mixed Models.
1 Experimental Statistics - week 13 Multiple Regression Miscellaneous Topics.
Experimental Statistics - week 9
Chapter 1 Introduction to Statistics. Section 1.1 Fundamental Statistical Concepts.
1 Experimental Statistics - week 8 Chapter 17: Mixed Models Chapter 18: Repeated Measures.
1 Experimental Statistics - week 12 Chapter 11: Linear Regression and Correlation Chapter 12: Multiple Regression.
1 Experimental Statistics - week 11 Chapter 11: Linear Regression and Correlation.
Sports Medicine Example. Background Does Sports Med Fellowship have an impact? Study Design –Compare people with fellowship to those without on ABFM exams.
Today: Feb 28 Reading Data from existing SAS dataset One-way ANOVA
Applied Business Forecasting and Regression Analysis
Confounded Predictors
After ANOVA If your F < F critical: Null not rejected, stop right now!! If your F > F critical: Null rejected, now figure out which of the multiple means.
SAS Essentials How SAS Thinks
Experimental Statistics - Week 4 (Lab)
Presentation transcript:

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

SAS tools for automating the generation of customized reports

Output Delivery System (ODS)

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

Customized Reports Customized Reports

Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Standard Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) Years lived on farm Acres planted crops Customized Reports Customized Reports

Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Standard Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) Years lived on farm Acres planted crops Customized Reports PROC MEANS

Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Standard Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) Years lived on farm Acres planted crops Customized Reports Crude PROC GLM

Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Standard Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) Years lived on farm Acres planted crops Customized Reports Adjusted PROC GLM

Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Standard Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) Years lived on farm Acres planted crops Customized Reports Additional Descriptive Information

ODS ODS Additional Descriptive Information PROC MEANS

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

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

ODS ODS Additional Descriptive Information PROC MEANS Crude PROC GLM AHS43300.sas 09:30 Thursday, February 28, The MEANS Procedure Analysis Variable : years_on_farm Years lived or worked on farm Mean N Std Error Std Dev AHS43300.sas 09:30 Thursday, February 28, Phase 1 Release: P1REL0506 Phase 2 Release: P2REL Phase 3 Release: Interim release P3REL Spouses - Frequencies of Part 3: super-controls The GLM Procedure Number of Observations Read Number of Observations Used AHS43300.sas 09:30 Thursday, February 28, The GLM Procedure Dependent Variable: bmi Body Mass Index Sum of Sum of Source DF Squares Mean Square F Value Pr > F Model <.0001 Error Corrected Total R-Square Coeff Var Root MSE bmi Mean Source DF Type I SS Mean Square F Value Pr > F years_on_farm <.0001 Source DF Type III SS Mean Square F Value Pr > F years_on_farm <.0001 Standard Standard Parameter Estimate Error t Value Pr > |t| Intercept <.0001 years_on_farm <.0001

ODS ODS Additional Descriptive Information PROC MEANS AHS43300.sas 09:30 Thursday, February 28, The MEANS Procedure Analysis Variable : years_on_farm Years lived or worked on farm Mean N Std Error Std Dev Crude PROC GLM AHS43300.sas 09:30 Thursday, February 28, Phase 1 Release: P1REL0506 Phase 2 Release: P2REL Phase 3 Release: Interim release P3REL Spouses - Frequencies of Part 3: super-controls The GLM Procedure Number of Observations Read Number of Observations Used AHS43300.sas 09:30 Thursday, February 28, The GLM Procedure Dependent Variable: bmi Body Mass Index Sum of Sum of Source DF Squares Mean Square F Value Pr > F Model <.0001 Error Corrected Total R-Square Coeff Var Root MSE bmi Mean Source DF Type I SS Mean Square F Value Pr > F years_on_farm <.0001 Source DF Type III SS Mean Square F Value Pr > F years_on_farm <.0001 Standard Standard Parameter Estimate Error t Value Pr > |t| Intercept <.0001 years_on_farm <.0001 Adjusted PROC GLM

ODS ODS Additional Descriptive Information PROC MEANS AHS43300.sas 09:30 Thursday, February 28, The MEANS Procedure Analysis Variable : years_on_farm Years lived or worked on farm Mean N Std Error Std Dev Crude PROC GLM AHS43300.sas 09:30 Thursday, February 28, Phase 1 Release: P1REL0506 Phase 2 Release: P2REL Phase 3 Release: Interim release P3REL Spouses - Frequencies of Part 3: super-controls The GLM Procedure Number of Observations Read Number of Observations Used AHS43300.sas 09:30 Thursday, February 28, The GLM Procedure Dependent Variable: bmi Body Mass Index Sum of Sum of Source DF Squares Mean Square F Value Pr > F Model <.0001 Error Corrected Total R-Square Coeff Var Root MSE bmi Mean Source DF Type I SS Mean Square F Value Pr > F years_on_farm <.0001 Source DF Type III SS Mean Square F Value Pr > F years_on_farm <.0001 Standard Standard Parameter Estimate Error t Value Pr > |t| Intercept <.0001 years_on_farm <.0001 Adjusted PROC GLM AHS43300.sas 09:30 Thursday, February 28, The GLM Procedure Class Level Information Class Level Information Class Levels Values race 5 1) White 2) Black 3) Native American 4) Asian/Pacific Islander 5) Other Islander 5) Other gender 2 1) Male 2) Female Number of Observations Read Number of Observations Used AHS43300.sas 09:30 Thursday, February 28, The GLM Procedure Dependent Variable: bmi Body Mass Index Sum of Sum of Source DF Squares Mean Square F Value Pr > F Model <.0001 Error Corrected Total R-Square Coeff Var Root MSE bmi Mean Source DF Type I SS Mean Square F Value Pr > F race <.0001 gender <.0001 height <.0001 age <.0001 years_on_farm <.0001 Source DF Type III SS Mean Square F Value Pr > F race <.0001 gender <.0001 height <.0001 age <.0001 years_on_farm <.0001

ODS ODS Additional Descriptive Information PROC MEANS Crude PROC GLM AHS43300.sas 09:30 Thursday, February 28, Phase 1 Release: P1REL0506 Phase 2 Release: P2REL Phase 3 Release: Interim release P3REL Spouses - Frequencies of Part 3: super-controls The GLM Procedure Number of Observations Read Number of Observations Used AHS43300.sas 09:30 Thursday, February 28, The GLM Procedure Dependent Variable: bmi Body Mass Index Sum of Sum of Source DF Squares Mean Square F Value Pr > F Model <.0001 Error Corrected Total R-Square Coeff Var Root MSE bmi Mean Source DF Type I SS Mean Square F Value Pr > F years_on_farm <.0001 Source DF Type III SS Mean Square F Value Pr > F years_on_farm <.0001 Standard Standard Parameter Estimate Error t Value Pr > |t| Intercept <.0001 years_on_farm <.0001 Adjusted PROC GLM AHS43300.sas 09:30 Thursday, February 28, The GLM Procedure Class Level Information Class Level Information Class Levels Values race 5 1) White 2) Black 3) Native American 4) Asian/Pacific Islander 5) Other Islander 5) Other gender 2 1) Male 2) Female Number of Observations Read Number of Observations Used AHS43300.sas 09:30 Thursday, February 28, The GLM Procedure Dependent Variable: bmi Body Mass Index Sum of Sum of Source DF Squares Mean Square F Value Pr > F Model <.0001 Error Corrected Total R-Square Coeff Var Root MSE bmi Mean Source DF Type I SS Mean Square F Value Pr > F race <.0001 gender <.0001 height <.0001 age <.0001 years_on_farm <.0001 Source DF Type III SS Mean Square F Value Pr > F race <.0001 gender <.0001 height <.0001 age <.0001 years_on_farm <.0001 Data set

ODS ODS Additional Descriptive Information PROC MEANS Crude PROC GLM Adjusted PROC GLM AHS43300.sas 09:30 Thursday, February 28, The GLM Procedure Class Level Information Class Level Information Class Levels Values race 5 1) White 2) Black 3) Native American 4) Asian/Pacific Islander 5) Other Islander 5) Other gender 2 1) Male 2) Female Number of Observations Read Number of Observations Used AHS43300.sas 09:30 Thursday, February 28, The GLM Procedure Dependent Variable: bmi Body Mass Index Sum of Sum of Source DF Squares Mean Square F Value Pr > F Model <.0001 Error Corrected Total R-Square Coeff Var Root MSE bmi Mean Source DF Type I SS Mean Square F Value Pr > F race <.0001 gender <.0001 height <.0001 age <.0001 years_on_farm <.0001 Source DF Type III SS Mean Square F Value Pr > F race <.0001 gender <.0001 height <.0001 age <.0001 years_on_farm <.0001 Data set

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Initialize the Base Data Set

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

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

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

Initialize the Base Data Set %MACRO %MACRO initbase;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

PROC MEANS Rename the Variables PROC CONTENTS(abbreviated) # Variable Type Len Format Label 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 ODS OUTPUT ODS OUTPUT summary=summary_means; (DROP=bmi:) RENAME=(vname_bmi = response_var label_bmi = response_label vname_years_on_farm = key_var label_years_on_farm = key_label years_on_farm_mean = mean years_on_farm_n = n years_on_farm_stderr= stderror years_on_farm_stddev= stddev )) ; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm bmi; VAR years_on_farm bmi; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE; ODS OUTPUT ODS OUTPUT summary=summary_means; (DROP=bmi:) RENAME=(vname_bmi = response_var label_bmi = response_label vname_years_on_farm = key_var label_years_on_farm = key_label years_on_farm_mean = mean years_on_farm_n = n years_on_farm_stderr= stderror years_on_farm_stddev= stddev )) ; PROC MEANS DATA MEAN N STDERR STD; PROC MEANS DATA = mydata MEAN N STDERR STD; VAR years_on_farm bmi; VAR years_on_farm bmi; RUN; ODS OUTPUT CLOSE ODS OUTPUT CLOSE;

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

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

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

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

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

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

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

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

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

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

Create a Data Set with Crude Model Estimates And Standard Errors

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

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

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

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

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

PROC PRINT of the Data Set SUMMARY_GLM Obs Dependent Parameter Estimate StdErr tValue Probt 1 bmi Intercept < bmi years_on_farm <.0001

PROC PRINT of the Data Set SUMMARY_GLM Remove Unwanted information Obs Dependent Parameter Estimate StdErr tValue Probt 1 bmi Intercept < bmi years_on_farm <.0001

PROC PRINT of the Data Set SUMMARY_GLM Remove Unwanted information Obs Parameter Estimate StdErr 1 Intercept years_on_farm

PROC PRINT of the Data Set SUMMARY_GLM Keep Only the Row for years_on_farm Obs Parameter Estimate StdErr 1 Intercept years_on_farm

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

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

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

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

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

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

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

Create a Data Set with Adjusted Model Estimates And Standard Errors

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

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

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

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

PROC PRINT of the Data Set SUMMARY_GLM Obs Dependent Parameter Estimate StdErr tValue Probt 1 bmi Intercept < bmi age < bmi height < bmi race < bmi gender < bmi years_on_farm <.0001

PROC PRINT of the Data Set SUMMARY_GLM Obs Parameter Estimate StdErr 1 Intercept age height race gender years_on_farm

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

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

Two Versions of SUMMARY_GLM Obs key_var Estimate StdErr 6 years_on_farm

Adjusted_ Adjusted_ Obs key_var Estimate StdErr 6 years_on_farm SUMMARY_CRUDE_GLMSUMMARY_ADJUSTED_GLM

Crude_ Crude_ Obs key_var Estimate StdErr 2 years_on_farm Adjusted_ Adjusted_ Obs key_var Estimate StdErr 6 years_on_farm SUMMARY_CRUDE_GLMSUMMARY_ADJUSTED_GLM

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

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

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

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

Crude_ Crude_ Obs key_var Estimate StdErr 2 years_on_farm Adjusted_ Adjusted_ Obs key_var Estimate StdErr 6 years_on_farm SUMMARY_CRUDE_GLMSUMMARY_ADJUSTED_GLM

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

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

Crude_ Crude_ key_var Estimate StdErr years_on_farm Adjusted_ Adjusted_ key_var Estimate StdErr years_on_farm SUMMARY_MEANSSUMMARY_CRUDE_GLMSUMMARY_ADJUSTED_GLM

Crude_ Crude_ key_var Estimate StdErr years_on_farm Adjusted_ Adjusted_ key_var Estimate StdErr years_on_farm SUMMARY_MEANSSUMMARY_CRUDE_GLMSUMMARY_ADJUSTED_GLM key_var response_var mean n stderr stddev years_on_farm bmi

Crude_ Crude_ key_var Estimate StdErr years_on_farm Adjusted_ Adjusted_ key_var Estimate StdErr years_on_farm SUMMARY_MEANSSUMMARY_CRUDE_GLMSUMMARY_ADJUSTED_GLM key_var response_var mean n stderr stddev years_on_farm bmi

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Three secondary main tasks which support these primary tasks.

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

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

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

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

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

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

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

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

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

SPLIT( ) Macro Module No SAS code is generated.

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

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

SPLIT( ) Macro Function Co-variables to appear in the adjusted PROC GLM race gender race gender

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

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

SPLIT( ) Macro Function race gender

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

SPLIT( ) Macro Function race gender %LET continuous_vars = height age; %LET class_vars = race gender;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Crude_ Crude_ key_var Estimate StdErr years_on_farm Adjusted_ Adjusted_ key_var Estimate StdErr years_on_farm SUMMARY_MEANSSUMMARY_CRUDE_GLMSUMMARY_ADJUSTED_GLM key_var response_var mean n stderr stddev years_on_farm bmi

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Produce the Following Report Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Std Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) Years lived on farm Acres planted crops

Produce the Following Report Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Std Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) Years lived on farm Acres planted crops (a) PROC MEANS

Produce the Following Report Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Std Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) Years lived on farm Acres planted crops (a)PROC MEANS (b)Crude PROC GLM

Produce the Following Report Response Variable = Body Mass Index Class Covariates = race gender Continuous Covariates = age height Independent Mean Std Model Parameter Estimates Variable Error N Crude SE Adjusted SE (a) (a) (a) (b) (b) (c) (c) Years lived on farm Acres planted crops (a)PROC MEANS (b)Crude PROC GLM (c)Adjusted PROC GLM

Flexibility of the Design

Change from a Linear to a Logistic Regression Analysis

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

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

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

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

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

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

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

INITBASE( )

PROCFREQ( ) Macro Module

Produce a dataset of counts & percentages

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

The FREQ Procedure Table of DaysMix by asthma DaysMix(Average days per year mixed pesticides) asthma (Ever Diagnosed with asthma) Frequency‚ Percent ‚ Row Pct ‚ Col Pct ‚No ‚Yes ‚ Total ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ None ‚ 6658 ‚ 346 ‚ 7004 ‚ ‚ 1.98 ‚ ‚ ‚ 4.94 ‚ ‚ ‚ ‚ ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ 1-90 Days‚ 6358 ‚ 278 ‚ 6636 ‚ ‚ 1.59 ‚ ‚ ‚ 4.19 ‚ ‚ ‚ ‚ ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ > 90 Days‚ 3697 ‚ 113 ‚ 3810 ‚ ‚ 0.65 ‚ ‚ ‚ 2.97 ‚ ‚ ‚ ‚ ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ Total Frequency Missing = 4945

The FREQ Procedure Table of DaysMix by asthma DaysMix(Average days per year mixed pesticides) asthma (Ever Diagnosed with asthma) Frequency‚ Percent ‚ Row Pct ‚ Col Pct ‚No ‚Yes ‚ Total ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ None ‚ 6658 ‚ 346 ‚ 7004 ‚ ‚ 1.98 ‚ ‚ ‚ 4.94 ‚ ‚ ‚ ‚ ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ Days‚ 6358 ‚ 278 ‚ 6636 ‚ ‚ 1.59 ‚ ‚ ‚ 4.19 ‚ ‚ ‚ ‚ ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ > 90 Days‚ 3697 ‚ 113 ‚ 3810 ‚ ‚ 0.65 ‚ ‚ ‚ 2.97 ‚ ‚ ‚ ‚ ƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ Total Frequency Missing = 4945

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

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

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

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

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

Row Col Obs DaysMix asthma _type_ Frequency Percent Percent Percent Missing None No None Yes None Days No Days Yes Days > 90 Days No > 90 Days Yes > 90 Days No Yes PROCFREQ( )

Row Col Obs DaysMix asthma _type_ Frequency Percent Percent Percent Missing None No None Yes None Days No Days Yes Days > 90 Days No > 90 Days Yes > 90 Days No Yes PROCFREQ( )

Row Col Obs DaysMix asthma _type_ Frequency Percent Percent Percent Missing None No None Yes None Days No Days Yes Days > 90 Days No > 90 Days Yes > 90 Days No Yes

PROCFREQ( ) Row Col Obs DaysMix asthma _type_ Frequency Percent Percent Percent Missing None No None Yes None Days No Days Yes Days > 90 Days No > 90 Days Yes > 90 Days No Yes

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

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

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

PROCFREQ( ) Row Col Obs DaysMix asthma _type_ Frequency Percent Percent Percent Missing None None No None None Yes None Days Days No Days Days Yes Days > 90 Days > 90 Days No > 90 Days > 90 Days Yes > 90 Days No Yes

PROCFREQ( ) Row Col Obs Key_Value asthm a _type_ Frequency Percent Percent Percent Missing No Yes None N o Yes Days No Yes > 90 Days No Yes

Obs Key_Value asthma _type_ N_Col1 N_Col2 P_Col1 P_Col No Yes None No Yes Days No Yes > 90 Days No Yes PROCFREQ( )

The CONTENTS Procedure Data Set Name WORK.SUMMARY_FREQ Observations 3 Member Type DATA Variables 14 # Variable Type Len Format Label 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( )

PROCLOGISTIC( )

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Produces the Following Report Class Covariates = state race Continuous Covariates = age Ever Diagnosed with asthma Variable Yes No P-Value OR 95% CI Label/Format N % N % Crude Adjusted Adjusted ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Average days mixed pesticides None days > 90 days <

Create an Iteration Macro

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

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

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

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

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

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

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

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

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

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

Ever Diagnosed with asthma Variable Yes No P-Value OR 95% CI Label/Format N % N % Crude Adjusted Adjusted ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Size of Farm No Farm < 500 acres acres < Frequency of Milking Cows Never Monthly Weekly Daily < Frequency of Tractor Use Never Monthly Weekly Daily Years Grown Grain None < 5 years years years years Generates a Summary Report

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

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

CONCLUSION ………………...

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

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

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