I am trying to predict first term GPA for college students based on a number of incoming factors (high school gpa, placement test, year). This isn't the overall model just a simpler one. The first term GPAs are on the interval 0 to 4, however the predictions from the linear OLS model (i'm using sklearn) never go above 3.6 (see picture). Is this some sort of gotcha that I am missing? There are certainly data in the training set with first term GPA that is between 3.6 and 4.0. I didn't expect perfect performance but this is odd to me.
Predictions like these don't include the 'error' in your model: that is, you expect that even if your model is very good, a student with some combination of predictors will not be exactly the prediction, they will be above or below it. The only way you would get a prediction of 4 would be if a combination of predictors gave an estimate that the average GPA for that observed combination would be 4. If the average GPA for that observed combination is 3.6 with a range of 3.0-4.0, your model would predict 3.6 even if you would expect some fraction to have 4.0; your best guess for each individual student is the expected value, the mean. If you instead imagined your predictions as probability distributions you would find that these include 4.0.
However, it looks like your model itself is not very good: there is a lot of difference between your predictions and outcomes and very little slope between them relative to the variance.