Suppose I have the regression in R

lm(formula = income ~ ageQuartile * (numYearsWorking + numHoursPerWeekWorking))

and in R, I get results like:

(Intercept)                             12.94520    
ageqtile2                                6.63428    
ageqtile3                               12.64004  
numYearsWorking                          4.25382     
numHoursPerWeekWorking                  17.98021   
ageqtile2:numYearsWorking                9.98316    
ageqtile3:numYearsWorking               12.81078    
ageqtile2:numHoursPerWeekWorking        15.35733    
ageqtile3:numHoursPerWeekWorking        20.34312   

(these numbers are made up and probably dont make sense).

How do I interpret this? Say I wanted to predict the income of someone in the first age quartile; is that just

$12.94520+4.2538*numYearsWorking+17.98021*numHoursPerWeekWorking $

And how does this change as I want to examine different quartiles?


Yes, that's what you need to do. And for an observation from the second age quartile : $$12.94520+4.2538∗numYearsWorking+17.98021∗numHoursPerWeekWorking+9.98316*numYearsWorking+15.35733*numHoursPerWeekWorking$$

For interpretation, for example if you want the marginal effect of numHoursPerWeekWorking given age quartile==2, you just have to derivate and it gives : $ 17.98021 + 15.35733 $

| cite | improve this answer | |
  • $\begingroup$ But then where is the information "ageqtile2= 6.63428 " used? $\endgroup$ – Khan Aug 10 '15 at 15:32
  • $\begingroup$ Yes, I'm sorry, I missed it for the first expression ! It is : 12.94520+ 6.63428 + 4.2538∗numYearsWorking+17.98021∗numHoursPerWeekWorking+9.98316∗numYearsWorking+15.35733∗numHoursPerWeekWorking $\endgroup$ – Martin Aug 11 '15 at 6:43

Assuming the results are the default dummy contrasts R uses, then the intercept is the effect of the reference (first) level of ageqtile. Subsequent levels are coded as the additional offset in DV moving from the reference level to that level. So the "ageqtile2= 6.63428" is used in the prediction by adding 6.6 to the prediction for rows where (ageqtile==2).

You can get these coefficients with coef(). You can get the predicted y values with predict(model) and use these to check your work.

It helps to have a running example:

df = mtcars
m1 =lm(mpg ~ factor(am) * disp, data = mtcars)
# (Intercept)      factor(am)1             disp factor(am)1:disp 
# 25.15706407       7.70907298      -0.02758360      -0.03145482 

We can generate our own pred column, to check understanding of the coefficients:

b = coef(m1)

df = within(df, { 

    pred = (b["(Intercept)"]

     + ((am=="1") * b["factor(am)1"])

     + (disp      * b["disp"])

     + ((am=="1") * disp * b["factor(am)1:disp"]))


# [1] FALSE

This page is helpful for other kinds of contrasts.

| cite | improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.