UCLA Academic Technology Services HomeServicesClassesContactJobs
Help the Stat Consulting Group by giving a gift             
Loading

Stata FAQ
How can I explain a continuous by continuous interaction? (Stata 11)

An earlier version of this web page showed how to explain continuous by continuous interactions using methods available in Stata 10 and earlier. These methods continue to work in Stata 11. However, Stata 11 has some new features that will allow that can make the task a bit easier.

First off, let's start with what a significant continuous by continuous interaction means. It means that the slope of one continuous variable on the response variable changes as the values on a second continuous change.

Multiple regression models often contain interaction terms. This FAQ page covers the situation in which there is a moderator variable which influences the regression of the dependent variable on an independent/predictor variable. In other words, a regression model that has a significant two-way interaction of continuous variables.

There are several approaches that one might use to explain an interaction of two continuous variables. The approach that we will demonstrate is to compute simple slopes, i.e., the slopes of the dependent variable on the independent variable when the moderator variable is held constant at different combinations of values from very low to very high.

We will consider a regression model which includes a continuous by continuous interaction of a predictor variable with a moderator variable. In the formula, Y is the response variable, X the predictor (independent) variable with Z being the moderator variable. The term XZ is the interaction of the predictor with the moderator.

Y = b0 + b1X + b2Z + b3XZ
We will illustrate the simple slopes process using the hsbdemo dataset that has a statistically significant continuous by continuous interaction. As shown in the code below that read is the response variable, math is the predictor and socst is the moderator variable.

use http://www.ats.ucla.edu/stat/data/hsbdemo, clear

/* note high and low values for math */

sum math

    Variable |       Obs        Mean    Std. Dev.       Min        Max
-------------+--------------------------------------------------------
        math |       200      52.645    9.368448         33         75

global min = r(min)
global max = r(max)

regress read c.math##c.socst

      Source |       SS       df       MS              Number of obs =     200
-------------+------------------------------           F(  3,   196) =   78.61
       Model |  11424.7622     3  3808.25406           Prob > F      =  0.0000
    Residual |  9494.65783   196  48.4421318           R-squared     =  0.5461
-------------+------------------------------           Adj R-squared =  0.5392
       Total |    20919.42   199  105.122714           Root MSE      =    6.96

------------------------------------------------------------------------------
        read |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
        math |  -.1105123   .2916338    -0.38   0.705    -.6856552    .4646307
       socst |  -.2200442   .2717539    -0.81   0.419    -.7559812    .3158928
             |
      c.math#|
     c.socst |   .0112807   .0052294     2.16   0.032     .0009677    .0215938
             |
       _cons |   37.84271   14.54521     2.60   0.010     9.157506    66.52792
------------------------------------------------------------------------------
Please note that the interaction, c.math#c.socst, is statistically significant with a p-value of 0.032.

Next, we compute the slope for read on math while holding the value of the moderator variable, socst, constant at values running from 30 to 75. To do this we will use the margins command with a range of values for socst using the at option.

margins, dydx(math) at(socst=(30(5)75)) vsquish

Average marginal effects                          Number of obs   =        200
Model VCE    : OLS

Expression   : Linear prediction, predict()
dy/dx w.r.t. : math
1._at        : socst           =          30
2._at        : socst           =          35
3._at        : socst           =          40
4._at        : socst           =          45
5._at        : socst           =          50
6._at        : socst           =          55
7._at        : socst           =          60
8._at        : socst           =          65
9._at        : socst           =          70
10._at       : socst           =          75

------------------------------------------------------------------------------
             |            Delta-method
             |      dy/dx   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
math         |
         _at |
          1  |   .2279094   .1424924     1.60   0.110    -.0513706    .5071894
          2  |    .284313   .1195771     2.38   0.017     .0499463    .5186797
          3  |   .3407166   .0982883     3.47   0.001     .1480752     .533358
          4  |   .3971202   .0799363     4.97   0.000      .240448    .5537924
          5  |   .4535238   .0669803     6.77   0.000      .322245    .5848027
          6  |   .5099274   .0628508     8.11   0.000     .3867422    .6331127
          7  |   .5663311   .0691477     8.19   0.000     .4308041     .701858
          8  |   .6227347   .0835458     7.45   0.000     .4589878    .7864815
          9  |   .6791383   .1026924     6.61   0.000     .4778649    .8804117
         10  |   .7355419   .1244141     5.91   0.000     .4916947    .9793891
------------------------------------------------------------------------------
The values in the margins command gives the amount of change in read with a one unit change in math while holding socst constant at different values, i.e., the values are simple slopes. The margins command stores the simple slopes in a vector r(b). We will make a copy of that vector, call it s, and use the values to graph the simple slopes on top of a scatter plot of read and math.
matrix s=r(b)

