380 likes | 655 Views
A Set of SAS Macros for Producing Statistical Reports. ®. Greg Grandits, M.S. Ken Svendsen, M.S. Division of Biostatistics University of Minnesota. Example Statistical Report. Result:.
E N D
A Set of SAS Macros for Producing Statistical Reports ® Greg Grandits, M.S. Ken Svendsen, M.S. Division of Biostatistics University of Minnesota
Example Statistical Report Result: 1 2 3 4 5 6 7 8 9 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Number (%) of Selected CVD Events by Treatment Group And Hazard Ratio from Cox Regression Analyses Experimental Standard Cox Regression Summary Endpoint N % N % HR L95%U95%P-Val 1.02 0.88 1.18 0.771 0.82 0.65 1.03 0.089 1.15 0.90 1.48 0.265 1.09 0.87 1.37 0.471 1.05 0.95 1.16 0.307 1.01 0.82 1.26 0.913 0.87 0.66 1.15 0.330 1.09 0.89 1.33 0.389 1.30 1.00 1.69 0.051 1.26 0.67 2.34 0.474 0.81 0.49 1.35 0.426 Primary CVD MI (Fatal/NF) Stroke (Fatal/NF) CVD Death Any CVD Hospitalization Revascularization TIA Angina Heart Failure Hypertension Renal Failure 364 4.5 365 4.4 133 1.6 166 2.0 133 1.6 118 1.4 152 1.9 143 1.7 793 9.7 775 9.3 163 2.0 166 2.0 89 1.1 105 1.3 202 2.5 190 2.3 126 1.5 100 1.2 22 0.3 18 0.2 27 0.3 34 0.4
Goals for Developing Report Macros • Place text anywhere onto page • Macros take care of tedious formatting • Have code that is easy to write and modify • Place several types of statistics from multiple procedures onto a single page • N, means, SDs, etc. • p-values, RRs, regression coefficients, etc.
SAS Tools Needed for Macros • Data step • Put statement • Ability to output statistics from PROCs to SAS datasets • ODS
7 7 7 2X 2X COL 2 COL 3 COL 4 Step 1: Declare Column Widths %report; %colset (25 7 7 2X 7 7 4X 7 7 7 2X 7); Result: 1 2 3 4 5 6 7 8 9 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 7 WIDTH = 25 7 4X 7 7 7 COL 9 COL 5 COL 1 COL 6 COL 7 COL 8
Step 2: Move Text To Page %move (‘Number (%) of Selected CVD Events by Treatment Group’: ‘And Hazard Ratio from Cox Regression Analyses’, col=1-9, line=3L2); Result: 1 2 3 4 5 6 7 8 9 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Number (%) of Selected CVD Events by Treatment Group And Hazard Ratio from Cox Regression Analyses
Step 2: Move Text To Page %move (‘Experimental’ : ’Standard’: ’Cox Regression Summary’, col = 2-3 4-5 6-9, line = 9, u=y); Result: 1 2 3 4 5 6 7 8 9 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Number (%) of Selected CVD Events by Treatment Group And Hazard Ratio from Cox Regression Analyses Experimental Standard Cox Regression Summary
Step 2: Move Text To Page %move (‘Endpoint’, col=1, center=n, line=11, u=y); %move (‘N’:’%’, col=2.5, line=11, u=y); %move (‘HR’:’L95%’:’U95%’:’P-Val’, col=6.9, line=11, u=y); Result: 1 2 3 4 5 6 7 8 9 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Number (%) of Selected CVD Events by Treatment Group And Hazard Ratio from Cox Regression Analyses Experimental Standard Cox Regression Summary Endpoint N % N % HR L95%U95%P-Val
Step 2: Move Text To Page %move (‘Primary CVD’:’MI’:’Stroke’:’CVD Death’:’Any CVD Hospitalization”: ‘Revascularization’:’TIA’:’Angina’:’Heart Failure’:’Hypertension’: ‘Renal Failure’, col=1, center=n, line=14L4 19L7) ; Result: 1 2 3 4 5 6 7 8 9 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Number (%) of Selected CVD Events by Treatment Group And Hazard Ratio from Cox Regression Analyses Experimental Standard Cox Regression Summary Endpoint N % N % HR L95%U95%P-Val Primary CVD MI (Fatal/NF) Stroke (Fatal/NF) CVD Death Any CVD Hospitalization Revascularization TIA Angina Heart Failure Hypertension Renal Failure
Step 3: Move Statistics To Page set out1; %nmove (sum1-sum22, col = 2 4, line = 14L4 19L7, fmt=5.0); %nmove (m1-m22, col = 3 5, fmt=5.1, scaler=100); Result: 1 2 3 4 5 6 7 8 9 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Number (%) of Selected CVD Events by Treatment Group And Hazard Ratio from Cox Regression Analyses Experimental Standard Cox Regression Summary Endpoint N % N % HR L95%U95%P-Val Primary CVD MI (Fatal/NF) Stroke (Fatal/NF) CVD Death Any CVD Hospitalization Revascularization TIA Angina Heart Failure Hypertension Renal Failure 364 4.5 365 4.4 133 1.6 166 2.0 133 1.6 118 1.4 152 1.9 143 1.7 793 9.7 775 9.3 163 2.0 166 2.0 89 1.1 105 1.3 202 2.5 190 2.3 126 1.5 100 1.2 22 0.3 18 0.2 27 0.3 34 0.4
Step 3: Move Cox Regression Statistics set out2; %nmove (r1-r11, L1-L11, u1-u11, col=6.8, fmt=5.2); %nmove (p1-p11, col=9, fmt=6.3); Result: 1 2 3 4 5 6 7 8 9 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Number (%) of Selected CVD Events by Treatment Group And Hazard Ratio from Cox Regression Analyses Experimental Standard Cox Regression Summary Endpoint N % N % HR L95%U95%P-Val 1.02 0.88 1.18 0.771 0.82 0.65 1.03 0.089 1.15 0.90 1.48 0.265 1.09 0.87 1.37 0.471 1.05 0.95 1.16 0.307 1.01 0.82 1.26 0.913 0.87 0.66 1.15 0.330 1.09 0.89 1.33 0.389 1.30 1.00 1.69 0.051 1.26 0.67 2.34 0.474 0.81 0.49 1.35 0.426 Primary CVD MI (Fatal/NF) Stroke (Fatal/NF) CVD Death Any CVD Hospitalization Revascularization TIA Angina Heart Failure Hypertension Renal Failure 364 4.5 365 4.4 133 1.6 166 2.0 133 1.6 118 1.4 152 1.9 143 1.7 793 9.7 775 9.3 163 2.0 166 2.0 89 1.1 105 1.3 202 2.5 190 2.3 126 1.5 100 1.2 22 0.3 18 0.2 27 0.3 34 0.4
Obtaining the Summary Statistics %let evlist = primary mi str cvddth allcvd corevas tia angina chf acchyp renalf ; %breakdn (data=temp, class= group 2, var=&evlist, out=out1) • Computes summary statistics for each variable in var by each level in group • Stores statistics in one observationdataset out1 (M1-M22 contains means)
Obtaining P-values from PROG PHREG %phregp (data=temp, dlist=&evlist, strata=country, tlist=&tmlist, ilist=group, factor=group, out=out2) • Performs PHREG for each variable in dlist with independent variables in ilist • Factor indicates which independent variable(s) statistics are requested • Out names the one observation SAS dataset which contains p-values • P-values are named P1-P11
%breakdn (data=temp, class= group 2, var=&evlist, out=out1); %phregp (data=lifetab, dlist = &evlist, strata=country, tlist= &tmlist, ilist=group, factor=group, out = out2); %report %colset (25 7 7 2X 7 7 4X 7 7 7 2X 7) %move (‘Number (%) of Selected CVD Events by Treatment Group’: ‘And Hazard Ratio from Cox Regression Analyses’, col=1-9, line=3L2) %move (‘Experimental’:’Standard’:’Cox Regression Summary’, col=2-3 4-5 6-9, line=9, u=y) %move (‘Endpoint’, col=1, center=2, line=11, u=y) %move (‘N’: ‘%’, col=2.5, line=11, u=y) %move (‘HR’:’L95%’:’U95%’:’P-Val’, col=6.9, line=11, u=y) %move (‘Primary’:’MI’:’Stroke’:’CVD Death’:’Any CVD Hospitalization’:’Revascularization’: ‘TIA’: ‘Angina’:’Heart Failure’:’Hypertension’:’Renal Failure’, col=1, center=n, line=12L4 19L7) set out1; %nmove (sum1-sum22, col=2 4 , line=14L4 19L7, fmt=5.0) %nmove (m1-m22, col=3 5 , fmt=5.1, scaler=100) set out2; %nmove (r1-r11 L1-L11 u1-u11, col=6.8, line=14L4 19L7, fmt=5.2) %nmove (p1-p11, col=9, fmt=6.3) Complete Program for Example - Assume Data is Ready to Go
Behind the Scenes %move (‘Number (%) of Selected CVD Events by Treatment Group’: ‘And Hazard Ratio from Cox Regression Analyses’, col=1-9, line=3L2) ; Code Generated: PUT #3 @ 19 ‘Number (%) of Selected CVD Events by Treatment Group’; PUT #4 @ 23 ‘And Hazard Ratio from Cox Regression Analyses’;
Behind the Scenes %breakdn (data=temp, class=group 2, var=&evlist, out=out1); Code Generated: PROC MEANS DATA=temp; CLASS group; VAR primary mi str cvddth allcvd corevas tia angina chf acchyp renalf; OUTPUT OUT=out1 N=n1-n11 MEAN=m1-m11 STD=s1-s11 SUM=sum1-sum11 MAX=max1-max11 MIN=min1-min11; *** Further data step to get into one observation dataset *** 22 N’s; n1-n22
Behind the Scenes %phregp (data=temp, dlist=&evlist, strata=country, tlist=&tmlist, ilist=group, factor=group, out=out2) ; Code Generated: ODS output ParamterEstimates (match_all = _est_ persist=proc) = _est_; PROC PHREG DATA=temp; MODEL tprimary*primary(0) = group; PROC PHREG DATA=temp; MODEL tmi*mi(0) = group; . . . more phregs *** More data steps to get desired one observation dataset ***
Statistic Generating Macros STATISTICS OUTPUT MACRO PROC DESCRIPTION OF MACRO breakdn summary N, mean, summary statistics by sdev, etc. level of class variable(s) freqdis summary counts, %s distribution of variable cum. counts, by level of other variable cum %s glmp glm p-values, statistics from ANOVA LS means
Statistic Generating Macros (cont’d.) STATISTICS OUTPUT MACRO PROC DESCRIPTION OF MACRO regp reg p-values, coef. statistics from linear SE, t-stat regression phregp phreg p-values, coef. statistics from HRs, 95% CI proportional hazards model Others: logistp, chisqp, mixedp (All make 1-record datasets)
Report Macros 1. %report Starts new report 2. %colset Defines columns and column widths 3. %move Moves text strings to report page 4. %nmove Moves numeric values from SAS dataset to report page
Summary - Order of a Report • 1 or more statistic generating macros • %report • %colset (define column widths) • %move statements (for text placement) • set statement (bring in data with statistics) • %nmove statements (for statistics placement) [more set/nmove statements]
Making HTML and WORD Tables With minor changes an HTML table can be created which can be imported into Word. Additional features: • Font parameters: type, size, italics, bold, etc. • Table parameters: indenting, cell spacing, etc. • Combine and format multiple statistics in a single column • 45.5 ± 7.3 • 364 (4.5%) • 0.82 (0.65 – 1.03)
%move (‘Number of Patients<br>With Event’, col=2-3, line=9, fontweight=bold) %move (‘Endpoint’, col=1, center=n, line=11, fontstyle=italic fontweight=bold) * This moves the HR and 95% CI to a single column; %nmove (r1-r11 L1-L11, u1-u11, line=14L4 19L7, col=4, combine=y, fmt=5.2 5.2 5.2, fchar=3) Example Calls
Advantages of Using Report Macros • Customized tables, including statistics from multiple procedures • Great for routine reports where only the data is changing (e.g. DSMB report) • No transcription of numbers • Templates can be developed • Journal style tables
Cautionary Note Tables look great but the numbers are wrong ! With freedom comes responsibility – check your program.
How to Get Report Macros Code and Documentation http://www.biostat.umn.edu/~greg-g E-mail (correspondence) grand001@umn.edu
Spotlight on MOVE • Places text onto the report page • Use %move (‘string1’: ‘string2’: …, line=, col=, center=, under=, pat=, mfirst=) • ‘string1’: ‘string2’: … text to be placed on report page • line which lines? • col which columns? • center center text? • under underline text? • pat line skipping patterns • mfirst columns or lines to advance first
MOVE Parameter: Text Strings %move (‘string1’: ‘string2’, line=, col=, center=, under=, pat=, mfirst=) • Text strings are enclosed in quotes separated by colons Example: ‘Men’: ‘Women’: ‘Total’
MOVE Parameters: line and pat %move ( ‘string1’: ‘string2’, line=, col=, center=, under=, pat=, mfirst=) • Line numbers can be given in two ways line = 12 21 23 line = 12L3 (same as 12 13 14) • Pat can be used to skip lines line = 12L3 pat = 1st/1 (will double space) This is the same as line = 12 14 16
MOVE Parameter: col %move ( ‘string1’: ‘string2’, line=, col=, center=, under=, pat= , mfirst=) • Columns can be specified in three ways col = 3 4 8 col = 2.8 (same as 2 3 4 5 6 7 8) col = 2-3 (text moved to the combined column 2 and 3)
MOVE Parameters: center and under %move ( ‘string1’: ‘string2’, line=, col=, center=, under=, pat= , mfirst=) • center=Y for centered text (default) center=N for left justified text • under=Y for underlined text under=N text not underlined (default)
MOVE Parameter: mfirst %move ( ‘string1’: ‘string2’, line=, col=, center=, under=, pat= , mfirst=) • Mfirst=L for lines advancing first (default) Example: %move (‘1’: ‘2’: ‘3’: ‘4’, col=1 2, line=12, mfirst=L) Output: 1 3 2 4 • Mfirst=C for columns advancing first Example: %move (‘1’: ‘2’: ‘3’: ‘4’, col=12, line=1 2, mfirst=c) Output: 1 2 3 4
Spotlight on NMOVE • Places numeric values of variables to the report page • Use %nmove (var1 var2 …, line=, col=, pat=, mfirst=, fmt=, scaler=) • var1 var2 … variables to be placed on report page fmt what format? scaler Number each variable is multiplied by prior to being placed on report page • Parameters line, col, pat, and mfirst are the same as in %move
NMOVE Parameter: Variable Lists %nmove ( var1 var2 …, line=, col=, pat=, mfirst=, fmt=, scaler=) • Variable names can be given in two ways age chol dbp (move values of these variables to report page) M1-M15 (move values of variable M1 through M15 to report page – 15 variables)
NMOVE Parameter: fmt %nmove (var1 var2 …, line=, col=, pat=, mfirst=, fmt=, scaler=) • Formats are specified as number1.number2 number1 width of field number2 number of decimals used
NMOVE Parameter: scaler %nmove (var1 var2 …, line=, col=, pat=, mfirst=, fmt=, scaler=) • Each variable is multiplied by the value specified before placed on report page • Used for converting fractions to percentages, or vice versa Example: scaler=100 (multiplies values by 100)