How to report regression models in R Markdown

In the following, we will work with data collected from 3 schools, specifically Hillcrest High School, Oakwood High School, and St Mary’s Church of England School. For each student, we have recorded the average test scores (ranging from 0% to 100%) and the average number of hours they studied shortly before their exams.

Here is the dataset:

scroll_box(
  kable_styling(kable(df)),
  height="300px")
school_long_name school test_score study_time
Hillcrest High School Hillcrest 54.59454 13.092146
Hillcrest High School Hillcrest 45.90443 7.285176
Hillcrest High School Hillcrest 46.07368 10.068656
Hillcrest High School Hillcrest 53.15568 10.877858
Hillcrest High School Hillcrest 51.89308 10.192075
Hillcrest High School Hillcrest 45.88416 8.660897
Hillcrest High School Hillcrest 49.43284 13.513836
Hillcrest High School Hillcrest 49.04923 8.695293
Hillcrest High School Hillcrest 55.00619 15.034541
Hillcrest High School Hillcrest 49.30719 8.791128
Hillcrest High School Hillcrest 49.59065 12.893879
Hillcrest High School Hillcrest 54.12954 15.839206
Hillcrest High School Hillcrest 47.03255 4.812688
Hillcrest High School Hillcrest 48.98281 8.142904
Hillcrest High School Hillcrest 50.05463 8.579306
Hillcrest High School Hillcrest 56.51023 10.887121
Hillcrest High School Hillcrest 48.13828 8.126511
Hillcrest High School Hillcrest 33.20910 1.009904
Hillcrest High School Hillcrest 40.99077 1.657870
Hillcrest High School Hillcrest 57.04151 12.939610
Oakwood High School Oakwood 44.29733 8.059354
Oakwood High School Oakwood 25.14011 3.635345
Oakwood High School Oakwood 35.47447 8.463518
Oakwood High School Oakwood 45.12912 12.623294
Oakwood High School Oakwood 48.16753 14.664851
Oakwood High School Oakwood 35.43849 7.687863
Oakwood High School Oakwood 37.85879 8.207462
Oakwood High School Oakwood 25.77590 3.689781
Oakwood High School Oakwood 48.83004 10.359562
Oakwood High School Oakwood 36.44190 7.059286
Oakwood High School Oakwood 42.43892 10.345621
Oakwood High School Oakwood 45.67442 11.093782
Oakwood High School Oakwood 46.28141 12.084581
Oakwood High School Oakwood 35.90872 7.152491
Oakwood High School Oakwood 47.41863 10.494136
Oakwood High School Oakwood 29.00540 3.828244
Oakwood High School Oakwood 31.40098 6.625893
Oakwood High School Oakwood 36.01010 6.426547
Oakwood High School Oakwood 24.41876 1.736647
Oakwood High School Oakwood 38.60989 9.087638
Oakwood High School Oakwood 37.99014 9.597266
Oakwood High School Oakwood 39.07729 7.896098
Oakwood High School Oakwood 43.98547 11.253760
St Mary’s Church of England School St Mary’s 42.94447 6.799156
St Mary’s Church of England School St Mary’s 34.92019 4.874427
St Mary’s Church of England School St Mary’s 49.85766 10.277724
St Mary’s Church of England School St Mary’s 44.38598 6.545091
St Mary’s Church of England School St Mary’s 60.11943 13.311574
St Mary’s Church of England School St Mary’s 46.89865 7.684932
St Mary’s Church of England School St Mary’s 50.23389 10.946214
St Mary’s Church of England School St Mary’s 49.43679 9.945046
St Mary’s Church of England School St Mary’s 40.07521 6.627753
St Mary’s Church of England School St Mary’s 60.94646 13.706453
St Mary’s Church of England School St Mary’s 57.77003 10.907968
St Mary’s Church of England School St Mary’s 48.67736 9.248552
St Mary’s Church of England School St Mary’s 51.15944 9.808922
St Mary’s Church of England School St Mary’s 51.22429 11.017137
St Mary’s Church of England School St Mary’s 46.55865 9.248769
St Mary’s Church of England School St Mary’s 23.99421 0.000000
St Mary’s Church of England School St Mary’s 54.27720 9.833919
St Mary’s Church of England School St Mary’s 48.37929 7.877566
Hillcrest High School Hillcrest 45.30004 9.534962
Hillcrest High School Hillcrest 57.01957 10.724741
Hillcrest High School Hillcrest 56.86480 13.178481
Hillcrest High School Hillcrest 46.07672 6.797394
Hillcrest High School Hillcrest 55.57510 12.886898
Hillcrest High School Hillcrest 47.07002 9.986815
Hillcrest High School Hillcrest 49.22528 12.094788
Hillcrest High School Hillcrest 52.23690 11.741456
Hillcrest High School Hillcrest 47.77480 11.141905
Hillcrest High School Hillcrest 45.58995 5.849913
Hillcrest High School Hillcrest 52.34357 8.708711
Hillcrest High School Hillcrest 47.91817 10.849825
Hillcrest High School Hillcrest 43.12712 6.118700
Hillcrest High School Hillcrest 46.96063 7.350784
Hillcrest High School Hillcrest 47.81392 10.722260
Hillcrest High School Hillcrest 50.39072 11.283807
Hillcrest High School Hillcrest 53.06295 10.370573
Hillcrest High School Hillcrest 48.49496 6.321941
Hillcrest High School Hillcrest 45.96745 5.679928
Hillcrest High School Hillcrest 48.66620 13.517391
Oakwood High School Oakwood 41.34408 9.753035
Oakwood High School Oakwood 43.68350 9.244591
Oakwood High School Oakwood 41.67275 8.616581
Oakwood High School Oakwood 32.22012 5.396284
Oakwood High School Oakwood 35.53073 10.815261
Oakwood High School Oakwood 38.83860 8.327851
Oakwood High School Oakwood 40.58326 8.431000
Oakwood High School Oakwood 45.69603 11.779309
Oakwood High School Oakwood 45.36142 11.444590
Oakwood High School Oakwood 49.60593 13.155619
Oakwood High School Oakwood 35.91185 7.550749
Oakwood High School Oakwood 47.79057 10.930316
Oakwood High School Oakwood 49.71638 13.152602
Oakwood High School Oakwood 29.56580 5.646904
Oakwood High School Oakwood 38.93851 6.396892
Oakwood High School Oakwood 36.78149 5.584054
Oakwood High School Oakwood 33.67548 4.601628
Oakwood High School Oakwood 35.45055 9.219218
Oakwood High School Oakwood 42.16985 10.938883
Oakwood High School Oakwood 49.07087 12.582166
Oakwood High School Oakwood 46.35821 12.113523
Oakwood High School Oakwood 34.98333 5.969644
Oakwood High School Oakwood 58.42821 14.524716
St Mary’s Church of England School St Mary’s 39.48171 6.978950
St Mary’s Church of England School St Mary’s 42.54783 9.295812
St Mary’s Church of England School St Mary’s 44.95859 7.712503
St Mary’s Church of England School St Mary’s 44.77387 8.612220
St Mary’s Church of England School St Mary’s 50.96967 9.543849
St Mary’s Church of England School St Mary’s 46.57311 9.336753
St Mary’s Church of England School St Mary’s 54.34814 8.903993
St Mary’s Church of England School St Mary’s 48.53935 9.303488
St Mary’s Church of England School St Mary’s 42.13689 7.522964
St Mary’s Church of England School St Mary’s 42.90107 7.466619
St Mary’s Church of England School St Mary’s 35.57561 3.995973
St Mary’s Church of England School St Mary’s 44.78883 7.832269
St Mary’s Church of England School St Mary’s 38.44711 7.441319
St Mary’s Church of England School St Mary’s 72.24097 17.084943
St Mary’s Church of England School St Mary’s 37.95949 4.892922
St Mary’s Church of England School St Mary’s 49.29009 9.391039
St Mary’s Church of England School St Mary’s 36.70040 4.498395
St Mary’s Church of England School St Mary’s 34.26447 4.567963
Hillcrest High School Hillcrest 49.05039 9.353377
Hillcrest High School Hillcrest 46.63433 5.989353
Hillcrest High School Hillcrest 51.74739 8.973802
Hillcrest High School Hillcrest 43.49421 7.694494
Hillcrest High School Hillcrest 46.46544 7.138255
Hillcrest High School Hillcrest 41.27340 2.905237
Hillcrest High School Hillcrest 42.08927 5.305026
Hillcrest High School Hillcrest 46.31831 9.517820
Hillcrest High School Hillcrest 48.92636 10.682132
Hillcrest High School Hillcrest 48.76119 7.500638
Hillcrest High School Hillcrest 47.52638 8.979459
Hillcrest High School Hillcrest 50.46286 12.347939
Hillcrest High School Hillcrest 54.44885 13.298837
Hillcrest High School Hillcrest 41.11537 5.687929
Hillcrest High School Hillcrest 51.49040 8.627312
Hillcrest High School Hillcrest 51.64673 12.583766
Hillcrest High School Hillcrest 47.65148 7.570081
Hillcrest High School Hillcrest 48.73925 8.821862
Hillcrest High School Hillcrest 48.46442 8.720948
Hillcrest High School Hillcrest 51.00763 6.316233
Oakwood High School Oakwood 34.81445 7.645218
Oakwood High School Oakwood 43.21828 8.890936
Oakwood High School Oakwood 37.57005 7.737664
Oakwood High School Oakwood 44.13324 12.319428
Oakwood High School Oakwood 36.86629 7.536292
Oakwood High School Oakwood 39.59984 7.679763
Oakwood High School Oakwood 42.86316 11.069858
Oakwood High School Oakwood 31.30408 5.810165
Oakwood High School Oakwood 40.17264 8.857175
Oakwood High School Oakwood 33.61506 4.324636
Oakwood High School Oakwood 46.74118 12.480779
Oakwood High School Oakwood 34.15559 8.158333
Oakwood High School Oakwood 33.23144 7.575734
Oakwood High School Oakwood 30.22384 5.264513
Oakwood High School Oakwood 38.33064 8.955984
Oakwood High School Oakwood 35.09257 6.578424
Oakwood High School Oakwood 38.76908 7.378793
Oakwood High School Oakwood 46.38074 12.842296
Oakwood High School Oakwood 35.56375 8.452693
Oakwood High School Oakwood 35.34916 5.763923
Oakwood High School Oakwood 41.76415 9.468891
Oakwood High School Oakwood 41.25415 7.891055
Oakwood High School Oakwood 38.45118 10.749311
St Mary’s Church of England School St Mary’s 61.09157 13.276536
St Mary’s Church of England School St Mary’s 43.06366 6.001193
St Mary’s Church of England School St Mary’s 54.20218 10.343221
St Mary’s Church of England School St Mary’s 46.20423 9.233964
St Mary’s Church of England School St Mary’s 58.19549 11.665967
St Mary’s Church of England School St Mary’s 43.25403 8.289936
St Mary’s Church of England School St Mary’s 54.10719 11.489128
St Mary’s Church of England School St Mary’s 35.79491 3.744103
St Mary’s Church of England School St Mary’s 62.27251 14.047647
St Mary’s Church of England School St Mary’s 58.20645 11.573604
St Mary’s Church of England School St Mary’s 45.70714 8.526942
St Mary’s Church of England School St Mary’s 30.16766 4.632249
St Mary’s Church of England School St Mary’s 51.17844 10.908296
St Mary’s Church of England School St Mary’s 49.02100 10.428852
St Mary’s Church of England School St Mary’s 46.42774 8.960203
St Mary’s Church of England School St Mary’s 48.29198 9.433638
St Mary’s Church of England School St Mary’s 42.22076 7.226943
St Mary’s Church of England School St Mary’s 50.52733 10.085690


