Refining our Corner 3 Prediction Model
Being right-handed makes you worse at the left corner or the right corner?
In our post about predicting corner three shooting, we gave examples of players who shoot better from the right corner and players who shoot better from the left corner.
By far, the most common feedback we got had to do with justifying a player’s poor ability to shoot in a specific corner because they were right-handed. Amusingly, readers said being right-handed can explain both poor shooting in the left corner or poor shooting on the right corner depending on which player’s data they were looking at.
“Right-handers are worse at the right corner because their release arm is aligned with the backboard”. “Right-handers are better at the right corner because they’re catching the ball across their body”.
So which is it? Does being right-handed make you worse at shooting in the left corner or the right corner?
Here’s what our model thinks an average shooter can shoot in the right and left corners (broken down by left vs right-handers).
As is probably obvious from the plots, right-handers are predicted to shoot mildly better from the left corner. Left-handers also show a mild improvement for the left corner on average.
There are three more subtle things to notice:
The effect size is very small: players shoot less than half of a percentage point better in the left corner.
The uncertainty is huge: The model is not confident about this difference, at all.
Both left and right-handers show the same trend. This runs counter to any sort of court-body-geometry based arguments for why right-handers shoot better in a specific corner.
Although the effect size is near zero, that doesn’t mean individual right-handers don’t have a corner preference (see this post for more details on player-specific preferences), the model is just saying that a dominant hand is hardly correlated with a dominant corner. Or at least we don’t yet have enough data to know.
What our model does pick up on, however, is the difference between left and right-hander’s shooting ability in general. Our model says right-handers are predicted to shoot 2.1 percentage points better than left-handers, in either corner.
There’s a fair amount of uncertainty in those predictions though. Especially for left-hander shooting ability because we have less data on left-handers. In fact, the model isn’t even certain right-handers are better than left-handers. It gives a 94.9% chance that right-handers can shoot corner 3s better than left-handers. (These probabilistic insights are what I love about keeping track of the uncertainty in models. Also, if we had a frequentist mindset, we would be livid that we missed p=0.05 by just a hair).
We’re happy to rabbit-hole any of your guesses as to why right-handers might be better at corner threes than left handers.
Stan Model
You can stop reading. This section is only for people curious about the underlying probability model. Either because they want to understand the details or they want to expand on it themselves. The model is a hierarchical model for left and right-handers shooting in the left and right corners.
data {
int<lower=0> players;
int<lower=0> n_left_attempts[players];
int<lower=0> n_left_successes[players];
int<lower=0> n_right_attempts[players];
int<lower=0> n_right_successes[players];
int<lower=0, upper=1> is_right_handed[players];
}
parameters {
real theta_left [players]; // left parameter
real theta_right [players]; // right parameter
// Hierarchical Parameters
real theta_left_left;
real theta_left_right;
real theta_right_right;
real theta_right_left;
real<lower=0> sigma;
}
transformed parameters {
real theta_diff[players];
for (player in 1:players) {
theta_diff[player] = theta_left[player] - theta_right[player];
}
}
model {
// Hyper-priors
theta_left_left ~ normal(0, 10);
theta_left_right ~ normal(0, 10);
theta_right_right ~ normal(0, 10);
theta_right_left ~ normal(0, 10);
sigma ~ cauchy(0, 5);
// Binomial Model
for (player in 1:players) {
if (is_right_handed[player] == 1) {
n_left_successes[player] ~ binomial_logit(n_left_attempts[player], theta_right_left);
n_right_successes[player] ~ binomial_logit(n_right_attempts[player], theta_right_right);
}
else {
n_left_successes[player] ~ binomial_logit(n_left_attempts[player], theta_left_left);
n_right_successes[player] ~ binomial_logit(n_right_attempts[player], theta_left_right);
}
}
}
generated quantities {
real<lower=0, upper=1>theta_left_ [players]; // left parameter
real<lower=0, upper=1>theta_right_ [players]; // right parameter
real<lower=0, upper=1>theta_left_left_;
real<lower=0, upper=1>theta_left_right_;
real<lower=0, upper=1>theta_right_left_;
real<lower=0, upper=1>theta_right_right_;
theta_left_left_ = inv_logit(theta_left_left);
theta_left_right_ = inv_logit(theta_left_right);
theta_right_right_ = inv_logit(theta_right_right);
theta_right_left_ = inv_logit(theta_right_left);
for (player in 1:players) {
theta_left_[player] = inv_logit(theta_left[player]);
theta_right_[player] = inv_logit(theta_right[player]);
}
}