Usage and examples

Every form of metest, from the help file, with output

metest [exp] [, options]

exp refers to marginal effects by the # shown in the mecompare table, or by their coefficient names, combined with +, -, *, /, parentheses, or =. A bare number is always an ME number; a literal number is written with a leading # (#2 is the number two, 2 is the second marginal effect). Non-whole numbers are always literals.

The examples below are the ones in the help file, run in order.

Setup: fit and store two models, then calculate the marginal effects

sysuse nlsw88, clear
(NLSW, 1988 extract)
drop if missing(union, married, age, race, wage)
(368 observations deleted)

. 
logit union i.married age i.race, vce(robust)
Iteration 0:  Log pseudolikelihood = -1046.6242  
Iteration 1:  Log pseudolikelihood = -1038.8701  
Iteration 2:  Log pseudolikelihood = -1038.8354  
Iteration 3:  Log pseudolikelihood = -1038.8354  

Logistic regression                                     Number of obs =  1,878
                                                        Wald chi2(4)  =  15.82
                                                        Prob > chi2   = 0.0033
Log pseudolikelihood = -1038.8354                       Pseudo R2     = 0.0074

------------------------------------------------------------------------------
             |               Robust
       union | Coefficient  std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
     married |
    Married  |     -0.176      0.114   -1.549   0.121       -0.399       0.047
         age |      0.011      0.018    0.637   0.524       -0.024       0.046
             |
        race |
      Black  |      0.372      0.120    3.093   0.002        0.136       0.608
      Other  |      0.553      0.439    1.260   0.208       -0.307       1.412
             |
       _cons |     -1.570      0.711   -2.207   0.027       -2.964      -0.176
------------------------------------------------------------------------------
est store m1
logit union i.married age i.race wage, vce(robust)
Iteration 0:  Log pseudolikelihood = -1046.6242  
Iteration 1:  Log pseudolikelihood = -1016.7478  
Iteration 2:  Log pseudolikelihood = -1016.3517  
Iteration 3:  Log pseudolikelihood = -1016.3517  

Logistic regression                                     Number of obs =  1,878
                                                        Wald chi2(5)  =  59.14
                                                        Prob > chi2   = 0.0000
Log pseudolikelihood = -1016.3517                       Pseudo R2     = 0.0289

------------------------------------------------------------------------------
             |               Robust
       union | Coefficient  std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
     married |
    Married  |     -0.119      0.116   -1.029   0.303       -0.345       0.108
         age |      0.013      0.018    0.705   0.481       -0.023       0.048
             |
        race |
      Black  |      0.492      0.122    4.025   0.000        0.252       0.732
      Other  |      0.483      0.482    1.002   0.316       -0.462       1.427
             |
        wage |      0.084      0.012    6.819   0.000        0.060       0.108
       _cons |     -2.356      0.739   -3.189   0.001       -3.803      -0.908
------------------------------------------------------------------------------
est store m2
. 
mecompare age i.married, models(m1 m2)
Predicting: Pr(union)

Marginal effects and cross-model differences (N_m1=1878) (N_m2=1878)

                                 |  ME #   Estimate  Robust SE      P>|z|
---------------------------------+---------------------------------------
age + 1 (centered)               |                                       
                              m1 |     1      0.002      0.003      0.524
                              m2 |     2      0.002      0.003      0.480
                      Difference |     3     -0.000      0.001      0.689
---------------------------------+---------------------------------------
married                          |                                       
            Married - Single     |                                       
                              m1 |     4     -0.033      0.021      0.126
                              m2 |     5     -0.021      0.021      0.308
                      Difference |     6     -0.011      0.004      0.003

A single marginal effect, by number and by name

metest 1
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
age                              |                                
                              m1 |     0.002      0.003      0.524 
metest age:m1
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
age                              |                                
                              m1 |     0.002      0.003      0.524 

The cross-model difference, three equivalent ways

Note that mecompare already reports it as ME 3.

metest 1 - 2
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
age                              |                                
                         m1 - m2 |    -0.000      0.001      0.689 
metest 3
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
age                              |                                
                      Difference |    -0.000      0.001      0.689 
metest _b[age:m1] - _b[age:m2]
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
age                              |                                
                         m1 - m2 |    -0.000      0.001      0.689 

A ratio and an average

Note the # on the divisor of the average, which makes it the number two rather than ME 2.