Simple linear regression report

We can now model how students’ test scores depend on the length of study and the school they’re in. The model output reveals a strong positive linear relationship between study time and performance as well as significantly different entry levels between Oakwood and Hillcrest High School:

# Fit a simple linear regression model (fixed intercept, fixed slope model)
model = lm(test_score ~ study_time + school, data = df)
# show mode summary
summary(model)
## 
## Call:
## lm(formula = test_score ~ study_time + school, data = df)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.9832 -2.2652 -0.0306  2.0228  8.8218 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     30.85270    0.92193  33.465   <2e-16 ***
## study_time       1.94884    0.08736  22.308   <2e-16 ***
## schoolOakwood   -8.51883    0.61211 -13.917   <2e-16 ***
## schoolSt Mary’s -0.72933    0.65003  -1.122    0.263    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.458 on 179 degrees of freedom
## Multiple R-squared:  0.813,  Adjusted R-squared:  0.8099 
## F-statistic: 259.4 on 3 and 179 DF,  p-value: < 2.2e-16


Formatted report

We can access all model coefficients:

coef(model)
##     (Intercept)      study_time   schoolOakwood schoolSt Mary’s 
##      30.8526985       1.9488407      -8.5188314      -0.7293296


In this list, the first element is equivalent to the intercept (regression constant)

