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 |
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
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")
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 |