Home > Reporting > Customizable tables in Stata 17, part 7: Saving and using custom styles and labels

Customizable tables in Stata 17, part 7: Saving and using custom styles and labels

In Customizable tables in Stata 17, part 5, I showed you how to use the new and improved table command to create a table of results from a logistic regression model. We are likely to create many more tables of regression results, and we will probably use the same style and labels. In this post, I will show you how to save your styles and labels so that you can use them to format future tables. I will use the Microsoft Word document that we created in part 5 as our goal.


Create the basic table

Let’s begin by typing webuse nhanes2l to open the NHANES dataset. Then we will use table to create a basic table for a logistic regression model for the binary outcome highbp. The table includes the odds ratios, standard errors, z statistics, p-values, and confidence intervals. Note that I have used Stata’s factor-variable notation in the example below to include the main effect of the continuous variable age, the main effects of the categorical variables sex and diabetes, and the interaction of age and sex.

. webuse nhanes2l
(Second National Health and Nutrition Examination Survey)

. table () (command result),                                   
>           command(_r_b _r_se _r_z _r_p _r_ci                 
>                   : logistic highbp c.age##i.sex i.diabetes)

                             |                logistic highbp c.age##i.sex i.diabetes
                             |  Coefficient   Std. error        z   p-value          95% CI
Age (years)                  |     1.034281     .0018566    18.78     0.000   1.030648    1.037926
Sex=Male                     |            1            0
Sex=Female                   |     .1549363     .0223461   -12.93     0.000   .1167849    .2055511
Sex=Male # Age (years)       |            1            0
Sex=Female # Age (years)     |     1.028856     .0027958    10.47     0.000   1.023391    1.034351
Diabetes status=Not diabetic |            1            0
Diabetes status=Diabetic     |     1.521011      .154103     4.14     0.000   1.247073    1.855124
Intercept                    |     .1730928     .0157789   -19.24     0.000    .144772    .2069537

Create and save a custom style

Let’s type collect clear to clear any collections from Stata’s memory.

. collect clear

Then we can use the same collect style commands that we used to format our table in part 5. I have included comments in the code block below to remind us of the purpose of each line.

collect style showbase off
collect style row stack, delimiter(" x ") nobinder
collect style cell border_block, border(right, pattern(nil))
collect style cell result[_r_b _r_se _r_ci], nformat(%8.2f)
collect style cell result[_r_p], nformat(%5.4f)
collect style cell result[_r_ci], sformat("[%s]") cidelimiter(,)
collect style header command, level(hide)

Finally, we can type collect style save to save this style to a file named MyLogitStyle.stjson.

. collect style save MyLogitStyle, replace
(style from mylogit saved to file MyLogitStyle.stjson)

Create and save level labels

We can also save custom level labels. The coefficients in our logistic regression output are actually odds ratios. In part 5, we used collect label levels to change the label for the level _r_b in the dimension result from “Coefficient” to “Odds Ratio”.

collect label levels result _r_b "Odds Ratio", modify

We can use collect label save to save our custom level label to a file named MyLogitLabels.stjson.

. collect label save MyLogitLabels, replace
(labels from mylogit saved to file MyLogitLabels.stjson)

Using our saved styles and labels

We can apply our style and labels to a table using the style() and label() options when we define our table. If you are in the same directory where you just saved the labels and styles, you can refer to them simply by their names. However, if you are in a different directory you can specify the full path.

. table () (command result),                                   
>          command(_r_b _r_se _r_z _r_p _r_ci                  
>                  : logistic highbp c.age##i.sex i.diabetes)  
>          style(c:\MyFolder\MyLogitStyle.stjson, override)    
>          label(c:\MyFolder\MyLogitLabels.stjson)

                   Odds Ratio   Std. error        z   p-value        95% CI
Age (years)              1.03         0.00    18.78    0.0000   [1.03,    1.04]
  Female                 0.15         0.02   -12.93    0.0000   [0.12,    0.21]
Sex x Age (years)
  Female                 1.03         0.00    10.47    0.0000   [1.02,    1.03]
Diabetes status
  Diabetic               1.52         0.15     4.14    0.0000   [1.25,    1.86]
Intercept                0.17         0.02   -19.24    0.0000   [0.14,    0.21]

Or, even better, we can save our styles and labels where we can use them anytime. We can make our styles and labels automatically available by storing the files in our personal ado-directory. You can type sysdir to locate your personal ado-directory.

. sysdir
   STATA:  C:\Program Files\Stata17\
    BASE:  C:\Program Files\Stata17\ado\base\
    SITE:  C:\Program Files\Stata17\ado\site\
    PLUS:  C:\Users\ChuckStata\ado\plus\
PERSONAL:  c:\ado\personal\
OLDPLACE:  c:\ado\

My personal ado-directory is c:\ado\personal\, so I will save my style and label files in that folder.

. collect style save "c:\ado\personal\MyLogitStyle", replace
(style from mylogit saved to file c:\ado\personal\MyLogitStyle.stjson)

. collect label save "c:\ado\personal\MyLogitLabels", replace
(labels from mylogit saved to file c:\ado\personal\MyLogitLabels.stjson)

Now I can use MyLogitStyle and MyLogitLabels anytime to format other tables.

Using our saved styles and labels with other tables

Let’s clear Stata’s memory and use the Hosmer and Lemeshow low birthweight dataset. We are interested in predictors of low infant birthweight (low), defined as birthweight less than 2,500 grams.

. webuse lbw, clear
(Hosmer & Lemeshow data)

. describe low age smoke ht

Variable      Storage   Display    Value
    name         type    format    label      Variable label
low             byte    %8.0g                 Birthweight<2500g
age             byte    %8.0g                 Age of mother
smoke           byte    %9.0g      smoke      Smoked during pregnancy
ht              byte    %8.0g                 Has history of hypertension

Next let’s create a table for the output of a logistic regression command for the binary dependent variable low. We can format our table using MyLogitStyle and MyLogitLabels.

. table () (command result),                          
>          command(_r_b _r_se _r_z _r_p _r_ci         
>                  : logistic low c.age##i.smoke ht)  
>          style(MyLogitStyle, override)              
>          label(MyLogitLabels)

                                         Odds Ratio   Std. error       z   p-value        95% CI
Age of mother                                  0.92         0.04   -1.85    0.0646   [0.84,    1.01]
Smoked during pregnancy
  Smoker                                       0.36         0.56   -0.66    0.5082   [0.02,    7.37]
Smoked during pregnancy x Age of mother
  Smoker                                       1.08         0.07    1.14    0.2542   [0.95,    1.23]
Has history of hypertension                    3.47         2.15    2.00    0.0456   [1.02,   11.72]
Intercept                                      2.16         2.27    0.73    0.4642   [0.28,   16.90]

The overall format of our table looks like we expected. But the variable labels are too long for our table.

The row labels in our table are stored in the dimension colname. We can type collect label list to view the level labels.

. collect label list colname, all

  Collection: Table
   Dimension: colname
       Label: Covariate names and column names
Level labels:
       _cons  Intercept
         age  Age of mother
          ht  Has history of hypertension
       smoke  Smoked during pregnancy

Let’s use collect label levels to modify the labels of the levels age, ht, and smoke.

. collect label levels colname age "Age", modify

. collect label levels colname ht "Hypertension", modify

. collect label levels colname smoke "Smoke", modify

Now we can type collect preview to check our work.

. collect preview

              Odds Ratio   Std. error       z   p-value        95% CI
Age                 0.92         0.04   -1.85    0.0646   [0.84,    1.01]
  Smoker            0.36         0.56   -0.66    0.5082   [0.02,    7.37]
Smoke x Age
  Smoker            1.08         0.07    1.14    0.2542   [0.95,    1.23]
Hypertension        3.47         2.15    2.00    0.0456   [1.02,   11.72]
Intercept           2.16         2.27    0.73    0.4642   [0.28,   16.90]

Note that we still used collect to customize our table, even though we did most of the work with our saved styles and labels.


In this post, we learned how to use collect style save and collect label save to save our custom styles and labels. We also learned how to apply those custom styles and labels to other tables. Stata has many predefined styles, and you can learn more about them in the manual.

The ability to save and reuse custom styles and labels allows us to streamline and automate our workflow for creating documents. For example, many people in academic settings submit manuscripts for publication in academic journals. They can create custom formats and labels that meet each journal’s requirements and apply them to their manuscripts. People in business or government settings may report the same information to different organizations, and they can save custom styles and labels for each report. Investing the time to create custom styles and layouts will pay dividends in saved time later.

This is the final post I had planned for the “Customizable tables in Stata 17” series. My goal was to explain the basics of the new table and collect commands, show you a few useful examples, and demonstrate how you can use these tools to create your own custom tables. I hope I’ve accomplished that goal, and I’ve had so much fun that I would not rule out future posts on this topic!