coef(model)[1]
## (Intercept) 
##     30.8527

while the following elements correspond to the slopes (regression coefficients). Our model comprises of three additional entries at position 2, 3, and 4:

coef(model)[2:4]
##      study_time   schoolOakwood schoolSt Mary’s 
##       1.9488407      -8.5188314      -0.7293296


Accessing the coefficients allows us to build fluent sentences by using inline expressions, such as:

According to this model, each additional minute of study increases the test score by 1.949 units, independent of the students’ school. In case students do not study at all their test score is estimated 30.853 on average. Oakwood and St. Mary’s differ from Hillcrest by -8.519 and -0.729 points, respectively.


The complete table of coefficients as reported in the summary can be accessed by

coefficients(summary(model))
##                   Estimate Std. Error    t value     Pr(>|t|)
## (Intercept)     30.8526985 0.92192753  33.465427 5.902009e-79
## study_time       1.9488407 0.08736203  22.307640 1.427690e-53
## schoolOakwood   -8.5188314 0.61210681 -13.917230 2.568230e-30
## schoolSt Mary’s -0.7293296 0.65003016  -1.121994 2.633680e-01


which is equivalent to

summary(model)$coefficients
##                   Estimate Std. Error    t value     Pr(>|t|)
## (Intercept)     30.8526985 0.92192753  33.465427 5.902009e-79
## study_time       1.9488407 0.08736203  22.307640 1.427690e-53
## schoolOakwood   -8.5188314 0.61210681 -13.917230 2.568230e-30
## schoolSt Mary’s -0.7293296 0.65003016  -1.121994 2.633680e-01


