In this lab, we will be doing basic statistical modeling with data from the University of New Mexico to predict undergraduate enrollment.
enroll = read.csv("enrollmentForecast.csv")
str(enroll)
## 'data.frame': 29 obs. of 5 variables:
## $ YEAR : int 1 2 3 4 5 6 7 8 9 10 ...
## $ ROLL : int 5501 5945 6629 7556 8716 9369 9920 10167 11084 12504 ...
## $ UNEM : num 8.1 7 7.3 7.5 7 6.4 6.5 6.4 6.3 7.7 ...
## $ HGRAD: int 9552 9680 9731 11666 14675 15265 15484 15723 16501 16890 ...
## $ INC : int 1923 1961 1979 2030 2112 2192 2235 2351 2411 2475 ...
summary(enroll)
## YEAR ROLL UNEM HGRAD INC
## Min. : 1 Min. : 5501 Min. : 5.700 Min. : 9552 Min. :1923
## 1st Qu.: 8 1st Qu.:10167 1st Qu.: 7.000 1st Qu.:15723 1st Qu.:2351
## Median :15 Median :14395 Median : 7.500 Median :17203 Median :2863
## Mean :15 Mean :12707 Mean : 7.717 Mean :16528 Mean :2729
## 3rd Qu.:22 3rd Qu.:14969 3rd Qu.: 8.200 3rd Qu.:18266 3rd Qu.:3127
## Max. :29 Max. :16081 Max. :10.100 Max. :19800 Max. :3345
head(enroll)
## YEAR ROLL UNEM HGRAD INC
## 1 1 5501 8.1 9552 1923
## 2 2 5945 7.0 9680 1961
## 3 3 6629 7.3 9731 1979
## 4 4 7556 7.5 11666 2030
## 5 5 8716 7.0 14675 2112
## 6 6 9369 6.4 15265 2192
Now, we will create scatterplots of the enrollment (ROLL) variable against all other variables.
library(ggplot2)
ggplot(enroll, aes(x = YEAR, y = ROLL)) +
geom_point(pch = 16, col = "blue") +
xlab("Year") +
ylab("Enrollment") +
theme_minimal()
ggplot(enroll, aes(x = UNEM, y = ROLL)) +
geom_point(pch = 16, col = "pink") +
xlab("Unemployment") +
ylab("Enrollment") +
theme_minimal()
ggplot(enroll, aes(x = HGRAD, y = ROLL)) +
geom_point(pch = 16, col = "green") +
xlab("Highschool Grads") +
ylab("Enrollment") +
theme_minimal()
ggplot(enroll, aes(x = INC, y = ROLL)) +
geom_point(pch = 16, col = "purple") +
xlab("Income") +
ylab("Enrollment") +
theme_minimal()
We will now create a linear model, predicting enrollment as a function of unemployment and highschool graduates.
lm1 = lm(ROLL ~ UNEM + HGRAD, data = enroll)
This creates a simple linear model, which we will now investigate further using the summary() and ANOVA() (analysis of variance) functions.
summary(lm1)
##
## Call:
## lm(formula = ROLL ~ UNEM + HGRAD, data = enroll)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2102.2 -861.6 -349.4 374.5 3603.5
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -8.256e+03 2.052e+03 -4.023 0.00044 ***
## UNEM 6.983e+02 2.244e+02 3.111 0.00449 **
## HGRAD 9.423e-01 8.613e-02 10.941 3.16e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1313 on 26 degrees of freedom
## Multiple R-squared: 0.8489, Adjusted R-squared: 0.8373
## F-statistic: 73.03 on 2 and 26 DF, p-value: 2.144e-11
anova(lm1)
## Analysis of Variance Table
##
## Response: ROLL
## Df Sum Sq Mean Sq F value Pr(>F)
## UNEM 1 45407767 45407767 26.349 2.366e-05 ***
## HGRAD 1 206279143 206279143 119.701 3.157e-11 ***
## Residuals 26 44805568 1723291
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
As can be seen above, the very low P value on both the UNEMP and HGRAD variables in the summary statistics suggests that these are statistically significantly correlated with enrollment, and very unlikely to be this highly correlated purely by chance.
Additinally, the very low P value on the F test for the anova() function suggests that this model does a great job of explaining the variance of enrollment based on the inputs unemplyment and highschool graduates.
The variable that is most closely related to enrollment is HGRAD due to a T value and F value greater than that of the UNEM variable.
hist(residuals(lm1))
The residuals are normally distributed, with a mean centered near zero, so there does not appear to be any immediate bias.
We will now predict the enrollment at this university for an unemployment rate of 9% and a graduating highschool class of 25,000 students.
newUNEM = 9
newHGRAD = 25000
newData = data.frame(UNEM = newUNEM, HGRAD = newHGRAD)
predict(lm1, newData)
## 1
## 21585.58
As you can see, the predict() function using our model has predicted that an unemployment rate of 9% and a graduating class of 25,000 will have 21,585 new enrollees.
We will now create a second model that includes per capita income.
lm2 = lm(ROLL ~ UNEM + HGRAD + INC, data = enroll)
summary(lm2)
##
## Call:
## lm(formula = ROLL ~ UNEM + HGRAD + INC, data = enroll)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1148.84 -489.71 -1.88 387.40 1425.75
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -9.153e+03 1.053e+03 -8.691 5.02e-09 ***
## UNEM 4.501e+02 1.182e+02 3.809 0.000807 ***
## HGRAD 4.065e-01 7.602e-02 5.347 1.52e-05 ***
## INC 4.275e+00 4.947e-01 8.642 5.59e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 670.4 on 25 degrees of freedom
## Multiple R-squared: 0.9621, Adjusted R-squared: 0.9576
## F-statistic: 211.5 on 3 and 25 DF, p-value: < 2.2e-16
anova(lm1, lm2)
## Analysis of Variance Table
##
## Model 1: ROLL ~ UNEM + HGRAD
## Model 2: ROLL ~ UNEM + HGRAD + INC
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 26 44805568
## 2 25 11237313 1 33568255 74.68 5.594e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
As can be seen by the anova(lm1) and anova(lm2) functions, the sum of squared errors on model 2 is much lower, indicating a better fitting model. We can say then, that the addition of the income variable helped the model.