metest 1 / 2
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
age                              |                                
                         m1 / m2 |     0.910      0.254      0.000 
metest (1 + 2) / #2
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
age                              |                                
                   (m1 + m2) / 2 |     0.002      0.003      0.501 

Scaling by a literal value

10 times the effect for a change in age:

metest 1 * #10
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
age                              |                                
                         m1 * 10 |     0.021      0.033      0.524 

Equality tests, including a joint test and two constraints at once

metest 1 = 2
Tests of equality

                                 |      chi2         df     pvalue 
---------------------------------+--------------------------------
age                              |                                
                         m1 = m2 |     0.161      1.000      0.689 
metest 1 = 2 = 3
Tests of equality

                                 |      chi2         df     pvalue 
---------------------------------+--------------------------------
age                              |                                
            m1 = m2 = Difference |     0.645      2.000      0.725 
metest (1 = 2) (4 = 5)
Tests of equality

                                 |      chi2         df     pvalue 
---------------------------------+--------------------------------
  (age~1 = age~2)(mar~1 = mar~2) |     9.216      2.000      0.010 

Building up a table

Estimates and equality tests are shown in separate tables.

metest, clear
metest 1 - 2
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
age                              |                                
                         m1 - m2 |    -0.000      0.001      0.689 
metest 4 - 5, add
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
age                              |                                
                         m1 - m2 |    -0.000      0.001      0.689 
---------------------------------+--------------------------------
married                          |                                
                         m1 - m2 |    -0.011      0.004      0.003 
metest 1 = 2, add
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
age                              |                                
                         m1 - m2 |    -0.000      0.001      0.689 
---------------------------------+--------------------------------
married                          |                                
                         m1 - m2 |    -0.011      0.004      0.003 

Tests of equality

                                 |      chi2         df     pvalue 
---------------------------------+--------------------------------
age                              |                                
                         m1 = m2 |     0.161      1.000      0.689 

Redisplayed at any point, with a title, by typing metest on its own:

metest, title("Age and marriage")
Age and marriage

                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
age                              |                                
                         m1 - m2 |    -0.000      0.001      0.689 
---------------------------------+--------------------------------
married                          |                                
                         m1 - m2 |    -0.011      0.004      0.003 

Age and marriage

                                 |      chi2         df     pvalue 
---------------------------------+--------------------------------
age                              |                                
                         m1 = m2 |     0.161      1.000      0.689 

All six statistics, and a label of your own

metest 1 - 2, stat(all)
             |  estimate         se     zvalue     pvalue         ll         ul 
-------------+-----------------------------------------------------------------
age          |                                                                 
     m1 - m2 |    -0.000      0.001     -0.401      0.689     -0.001      0.001 
metest 1 - 2, rowname("Age effect, m1 vs m2")
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
            Age effect, m1 vs m2 |    -0.000      0.001      0.689 

Options