This structure is of class “matrix, array” which easily converts into a dataframe.

tab = as.data.frame(summary(model)$coefficients)
tab
##                   Estimate Std. Error    t value     Pr(>|t|)
## (Intercept)     30.8526985 0.92192753  33.465427 5.902009e-79
## study_time       1.9488407 0.08736203  22.307640 1.427690e-53
## schoolOakwood   -8.5188314 0.61210681 -13.917230 2.568230e-30
## schoolSt Mary’s -0.7293296 0.65003016  -1.121994 2.633680e-01

In addition we limit the precision to three decimal digits. Note that precision depends on context and personal preferences.

tab = round(tab, 3)
tab
##                 Estimate Std. Error t value Pr(>|t|)
## (Intercept)       30.853      0.922  33.465    0.000
## study_time         1.949      0.087  22.308    0.000
## schoolOakwood     -8.519      0.612 -13.917    0.000
## schoolSt Mary’s   -0.729      0.650  -1.122    0.263


Now we can format our coefficients as usual:

kable(tab)
Estimate Std. Error t value Pr(>|t|)
(Intercept) 30.853 0.922 33.465 0.000
study_time 1.949 0.087 22.308 0.000
schoolOakwood -8.519 0.612 -13.917 0.000
schoolSt Mary’s -0.729 0.650 -1.122 0.263


The last column header looks a little weird. Headers can be accessed by the table’s names list.

names(tab)
## [1] "Estimate"   "Std. Error" "t value"    "Pr(>|t|)"

In our case we have to edit the 4. element in this list:

names(tab)[4]
## [1] "Pr(>|t|)"


We simply replace the existing entry by a simpler expression

names(tab)[4] = "p"

to enhance readability:

kable(tab)
Estimate Std. Error t value p
(Intercept) 30.853 0.922 33.465 0.000
study_time 1.949 0.087 22.308 0.000
schoolOakwood -8.519 0.612 -13.917 0.000
schoolSt Mary’s -0.729 0.650 -1.122 0.263


Finally, in we transform our p-values into a generic format to indicate small p values being lesser then .001 while greater values will be rounded to 3 digits:

tab[,4] = sapply(tab[,4], function (x) ifelse(x<.001, "<.001", as.character(round(x,3))))


Now the p_values are reported correctly. As we redefined column “p” as characters, though, it will be aligned left as default.

kable(tab)
Estimate Std. Error t value p
(Intercept) 30.853 0.922 33.465 <.001
study_time 1.949 0.087 22.308 <.001
schoolOakwood -8.519 0.612 -13.917 <.001
schoolSt Mary’s -0.729 0.650 -1.122 0.263


To right-align the last column we have to reset the alignment for all four columns to “r” (use “l” to align left, “c” to center). All columns show numeric values and should thus be aligned right (aligned to decimals, to be more precise).

kable(tab, align="rrrr")
Estimate Std. Error t value p
(Intercept) 30.853 0.922 33.465 <.001
study_time 1.949 0.087 22.308 <.001
schoolOakwood -8.519 0.612 -13.917 <.001
schoolSt Mary’s -0.729 0.650 -1.122 0.263


If you prefer different row names, you can replace them, too. The current labels

rownames(tab)
## [1] "(Intercept)"     "study_time"      "schoolOakwood"   "schoolSt Mary’s"

can easily be replaced by assigning new row names

rownames(tab) = c("Intercept (Hillcrest)", "Average Study Time", "Oakwood vs. Hillcrest", "St. Mary's vs. Hillcrest")
rownames(tab) 
## [1] "Intercept (Hillcrest)"    "Average Study Time"      
## [3] "Oakwood vs. Hillcrest"    "St. Mary's vs. Hillcrest"

In combination with a proper title this results in

kable(tab, align="rrrr", caption="Regression Parameters of School Model")
Regression Parameters of School Model
Estimate Std. Error t value p
Intercept (Hillcrest) 30.853 0.922 33.465 <.001
Average Study Time 1.949 0.087 22.308 <.001
Oakwood vs. Hillcrest -8.519 0.612 -13.917 <.001
St. Mary’s vs. Hillcrest -0.729 0.650 -1.122 0.263