6  Hierarchies of Models

In this example, we have a large number of models in a hierarchical structure: outcome, birth weight, and two model specifications. This is straightforward if you think through the tags required.

6.1 Setting Up

Load the data with:

clear all
use https://sscc.wisc.edu/sscc/pubs/real_world_tables/reg3

Take a moment to look it over and identify the variable names.

6.2 Run the Models and Collect the Results

Running all the models will be a job for loops. First a loop over the two outcomes (mort6 and mort364) and then a loop over the two birthweight subsamples (if low==0 and if low==1). Then two different models, one without controls and one with (employed will stand in for all the controls). Rather than creating a tag for controls, you’ll create a result level called controls that contains either “Y” or “N”. But you also want to number all the models sequentially, so create a counter i that is incremented after each model.

Call the dimensions to be created outcome, wt, and model. The levels of outcome and wt will be the current values of the macros created by the loops (for example, outcome[`outcome']) and the level of model will be `i'.

Putting this all together:

local model 1
foreach outcome in mort6 mort364 {
    foreach low in 0 1 {
        quietly: collect, tag(outcome[`outcome'] wt[`low'] model[`model']): reg `outcome' nets nicu if low==`low', robust
        collect get controls = "N", tag(outcome[`outcome'] wt[`low'] model[`model'])
        local model = `model' + 1
        quietly: collect, tag(outcome[`outcome'] wt[`low'] controls[Y] model[`model']): reg `outcome' nets nicu employed if low==`low', robust
        collect get controls = "Y", tag(outcome[`outcome'] wt[`low'] model[`model'])
        local model = `model' + 1
    }
}

Now think about the table layout. For rows, you want just nicu and nets from colname, interacted with _r_b and _r_se from result. Then add result[controls N] for the controls row and the observation numbers.

For the columns, outcome is the top level, then wt, then model.

collect layout (colname[nicu nets]#result[_r_b _r_se] result[controls N]) (outcome#wt#model)

Collection: default
      Rows: colname[nicu nets]#result[_r_b _r_se] result[controls N]
   Columns: outcome#wt#model
   Table 1: 8 x 8

------------------------------------------------------------------------------------------------
                       |    mort6    mort6    mort6    mort6  mort364  mort364  mort364  mort364
                       |        0        0        1        1        0        0        1        1
                       |        1        2        3        4        5        6        7        8
-----------------------+------------------------------------------------------------------------
nicu                   |                                                                        
  Coefficient          | .1017549 .1017661 .1258163 .1258681 .1001331  .100117 .1522515 .1523971
  Std. error           | .0119408 .0119413 .0172121 .0172166 .0100596 .0100595 .0174978 .0174984
nets                   |                                                                        
  Coefficient          | .0353459  .035364 .0464465 .0464054 .0464274 .0464015  .052608 .0524925
  Std. error           | .0119412 .0119418 .0171607 .0171645 .0100661 .0100655 .0175333  .017535
controls               |        N        Y        N        Y        N        Y        N        Y
Number of observations |     6922     6922     3078     3078     6922     6922     3078     3078
------------------------------------------------------------------------------------------------

Obviously the appearance needs some work, but this is the table you want.

6.3 Clean Up

The header settings you want can mostly be gotten from the table-reg3 stye.

collect style use table-reg3
collect preview

Collection: default
      Rows: colname[nicu nets]#result[_r_b _r_se] result[controls N]
   Columns: outcome#wt#model
   Table 1: 9 x 8

---------------------------------------------------------------------------------------------
     |                    mort6                                      mort364                 
     |           0                     1                     0                     1         
     |         1          2          3          4          5          6          7          8
-----+---------------------------------------------------------------------------------------
nicu |  .1017549   .1017661   .1258163   .1258681   .1001331    .100117   .1522515   .1523971
     |  .0119408   .0119413   .0172121   .0172166   .0100596   .0100595   .0174978   .0174984
     |                                                                                       
nets |  .0353459    .035364   .0464465   .0464054   .0464274   .0464015    .052608   .0524925
     |  .0119412   .0119418   .0171607   .0171645   .0100661   .0100655   .0175333    .017535
     |                                                                                       
     |         N          Y          N          Y          N          Y          N          Y
     |                                                                                       
     |      6922       6922       3078       3078       6922       6922       3078       3078
---------------------------------------------------------------------------------------------

Removing the level labels from result is good for _r_b and _r_se, but you want them for controls and N.

collect label levels result controls "Controls" N "Number of Observations", modify
collect style header result[controls N], level(label)
collect preview

---------------------------------------------------------------------------------------------------------------
                       |                    mort6                                      mort364                 
                       |           0                     1                     0                     1         
                       |         1          2          3          4          5          6          7          8
-----------------------+---------------------------------------------------------------------------------------
nicu                   |  .1017549   .1017661   .1258163   .1258681   .1001331    .100117   .1522515   .1523971
                       |  .0119408   .0119413   .0172121   .0172166   .0100596   .0100595   .0174978   .0174984
                       |                                                                                       
nets                   |  .0353459    .035364   .0464465   .0464054   .0464274   .0464015    .052608   .0524925
                       |  .0119412   .0119418   .0171607   .0171645   .0100661   .0100655   .0175333    .017535
                       |                                                                                       
Controls               |         N          Y          N          Y          N          Y          N          Y
                       |                                                                                       
Number of Observations |      6922       6922       3078       3078       6922       6922       3078       3078
---------------------------------------------------------------------------------------------------------------

The column headers also need labels. The table needs a title and some notes.

collect label levels colname nicu "Nearest obstetrics in NICU City" nets "Nearest obstetrics in NETS City"
collect label levels outcome mort6 "Mortality 0-6 Days" mort364 "Mortality 0-364 Days"
collect label levels wt 0 "<2500g" 1 ">=2500g"

collect title "Table 3: Effect of the NICU and NETS on mortality"
collect note "Robust standard errors in paretheses"
collect note "*** p<.001; ** p<.01; * p<.05; + p<.1."

collect preview

Table 3: Effect of the NICU and NETS on mortality
------------------------------------------------------------------------------------------------------------------------
                                |              Mortality 0-6 Days                         Mortality 0-364 Days          
                                |         <2500g               >=2500g                <2500g               >=2500g      
                                |         1          2          3          4          5          6          7          8
--------------------------------+---------------------------------------------------------------------------------------
Nearest obstetrics in NICU City |  .1017549   .1017661   .1258163   .1258681   .1001331    .100117   .1522515   .1523971
                                |  .0119408   .0119413   .0172121   .0172166   .0100596   .0100595   .0174978   .0174984
                                |                                                                                       
Nearest obstetrics in NETS City |  .0353459    .035364   .0464465   .0464054   .0464274   .0464015    .052608   .0524925
                                |  .0119412   .0119418   .0171607   .0171645   .0100661   .0100655   .0175333    .017535
                                |                                                                                       
Controls                        |         N          Y          N          Y          N          Y          N          Y
                                |                                                                                       
Number of Observations          |      6922       6922       3078       3078       6922       6922       3078       3078
------------------------------------------------------------------------------------------------------------------------
Robust standard errors in paretheses
*** p<.001; ** p<.01; * p<.05; + p<.1.

You also don’t need so many digits. The easy way is to format everything with three digits, and then override that with zero for the number of observations.

collect style cell, nformat(%8.3f)
collect style cell result[N], nformat(%8.0f)
collect preview

Table 3: Effect of the NICU and NETS on mortality
------------------------------------------------------------------------------------------------
                                |        Mortality 0-6 Days             Mortality 0-364 Days    
                                |      <2500g         >=2500g          <2500g         >=2500g   
                                |      1       2       3       4       5       6       7       8
--------------------------------+---------------------------------------------------------------
Nearest obstetrics in NICU City |  0.102   0.102   0.126   0.126   0.100   0.100   0.152   0.152
                                |  0.012   0.012   0.017   0.017   0.010   0.010   0.017   0.017
                                |                                                               
Nearest obstetrics in NETS City |  0.035   0.035   0.046   0.046   0.046   0.046   0.053   0.052
                                |  0.012   0.012   0.017   0.017   0.010   0.010   0.018   0.018
                                |                                                               
Controls                        |      N       Y       N       Y       N       Y       N       Y
                                |                                                               
Number of Observations          |   6922    6922    3078    3078    6922    6922    3078    3078
------------------------------------------------------------------------------------------------
Robust standard errors in paretheses
*** p<.001; ** p<.01; * p<.05; + p<.1.

Now consider the borders. You can eliminate the border between the row headers and the rest of the table by eliminating right borders:

collect style cell border_block, border(right, pattern(nil))

To add an underline to the outcome headers, use the cell_type dimension to target them specifically.

collect levelsof cell_type

Collection: default
 Dimension: cell_type
    Levels: column-header corner item row-header

Thus you want items tagged with cell_type[column-header] and outcome.

collect style cell cell_type[column-header]#outcome, border(bottom, pattern(solid))
collect preview

Table 3: Effect of the NICU and NETS on mortality
----------------------------------------------------------------------------------------------
                                       Mortality 0-6 Days             Mortality 0-364 Days    
                                --------------------------------------------------------------
                                     <2500g         >=2500g          <2500g         >=2500g   
                                --------------------------------------------------------------
                                     1       2       3       4       5       6       7       8
----------------------------------------------------------------------------------------------
Nearest obstetrics in NICU City  0.102   0.102   0.126   0.126   0.100   0.100   0.152   0.152
                                 0.012   0.012   0.017   0.017   0.010   0.010   0.017   0.017
                                                                                              
Nearest obstetrics in NETS City  0.035   0.035   0.046   0.046   0.046   0.046   0.053   0.052
                                 0.012   0.012   0.017   0.017   0.010   0.010   0.018   0.018
                                                                                              
Controls                             N       Y       N       Y       N       Y       N       Y
                                                                                              
Number of Observations            6922    6922    3078    3078    6922    6922    3078    3078
----------------------------------------------------------------------------------------------
Robust standard errors in paretheses
*** p<.001; ** p<.01; * p<.05; + p<.1.

Unfortunately that also put a border under the birthweight headers. It’s easiest just remove it specifically.

collect style cell cell_type[column-header]#wt, border(bottom, pattern(nil))
collect preview

Table 3: Effect of the NICU and NETS on mortality
----------------------------------------------------------------------------------------------
                                       Mortality 0-6 Days             Mortality 0-364 Days    
                                --------------------------------------------------------------
                                     <2500g         >=2500g          <2500g         >=2500g   
                                     1       2       3       4       5       6       7       8
----------------------------------------------------------------------------------------------
Nearest obstetrics in NICU City  0.102   0.102   0.126   0.126   0.100   0.100   0.152   0.152
                                 0.012   0.012   0.017   0.017   0.010   0.010   0.017   0.017
                                                                                              
Nearest obstetrics in NETS City  0.035   0.035   0.046   0.046   0.046   0.046   0.053   0.052
                                 0.012   0.012   0.017   0.017   0.010   0.010   0.018   0.018
                                                                                              
Controls                             N       Y       N       Y       N       Y       N       Y
                                                                                              
Number of Observations            6922    6922    3078    3078    6922    6922    3078    3078
----------------------------------------------------------------------------------------------
Robust standard errors in paretheses
*** p<.001; ** p<.01; * p<.05; + p<.1.