Option Purpose
statistics(list) Statistics to display: estimate, se, zvalue, pvalue, ll, ul, or all. The default is estimate se pvalue. Ignored for equality tests, which report the test statistic, its degrees of freedom, and the p-value. stats() is a synonym.
allstats Same as statistics(all).
add Adds the result as another row of the saved table rather than starting a new one. save is a synonym.
clear Clears the saved table before running; metest, clear on its own clears it without running anything.
rowname(string) Labels the row. A : in the label puts what comes before it on a row of its own, with the rest indented underneath, which is how several rows are grouped under one heading. label() is a synonym.
decimals(#) Decimal places; the default is 3.
width(#) Width of each statistic column; the default is 9.
labwidth(#) Width of the label column; the maximum is 32. twidth() is a synonym.
title(string) Title above the table.
notable Suppresses the table.
details Shows the underlying nlcom or test output.
level(#) Confidence level for ll and ul.

Results accumulate in the matrix _metest (estimates) and _metest_test (equality tests). metest is r-class: after an expression it returns r(estimate), r(se), r(zvalue), r(pvalue), r(ll), and r(ul); after an equality test, r(chi2) (or r(F)), r(df), and r(pvalue).

Use after other commands

metest also works after other estimation commands: a number refers to the nth coefficient in e(b), in the order of matrix list e(b), and coefficient names work as usual.

sysuse nlsw88, clear
(NLSW, 1988 extract)
regress wage age ttl_exp grade
      Source |       SS           df       MS      Number of obs   =     2,244
-------------+----------------------------------   F(3, 2240)      =    132.71
       Model |  11221.4453         3  3740.48178   Prob > F        =    0.0000
    Residual |  63132.8852     2,240  28.1843237   R-squared       =    0.1509
-------------+----------------------------------   Adj R-squared   =    0.1498
       Total |  74354.3305     2,243  33.1495009   Root MSE        =    5.3089

------------------------------------------------------------------------------
        wage | Coefficient  Std. err.      t    P>|t|     [95% conf. interval]
-------------+----------------------------------------------------------------
         age |     -0.101      0.037   -2.735   0.006       -0.174      -0.029
     ttl_exp |      0.271      0.025   10.819   0.000        0.222       0.320
       grade |      0.641      0.045   14.106   0.000        0.552       0.730
       _cons |     -0.061      1.570   -0.039   0.969       -3.140       3.019
------------------------------------------------------------------------------
metest 1 - 2
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
                   age - ttl_exp |    -0.372      0.047      0.000 
metest 1 / 2
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
                   age / ttl_exp |    -0.374      0.136      0.006 
metest 1 = 2 = 3
Tests of equality

                                 |         F         df     pvalue 
---------------------------------+--------------------------------
           age = ttl_exp = grade |    88.241      2.000      0.000 
metest abs(1) - abs(2)
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
         abs(age) - abs(ttl_exp) |    -0.170      0.042      0.000 
metest min(1,2)
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
                min(age,ttl_exp) |    -0.101      0.037      0.006 
metest _b[age] * #10
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
                        age * 10 |    -1.011      0.370      0.006 

After margins, post, a number refers to a row of the margins table. E.g., a risk ratio – the ratio of two predicted probabilities, averaging over observed values – in the Health and Retirement Study 2020:

use "https://tdmize.github.io/data/data/cda_hrs", clear
(cda_hrs.dta | Health & Retirement Study 2020)
drop if missing(cogB, marstatB, collegeB, woman, age)
(761 observations deleted)

. 
logit cogB i.collegeB i.marstatB i.woman c.age, or
Iteration 0:  Log likelihood = -2466.5782  
Iteration 1:  Log likelihood = -2311.9677  
Iteration 2:  Log likelihood = -2282.8575  
Iteration 3:  Log likelihood = -2282.3938  
Iteration 4:  Log likelihood = -2282.3924  
Iteration 5:  Log likelihood = -2282.3924  

Logistic regression                                     Number of obs = 14,962
                                                        LR chi2(4)    = 368.37
                                                        Prob > chi2   = 0.0000
Log likelihood = -2282.3924                             Pseudo R2     = 0.0747

---------------------------------------------------------------------------------------
                 cogB | Odds ratio   Std. err.      z    P>|z|     [95% conf. interval]
----------------------+----------------------------------------------------------------
             collegeB |
bachelor's or higher  |      0.233      0.037   -9.269   0.000        0.171       0.317
                      |
             marstatB |
   currently married  |      0.556      0.051   -6.401   0.000        0.465       0.666
                      |
                woman |
               woman  |      0.802      0.073   -2.428   0.015        0.671       0.958
                  age |      1.049      0.004   12.085   0.000        1.041       1.057
                _cons |      0.003      0.001  -19.128   0.000        0.001       0.005
---------------------------------------------------------------------------------------
Note: _cons estimates baseline odds.

. 
margins collegeB, post
Predictive margins                                      Number of obs = 14,962
Model VCE: OIM

Expression: Pr(cogB), predict()

---------------------------------------------------------------------------------------
                      |            Delta-method
                      |     Margin   std. err.      z    P>|z|     [95% conf. interval]
----------------------+----------------------------------------------------------------
             collegeB |
       no bachelor's  |      0.048      0.002   23.986   0.000        0.044       0.052
bachelor's or higher  |      0.012      0.002    6.758   0.000        0.008       0.015
---------------------------------------------------------------------------------------
metest 1 / 2
                                 |  estimate         se     pvalue 
---------------------------------+--------------------------------
       0bn_collegeB / 1_collegeB |     4.065      0.626      0.000 

Omitted (o.) coefficients are skipped when numbering, so check the numbers with matrix list e(b). After some commands test reports F rather than chi-squared; run metest, clear before accumulating results from a model of the other kind.

Back to top