matrix list s

s[1,10]
         math:      math:      math:      math:      math:      math:      math:      math:      math:
            1.         2.         3.         4.         5.         6.         7.         8.         9.
          _at        _at        _at        _at        _at        _at        _at        _at        _at
r1  .22790939    .284313  .34071661  .39712022  .45352383  .50992744  .56633105  .62273466  .67913827

         math:
           10.
          _at
r1  .73554189
Next, we need to compute the intercepts. The intercepts for each of the simple regression lines are the values of the response variable when math is equal to zero. We will use the margins commamd again with several additional options. Once computed we will save the values of the intercepts in a matrix named i.
margins, at(math=0 socst=(30(5)75)) asbalanced vsquish

Adjusted predictions                              Number of obs   =        200
Model VCE    : OLS

Expression   : Linear prediction, predict()
1._at        : math            =           0
               socst           =          30
2._at        : math            =           0
               socst           =          35
3._at        : math            =           0
               socst           =          40
4._at        : math            =           0
               socst           =          45
5._at        : math            =           0
               socst           =          50
6._at        : math            =           0
               socst           =          55
7._at        : math            =           0
               socst           =          60
8._at        : math            =           0
               socst           =          65
9._at        : math            =           0
               socst           =          70
10._at       : math            =           0
               socst           =          75

------------------------------------------------------------------------------
             |            Delta-method
             |     Margin   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
         _at |
          1  |   31.24139   6.873932     4.54   0.000     17.76873    44.71405
          2  |   30.14117   5.726198     5.26   0.000     18.91803    41.36431
          3  |   29.04095   4.692576     6.19   0.000     19.84367    38.23823
          4  |   27.94073   3.865708     7.23   0.000     20.36408    35.51737
          5  |   26.84051   3.399947     7.89   0.000     20.17673    33.50428
          6  |   25.74028   3.445008     7.47   0.000     18.98819    32.49238
          7  |   24.64006   3.983596     6.19   0.000     16.83236    32.44777
          8  |   23.53984   4.854122     4.85   0.000     14.02594    33.05375
          9  |   22.43962   5.911723     3.80   0.000     10.85286    34.02639
         10  |    21.3394   7.072973     3.02   0.003     7.476628    35.20217
------------------------------------------------------------------------------

mat i=r(b)

mat list i

i[1,10]
            1.         2.         3.         4.         5.         6.         7.         8.         9.        10.
          _at        _at        _at        _at        _at        _at        _at        _at        _at        _at
r1  31.241389  30.141168  29.040947  27.940726  26.840505  25.740284  24.640063  23.539842  22.439622  21.339401
Now, with the intercepts in matrix i and the slopes in s we can go ahead and plot the simple slopes.
twoway (function y = i[1,1] + s[1,1]*x, range($min $max))  ///
       (function y = i[1,2] + s[1,2]*x, range($min $max))  ///
       (function y = i[1,3] + s[1,3]*x, range($min $max))  ///
       (function y = i[1,4] + s[1,4]*x, range($min $max))  ///
       (function y = i[1,5] + s[1,5]*x, range($min $max))  ///
       (function y = i[1,6] + s[1,6]*x, range($min $max))  ///
       (function y = i[1,7] + s[1,7]*x, range($min $max))  ///
       (function y = i[1,8] + s[1,8]*x, range($min $max))  ///
       (function y = i[1,9] + s[1,9]*x, range($min $max))  ///
       (function y = i[1,10] + s[1,10]*x, range($min $max)) ///
       (scatter read math, msym(oh) jitter(3)),                   ///
       legend(off) ytitle(Y) xtitle(X) scheme(lean1)
       
In the above graph the bottom line is the simple slope when z equals 30 and the top line is when z equals 75. So it is easy to see that the simple slope increases as z increases.

What if you have additional variables in your model? Its not a problem as long as the other variables don't interact with either math or socst. The values of the simple slopes will be diferent from the model with no covariate but because this is a linear model it doesn't matter what value you hold the other covariates at to obtain the simple slopes with covariates. The easiest way is just to hold the other variables at their mean values with the atmeans option in margins. Here is an example adding write to our model.

regress read c.math##c.socst write

      Source |       SS       df       MS              Number of obs =     200
-------------+------------------------------           F(  4,   195) =   62.69
       Model |   11768.436     4    2942.109           Prob > F      =  0.0000
    Residual |  9150.98401   195  46.9281231           R-squared     =  0.5626
-------------+------------------------------           Adj R-squared =  0.5536
       Total |    20919.42   199  105.122714           Root MSE      =  6.8504

