The following code creates a table of results for a series of logistic regressions. The resulting table will look like the one shown below. The coefficients for each variable is listed, each coefficient’s standard error is listed below it in parentheses.

As a first step, we need to define a format for the standard errors.
Specifically, we need to tell SAS we want to set the number of decimal places
displayed and put the value of the standard error in a set of parentheses ( "("
and ")" ). The **picture** statement tells SAS we want to create a format for printing
numbers. The **‘ 9.99)’** tells SAS that we would like a number with up to
two decimal places, and that the number should be followed by a ")". The
**(prefix='(‘)** requests that the printed value be prefixed with "(". The
final line instructs SAS that missing values should be shown as blank spaces.

proc format; picture stderrf (round) low-high=' 9.99)' (prefix='(') .=' '; run;

Next we use the output delivery system (ods) to capture the results from
a series of regression models. The persist option allows ods to collect output
from more than one run, otherwise output would be collected only for the first
proc. Once ods is turned on we run a series of models using **proc logistic**.
Below the regression models, we turn ods off (i.e. stop collecting information).

ods output ParameterEstimates (persist) = r; proc logistic data = hsb2 desc; model hon = female; run; proc logistic data = hsb2 desc; model hon = female read; run; proc logistic data = hsb2 desc; model hon = female read math; run; ods output close;

Now the relevant coefficients etc. are stored in a dataset named **r.**

proc print data = r; run;Prob Obs _Proc_ _Run_ Variable DF Estimate StdErr WaldChiSq ChiSq 1 Logistic 1 Intercept 1 -1.4001 0.2632 28.3051 <.0001 2 Logistic 1 FEMALE 1 0.6514 0.3337 3.8107 0.0509 3 Logistic 1 Intercept 1 -9.6033 1.4264 45.3268 <.0001 4 Logistic 1 FEMALE 1 1.1209 0.4081 7.5441 0.0060 5 Logistic 1 READ 1 0.1444 0.0233 38.2785 <.0001 6 Logistic 1 Intercept 1 -13.1266 1.8508 50.3034 <.0001 7 Logistic 1 FEMALE 1 1.1547 0.4341 7.0761 0.0078 8 Logistic 1 READ 1 0.0752 0.0276 7.4436 0.0064 9 Logistic 1 MATH 1 0.1317 0.0325 16.4613 <.0001

Before we can display our output in a table, we will need to add a variable to our
dataset that identifies which model each line in the dataset created by ods is
associated with. The data step below creates a new dataset called **r2** that includes
a new variable **modelnum** which identifies the model each coefficient is associated
with. Below that proc print is used to display the new dataset which contains
the regression output as well as the variable **modelnum**. The **retain**
statement tells SAS that the value of **modelnum** should start out the same
as the value of **modelnum** in the case before it. The **if** statement
changes the value of **modelnum** if the variable called **variable** is
equal to "Intercept" which indicates that output from a new model begins with
that case.

data r2; set r; retain modelnum 0; if variable="Intercept" then modelnum = modelnum + 1; run; proc print data = r2; run;Obs _Proc_ _Run_ Variable DF Estimate StdErr WaldChiSq ChiSq modelnum 1 Logistic 1 Intercept 1 -1.4001 0.2632 28.3051 <.0001 1 2 Logistic 1 FEMALE 1 0.6514 0.3337 3.8107 0.0509 1 3 Logistic 1 Intercept 1 -9.6033 1.4264 45.3268 <.0001 2 4 Logistic 1 FEMALE 1 1.1209 0.4081 7.5441 0.0060 2 5 Logistic 1 READ 1 0.1444 0.0233 38.2785 <.0001 2 6 Logistic 1 Intercept 1 -13.1266 1.8508 50.3034 <.0001 3 7 Logistic 1 FEMALE 1 1.1547 0.4341 7.0761 0.0078 3 8 Logistic 1 READ 1 0.0752 0.0276 7.4436 0.0064 3 9 Logistic 1 MATH 1 0.1317 0.0325 16.4613 <.0001 3

Now we can use **proc tabulate** to print our table. In the table statement, the first word **variable** indicates that the
rows should be defined by the values of the variable of that name. That is, that
there should be one row for each value of **variable**. The code
**estimate =' '*sum=' ' **requests that the sum of the variable **estimate**
be printed (since there is only one value of estimate for each combination of
the variables **variable** and **model**, the sum is just the value
itself). On the line below we do the same with the variable **stderr** except
that ***F=stderrf.** applies the format we created above to the values. This takes care
of defining what goes in the rows of our table. After
the comma (",") we define the columns of our table. The variable name
**modelnum** indicates that there should be one column in the table for each
value of the variable **modelnum**. Throughout the command **=' '** is used
to set the label for the object it follows to blank.

proc tabulate data=r2 noseps; class modelnum variable; var estimate stderr; table variable=''*(estimate =' '*sum=' ' stderr=' '*sum=' '*F=stderrf.), modelnum=' ' / box=[label="Parameter"] rts=15 row=float misstext=' '; run;

## See Also