I am working with betting data where the closing odds can be thought of the median result.
I am trying to estimate the latent offensive and defensive strength of each team. Thus, I am using the observed scores and I would also like to use the closing odds to incorporate extra information into my model.
data {
// pbserved scores
vector[30] home_scores;
vector[30] away_scores;
int num_teams;
int home_team_index[30];
int away_team_index[30];
// this is the markets' median value of home team score - away team score
vector[30] closing_spread;
}
parameters{
vector[num_teams] offensive_strength;
vector[num_teams] defensive_strength;
vector[num_teams] off_sigma;
}
model{
int h;
int a;
real home_mu[30];
real away_mu[30];
vector[30] home_sigma;
vector[30] away_sigma;
vector[30] probability_beat_spread;
offensive_strength ~ normal(30,10);
defensive_strength ~ normal(0,10);
for(i in 1:30){
h = home_team_index[i];
a = away_team_index[i];
home_mu[i] = offensive_strength[h] + defensive_strength[a];
away_mu[i] = offensive_strength[a] + defensive_strength[h];
home_sigma[i] = off_sigma[h];
away_sigma[i] = off_sigma[a];
probability_beat_spread[i] = normal_cdf(closing_spread[i], home_mu[i] - away_mu[i], sqrt(square(home_sigma[i])+ square(away_sigma[i])));
}
home_scores ~ normal(home_mu, home_sigma);
away_scores ~ normal(away_mu, away_sigma);
// here I want to specify that probability_beat_spread should somewhere around .5
// I know I can do something like :
probability_beat_spread ~ normal(.5,.05);
// this significantly changes my estimates however, and gives me really wierd results so I don't think this is correct
// How do I incorporate this prior information about the spread being the median point
}