------------------------------------------------------------------------------
        read |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
        math |  -.2285181   .2903336    -0.79   0.432    -.8011152    .3440789
       socst |  -.3206324   .2700438    -1.19   0.237    -.8532139     .211949
             |
      c.math#|
     c.socst |   .0119774   .0051534     2.32   0.021     .0018138     .022141
             |
       write |    .193212   .0713966     2.71   0.007     .0524034    .3340206
       _cons |   37.16971   14.31827     2.60   0.010     8.931167    65.40826
------------------------------------------------------------------------------

/* hold write at 20 */

margins , dydx(math) at(socst=(30(5)75) write=20) vsquish

Average marginal effects                          Number of obs   =        200
Model VCE    : OLS

Expression   : Linear prediction, predict()
dy/dx w.r.t. : math
1._at        : socst           =          30
               write           =          20
2._at        : socst           =          35
               write           =          20
3._at        : socst           =          40
               write           =          20
4._at        : socst           =          45
               write           =          20
5._at        : socst           =          50
               write           =          20
6._at        : socst           =          55
               write           =          20
7._at        : socst           =          60
               write           =          20
8._at        : socst           =          65
               write           =          20
9._at        : socst           =          70
               write           =          20
10._at       : socst           =          75
               write           =          20

------------------------------------------------------------------------------
             |            Delta-method
             |      dy/dx   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
math         |
         _at |
          1  |   .1308037   .1447656     0.90   0.366    -.1529317    .4145391
          2  |   .1906907   .1226729     1.55   0.120    -.0497438    .4311252
          3  |   .2505777   .1023138     2.45   0.014     .0500464     .451109
          4  |   .3104646   .0849439     3.65   0.000     .1439776    .4769517
          5  |   .3703516   .0727374     5.09   0.000      .227789    .5129143
          6  |   .4302386   .0685119     6.28   0.000     .2959577    .5645195
          7  |   .4901256   .0736542     6.65   0.000      .345766    .6344851
          8  |   .5500125   .0865095     6.36   0.000      .380457    .7195681
          9  |   .6098995   .1042629     5.85   0.000      .405548     .814251
         10  |   .6697865   .1248419     5.37   0.000     .4251009    .9144721
------------------------------------------------------------------------------

/* hold write at its mean value */

margins , dydx(math) at(socst=(30(5)75)) atmeans vsquish

Conditional marginal effects                      Number of obs   =        200
Model VCE    : OLS

Expression   : Linear prediction, predict()
dy/dx w.r.t. : math
1._at        : math            =      52.645 (mean)
               socst           =          30
               write           =      52.775 (mean)
2._at        : math            =      52.645 (mean)
               socst           =          35
               write           =      52.775 (mean)
3._at        : math            =      52.645 (mean)
               socst           =          40
               write           =      52.775 (mean)
4._at        : math            =      52.645 (mean)
               socst           =          45
               write           =      52.775 (mean)
5._at        : math            =      52.645 (mean)
               socst           =          50
               write           =      52.775 (mean)
6._at        : math            =      52.645 (mean)
               socst           =          55
               write           =      52.775 (mean)
7._at        : math            =      52.645 (mean)
               socst           =          60
               write           =      52.775 (mean)
8._at        : math            =      52.645 (mean)
               socst           =          65
               write           =      52.775 (mean)
9._at        : math            =      52.645 (mean)
               socst           =          70
               write           =      52.775 (mean)
10._at       : math            =      52.645 (mean)
               socst           =          75
               write           =      52.775 (mean)

------------------------------------------------------------------------------
             |            Delta-method
             |      dy/dx   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
math         |
         _at |
          1  |   .1308037   .1447656     0.90   0.366    -.1529317    .4145391
          2  |   .1906907   .1226729     1.55   0.120    -.0497438    .4311252
          3  |   .2505777   .1023138     2.45   0.014     .0500464     .451109
          4  |   .3104646   .0849439     3.65   0.000     .1439776    .4769517
          5  |   .3703516   .0727374     5.09   0.000      .227789    .5129143
          6  |   .4302386   .0685119     6.28   0.000     .2959577    .5645195
          7  |   .4901256   .0736542     6.65   0.000      .345766    .6344851
          8  |   .5500125   .0865095     6.36   0.000      .380457    .7195681
          9  |   .6098995   .1042629     5.85   0.000      .405548     .814251
         10  |   .6697865   .1248419     5.37   0.000     .4251009    .9144721
------------------------------------------------------------------------------
You will note that the simple slopes are the same in the two margins commands above even though we held write constant at 20 in the first one and at 52.775 in the second one.

How to cite this page

Report an error on this page or leave a comment

UCLA Researchers are invited to our Statistical Consulting Services
We recommend others to our list of Other Resources for Statistical Computing Help
These pages are Copyrighted (c) by UCLA Academic Technology Services


The content of this web site should not be construed as an endorsement of any particular web site, book, or software product by the University of California