This document summarises the forecast outcomes for the fourth weekly set of forecasts for English football match outcomes, following on from recent weeks, and it provides outcomes for forecasts of matches over the last week as detailed in this document.

Two sets of forecasts are constructed, one using a simple linear regression method for a dependent variable taking the values 0 for an away win, 0.5 for a draw, and 1 for a home win. This linear regression method only yields a number which can be interpreted as a probability of an outcome occurring. The second, ordered logit method, treats each outcome in an ordered manner, from away win, to draw, to home win, and estimates a probability for each outcome.

The purpose of this document is to evaluate these forecasts, and begin to form a longer-term narrative about them.

Outcomes

To consider outcomes; we must load up the specific outcomes file for matches forecast over the weekend:

dates <- c("2015-01-30","2015-02-06","2015-02-13","2015-02-20","2015-02-27","2015-03-06")
date.1 <- dates[NROW(dates)]
recent.forecast.outcomes <- read.csv(paste("forecast_outcomes_",date.1,".csv",sep=""),stringsAsFactors=F)
forecast.matches <- read.csv(paste("forecasts_",date.1,".csv",sep=""))
forecast.matches <- forecast.matches[is.na(forecast.matches$outcome)==F,]
forecast.outcomes <- merge(forecast.matches[,c("match_id","outcome","Ph","Pd","Pa")],
                           recent.forecast.outcomes,by=c("match_id"),
                           suffixes=c(".forc",".final"))
forecast.outcomes <- forecast.outcomes[is.na(forecast.outcomes$outcome.final)==F,]

#all.forecast.outcomes <- data.frame()
#for(i in dates) {
#  temp.0 <- read.csv(paste(loc2,"forecast_outcomes_",i,".csv",sep=""),stringsAsFactors=F)
#  temp.1 <- read.csv(paste(loc2,"forecasts_",i,".csv",sep=""))
#  temp.1 <- temp.1[is.na(temp.1$outcome)==F,]
#  temp.2 <- merge(temp.1[,c("match_id","outcome","Ph","Pd","Pa")],
#                             temp.0,by=c("match_id"),
#                             suffixes=c(".forc",".final"))
#  forecast.outcomes <- rbind(temp.2[is.na(temp.2$outcome.final)==F,],forecast.outcomes)
#}

We also load up previous weeks’ forecasts and outcomes in order that we can begin to determine trends over time. This week was one particularly filled with surprise results, but that does not necessarily mean our forecast model need be amended. More, it reflects that football is intrinsically a very uncertain game. This, of course, is not to say that the model cannot be improved upon.

First, our FA Cup forecasts:

facup.matches <- forecast.outcomes[forecast.outcomes$division=="English FA Cup",]
facup.matches$id <- 1:NROW(facup.matches)
par(mar=c(9,4,4,5)+.1)
plot(facup.matches$id,facup.matches$outcome.forc,xaxt="n",xlab="",ylim=range(0,1),
     main="Forecasts of Weekend FA Cup Matches",
     ylab="Probability of Outcome")
lines(facup.matches$id,facup.matches$Ph,col=2,pch=15,type="p")
lines(facup.matches$id,facup.matches$Pd,col=3,pch=16,type="p")
lines(facup.matches$id,facup.matches$Pa,col=4,pch=17,type="p")
legend("topleft",ncol=4,pch=c(1,15,16,17),col=c(1:4),
       legend=c("OLS","OL (home)","OL (draw)","OL (away)"),bty="n")
abline(h=0.5,lty=2)
abline(h=0.6,lty=3)
abline(h=0.7,lty=2)
abline(h=0.4,lty=3)
for(i in 1:NROW(facup.matches)) {
  if(facup.matches$outcome.final[i]==1) {
    lines(facup.matches$id[i],facup.matches$outcome.final[i],col=2,type="p",pch=0)
    lines(rep(i,2),c(facup.matches$Ph[i],facup.matches$outcome.final[i]),type="l",lty=2,col="red")
  } else if (facup.matches$outcome.final[i]==0.5) {
    lines(facup.matches$id[i],facup.matches$outcome.final[i],col=3,type="p",pch=1)
    lines(rep(i,2),c(facup.matches$Pd[i],facup.matches$outcome.final[i]),type="l",lty=2,col="green")
  } else {
    lines(facup.matches$id[i],facup.matches$outcome.final[i],col=4,type="p",pch=2)
    lines(rep(i,2),c(facup.matches$Pa[i],facup.matches$outcome.final[i]),type="l",lty=2,col="blue")
  }
}
axis(1,at=facup.matches$id,labels=paste(facup.matches$team1,facup.matches$team2,sep=" v "),las=2,cex.axis=0.65)

Next, our Premier League forecast:

prem.matches <- forecast.outcomes[forecast.outcomes$division=="English Premier",]
prem.matches$id <- 1:NROW(prem.matches)
par(mar=c(9,4,4,5)+.1)
plot(prem.matches$id,prem.matches$outcome.forc,xaxt="n",xlab="",ylim=range(0,1),
     main="Forecasts of Weekend Premier League Matches",
     ylab="Probability of Outcome")
lines(prem.matches$id,prem.matches$Ph,col=2,pch=15,type="p")
lines(prem.matches$id,prem.matches$Pd,col=3,pch=16,type="p")
lines(prem.matches$id,prem.matches$Pa,col=4,pch=17,type="p")
legend("topleft",ncol=4,pch=c(1,15,16,17),col=c(1:4),
       legend=c("OLS","OL (home)","OL (draw)","OL (away)"),bty="n")
abline(h=0.5,lty=2)
abline(h=0.6,lty=3)
abline(h=0.7,lty=2)
abline(h=0.4,lty=3)
for(i in 1:NROW(prem.matches)) {
  if(prem.matches$outcome.final[i]==1) {
    lines(prem.matches$id[i],prem.matches$outcome.final[i],col=2,type="p",pch=0)
    lines(rep(i,2),c(prem.matches$Ph[i],prem.matches$outcome.final[i]),type="l",lty=2,col="red")
  } else if (prem.matches$outcome.final[i]==0.5) {
    lines(prem.matches$id[i],prem.matches$outcome.final[i],col=3,type="p",pch=1)
    lines(rep(i,2),c(prem.matches$Pd[i],prem.matches$outcome.final[i]),type="l",lty=2,col="green")
  } else {
    lines(prem.matches$id[i],prem.matches$outcome.final[i],col=4,type="p",pch=2)
    lines(rep(i,2),c(prem.matches$Pa[i],prem.matches$outcome.final[i]),type="l",lty=2,col="blue")
  }
}
axis(1,at=prem.matches$id,labels=paste(prem.matches$team1,prem.matches$team2,sep=" v "),las=2,cex.axis=0.65)

Outcomes are hollowed variants of their predicted probabilities; red empty circles are home wins, marked on at 1, green empty circles are draws, marked on at 0.5, and blue empty triangles are away wins. All are linked to their associated probability. This drawing doesn’t quite reflect actual forecast errors since each outcome is 1 if it happened, but nonetheless illustrates the weekend’s outcomes.

Next, our Championship forecasts:

champ.matches <- forecast.outcomes[forecast.outcomes$division=="English Championship",]
champ.matches$id <- 1:NROW(champ.matches)
par(mar=c(9,4,4,5)+.1)
plot(champ.matches$id,champ.matches$outcome.forc,xaxt="n",xlab="",ylim=range(0,1),
     main="Forecasts of Weekend Championship Matches",
     ylab="Probability of Outcome")
lines(champ.matches$id,champ.matches$Ph,col=2,pch=15,type="p")
lines(champ.matches$id,champ.matches$Pd,col=3,pch=16,type="p")
lines(champ.matches$id,champ.matches$Pa,col=4,pch=17,type="p")
legend("topleft",ncol=4,pch=c(1,15,16,17),col=c(1:4),
       legend=c("OLS","OL (home)","OL (draw)","OL (away)"),bty="n")
abline(h=0.5,lty=2)
abline(h=0.6,lty=3)
abline(h=0.7,lty=2)
abline(h=0.4,lty=3)
for(i in 1:NROW(champ.matches)) {
  if(champ.matches$outcome.final[i]==1) {
    lines(champ.matches$id[i],champ.matches$outcome.final[i],col=2,type="p",pch=0)
    lines(rep(i,2),c(champ.matches$Ph[i],champ.matches$outcome.final[i]),type="l",lty=2,col="red")
  } else if (champ.matches$outcome.final[i]==0.5) {
    lines(champ.matches$id[i],champ.matches$outcome.final[i],col=3,type="p",pch=1)
    lines(rep(i,2),c(champ.matches$Pd[i],champ.matches$outcome.final[i]),type="l",lty=2,col="green")
  } else {
    lines(champ.matches$id[i],champ.matches$outcome.final[i],col=4,type="p",pch=2)
    lines(rep(i,2),c(champ.matches$Pa[i],champ.matches$outcome.final[i]),type="l",lty=2,col="blue")
  }
}
axis(1,at=champ.matches$id,labels=paste(champ.matches$team1,champ.matches$team2,sep=" v "),las=2,cex.axis=0.65)

Next, our League One forecasts:

lg1.matches <- forecast.outcomes[forecast.outcomes$division=="English League One",]
lg1.matches$id <- 1:NROW(lg1.matches)
par(mar=c(9,4,4,5)+.1)
plot(lg1.matches$id,lg1.matches$outcome.forc,xaxt="n",xlab="",ylim=range(0,1),
     main="Forecasts of Weekend League One Matches",
     ylab="Probability of Outcome")
lines(lg1.matches$id,lg1.matches$Ph,col=2,pch=15,type="p")
lines(lg1.matches$id,lg1.matches$Pd,col=3,pch=16,type="p")
lines(lg1.matches$id,lg1.matches$Pa,col=4,pch=17,type="p")
legend("topleft",ncol=4,pch=c(1,15,16,17),col=c(1:4),
       legend=c("OLS","OL (home)","OL (draw)","OL (away)"),bty="n")
abline(h=0.5,lty=2)
abline(h=0.6,lty=3)
abline(h=0.7,lty=2)
abline(h=0.4,lty=3)
for(i in 1:NROW(lg1.matches)) {
  if(lg1.matches$outcome.final[i]==1) {
    lines(lg1.matches$id[i],lg1.matches$outcome.final[i],col=2,type="p",pch=0)
    lines(rep(i,2),c(lg1.matches$Ph[i],lg1.matches$outcome.final[i]),type="l",lty=2,col="red")
  } else if (lg1.matches$outcome.final[i]==0.5) {
    lines(lg1.matches$id[i],lg1.matches$outcome.final[i],col=3,type="p",pch=1)
    lines(rep(i,2),c(lg1.matches$Pd[i],lg1.matches$outcome.final[i]),type="l",lty=2,col="green")
  } else {
    lines(lg1.matches$id[i],lg1.matches$outcome.final[i],col=4,type="p",pch=2)
    lines(rep(i,2),c(lg1.matches$Pa[i],lg1.matches$outcome.final[i]),type="l",lty=2,col="blue")
  }
}
axis(1,at=lg1.matches$id,labels=paste(lg1.matches$team1,lg1.matches$team2,sep=" v "),las=2,cex.axis=0.65)

Next, our League Two forecasts:

lg2.matches <- forecast.outcomes[forecast.outcomes$division=="English League Two",]
lg2.matches$id <- 1:NROW(lg2.matches)
par(mar=c(9,4,4,5)+.1)
plot(lg2.matches$id,lg2.matches$outcome.forc,xaxt="n",xlab="",ylim=range(0,1),
     main="Forecasts of Weekend League Two Matches",
     ylab="Probability of Outcome")
lines(lg2.matches$id,lg2.matches$Ph,col=2,pch=15,type="p")
lines(lg2.matches$id,lg2.matches$Pd,col=3,pch=16,type="p")
lines(lg2.matches$id,lg2.matches$Pa,col=4,pch=17,type="p")
legend("topleft",ncol=4,pch=c(1,15,16,17),col=c(1:4),
       legend=c("OLS","OL (home)","OL (draw)","OL (away)"),bty="n")
abline(h=0.5,lty=2)
abline(h=0.6,lty=3)
abline(h=0.7,lty=2)
abline(h=0.4,lty=3)
for(i in 1:NROW(lg2.matches)) {
  if(lg2.matches$outcome.final[i]==1) {
    lines(lg2.matches$id[i],lg2.matches$outcome.final[i],col=2,type="p",pch=0)
    lines(rep(i,2),c(lg2.matches$Ph[i],lg2.matches$outcome.final[i]),type="l",lty=2,col="red")
  } else if (lg2.matches$outcome.final[i]==0.5) {
    lines(lg2.matches$id[i],lg2.matches$outcome.final[i],col=3,type="p",pch=1)
    lines(rep(i,2),c(lg2.matches$Pd[i],lg2.matches$outcome.final[i]),type="l",lty=2,col="green")
  } else {
    lines(lg2.matches$id[i],lg2.matches$outcome.final[i],col=4,type="p",pch=2)
    lines(rep(i,2),c(lg2.matches$Pa[i],lg2.matches$outcome.final[i]),type="l",lty=2,col="blue")
  }
}
axis(1,at=lg2.matches$id,labels=paste(lg2.matches$team1,lg2.matches$team2,sep=" v "),las=2,cex.axis=0.65)

Next, our Football Conference forecasts:

conf.matches <- forecast.outcomes[forecast.outcomes$division=="Football Conference",]
conf.matches$id <- 1:NROW(conf.matches)
par(mar=c(9,4,4,5)+.1)
plot(conf.matches$id,conf.matches$outcome.forc,xaxt="n",xlab="",ylim=range(0,1),
     main="Forecasts of Weekend Football Conference Matches",
     ylab="Probability of Outcome")
lines(conf.matches$id,conf.matches$Ph,col=2,pch=15,type="p")
lines(conf.matches$id,conf.matches$Pd,col=3,pch=16,type="p")
lines(conf.matches$id,conf.matches$Pa,col=4,pch=17,type="p")
legend("topleft",ncol=4,pch=c(1,15,16,17),col=c(1:4),
       legend=c("OLS","OL (home)","OL (draw)","OL (away)"),bty="n")
abline(h=0.5,lty=2)
abline(h=0.6,lty=3)
abline(h=0.7,lty=2)
abline(h=0.4,lty=3)
for(i in 1:NROW(conf.matches)) {
  if(conf.matches$outcome.final[i]==1) {
    lines(conf.matches$id[i],conf.matches$outcome.final[i],col=2,type="p",pch=0)
    lines(rep(i,2),c(conf.matches$Ph[i],conf.matches$outcome.final[i]),type="l",lty=2,col="red")
  } else if (conf.matches$outcome.final[i]==0.5) {
    lines(conf.matches$id[i],conf.matches$outcome.final[i],col=3,type="p",pch=1)
    lines(rep(i,2),c(conf.matches$Pd[i],conf.matches$outcome.final[i]),type="l",lty=2,col="green")
  } else {
    lines(conf.matches$id[i],conf.matches$outcome.final[i],col=4,type="p",pch=2)
    lines(rep(i,2),c(conf.matches$Pa[i],conf.matches$outcome.final[i]),type="l",lty=2,col="blue")
  }
}
axis(1,at=conf.matches$id,labels=paste(conf.matches$team1,conf.matches$team2,sep=" v "),las=2,cex.axis=0.65)

Tabular Version

Numerically it is important to evaluate forecast errors.

For the OLS model:

forecast.outcomes$error <- forecast.outcomes$outcome.final - forecast.outcomes$outcome.forc
forecast.outcomes$error2 <- forecast.outcomes$error^2
forecast.outcomes$aerror <- abs(forecast.outcomes$error)
#summary(forecast.outcomes[forecast.outcomes$tier<=5,c("error","error2","aerror")])
summary(forecast.outcomes[,c("error","error2","aerror")])
##      error             error2              aerror       
##  Min.   :-0.7538   Min.   :0.0005736   Min.   :0.02395  
##  1st Qu.:-0.5075   1st Qu.:0.0600185   1st Qu.:0.24499  
##  Median :-0.2347   Median :0.1497362   Median :0.38696  
##  Mean   :-0.1363   Mean   :0.1941337   Mean   :0.39224  
##  3rd Qu.: 0.2695   3rd Qu.:0.2990250   3rd Qu.:0.54683  
##  Max.   : 0.5798   Max.   :0.5681587   Max.   :0.75376

For the ordered logit we must consider the three outcomes distinctly; for the home win:

forecast.outcomes$error.h <- forecast.outcomes$outcome.final - forecast.outcomes$Ph
forecast.outcomes$error.d <- as.numeric(forecast.outcomes$outcome.final==0.5) - forecast.outcomes$Pd
forecast.outcomes$error.a <- as.numeric(forecast.outcomes$outcome.final==0) - forecast.outcomes$Pa
forecast.outcomes$error.h2 <- forecast.outcomes$error.h^2
forecast.outcomes$error.d2 <- forecast.outcomes$error.d^2
forecast.outcomes$error.a2 <- forecast.outcomes$error.a^2
forecast.outcomes$aerror.h <- abs(forecast.outcomes$error.h)
forecast.outcomes$aerror.d <- abs(forecast.outcomes$error.d)
forecast.outcomes$aerror.a <- abs(forecast.outcomes$error.a)
#summary(forecast.outcomes[forecast.outcomes$tier<=5,c("error","error2","aerror")])
summary(forecast.outcomes[,c("error.h","error.d","error.a")])
##     error.h              error.d              error.a       
##  Min.   :-0.6564784   Min.   :-0.2887587   Min.   :-0.4648  
##  1st Qu.:-0.3541445   1st Qu.:-0.2848767   1st Qu.:-0.3234  
##  Median :-0.1302982   Median :-0.2529987   Median :-0.1387  
##  Mean   :-0.0008978   Mean   : 0.0009217   Mean   : 0.1307  
##  3rd Qu.: 0.3786564   3rd Qu.: 0.7114603   3rd Qu.: 0.6429  
##  Max.   : 0.7330028   Max.   : 0.8324282   Max.   : 0.8625

Considering here just the mean errors, the forecasts for home wins were biased downward much more than those for either the draw or away win; a positive forecast error suggests that the event occurs more often than the model predicts.  Until we consider more forecasts, it is difficult to say whether this is simply an artifact of one particular week.

We can consider also, by division, forecast errors for our linear regression model:

library(knitr)
aggs <- aggregate(forecast.outcomes[,c("error","error2","aerror")],
          by=list(forecast.outcomes$division),FUN=mean,na.rm=T)
kable(aggs[c(4,1,2,3,5),])
Group.1 error error2 aerror
4 English FA Cup -0.1215287 0.1757490 0.3804511
1 Conference North -0.2740720 0.2253720 0.4537562
2 Conference South -0.6969378 0.4857223 0.6969378
3 English Championship -0.1142830 0.1579651 0.3536604
5 English League One 0.0151572 0.1486721 0.3432553

The error column is the mean forecast error, the error2 column is the mean squared forecast error, and the aerror column is the absolute forecast error.

We do the same for each outcome for the ordered probit model:

library(knitr)
aggs <- aggregate(forecast.outcomes[,c("error.h","error.h2","aerror.h")],
          by=list(forecast.outcomes$division),FUN=mean,na.rm=T)
colnames(aggs) <- gsub("Group.1","Home win",colnames(aggs))
kable(aggs[c(4,1,2,3,5),])
Home win error.h error.h2 aerror.h
4 English FA Cup 0.0112889 0.1699441 0.3339466
1 Conference North -0.1411448 0.1581857 0.3935824
2 Conference South -0.5777477 0.3337924 0.5777477
3 English Championship 0.0289208 0.1463193 0.3260094
5 English League One 0.1481869 0.1730122 0.3712118
aggs <- aggregate(forecast.outcomes[,c("error.d","error.d2","aerror.d")],
          by=list(forecast.outcomes$division),FUN=mean,na.rm=T)
colnames(aggs) <- gsub("Group.1","Draw",colnames(aggs))
kable(aggs[c(4,1,2,3,5),])
Draw error.d error.d2 aerror.d
4 English FA Cup 0.2472745 0.3471018 0.5334998
1 Conference North -0.2615027 0.0691910 0.2615027
2 Conference South -0.2401833 0.0576880 0.2401833
3 English Championship -0.0238509 0.1857186 0.3843234
5 English League One -0.1018791 0.1328576 0.3224646
aggs <- aggregate(forecast.outcomes[,c("error.a","error.a2","aerror.a")],
          by=list(forecast.outcomes$division),FUN=mean,na.rm=T)
colnames(aggs) <- gsub("Group.1","Away win",colnames(aggs))
kable(aggs[c(4,1,2,3,5),])
Away win error.a error.a2 aerror.a
4 English FA Cup -0.0085634 0.1767559 0.3575612
1 Conference North 0.4026476 0.3210464 0.5070153
2 Conference South 0.8179310 0.6690111 0.8179310
3 English Championship 0.1199301 0.2250379 0.4482415
5 English League One 0.0306153 0.1800679 0.3830998

Finally, we list all the forecasts again with outcomes:

kable(forecast.outcomes[order(forecast.outcomes$date,forecast.outcomes$division),
                       c("date","division","team1","goals1","goals2","team2",
                         "outcome.forc","Ph","Pd","Pa","outcome.final","error","error2","aerror")],digits=3)
date division team1 goals1 goals2 team2 outcome.forc Ph Pd Pa outcome.final error error2 aerror
9 2015-03-06 English Championship Fulham 1 5 Bournemouth 0.382 0.237 0.268 0.495 0.0 -0.382 0.146 0.382
57 2015-03-07 Conference North Hednesford 1 2 Boston Utd 0.607 0.470 0.274 0.256 0.0 -0.607 0.369 0.607
58 2015-03-07 Conference North Stalybridge 0 1 Barrow 0.485 0.332 0.288 0.380 0.0 -0.485 0.235 0.485
59 2015-03-07 Conference North Tamworth 2 0 Bradford PA 0.730 0.621 0.222 0.157 1.0 0.270 0.073 0.270
56 2015-03-07 Conference South Sutton Utd 0 1 Hayes & Y 0.697 0.578 0.240 0.182 0.0 -0.697 0.486 0.697
2 2015-03-07 English Championship Cardiff 1 2 Charlton 0.518 0.364 0.289 0.347 0.0 -0.518 0.268 0.518
3 2015-03-07 English Championship Derby 2 2 Birmingham 0.576 0.455 0.278 0.267 0.5 -0.076 0.006 0.076
4 2015-03-07 English Championship Nottm Forest 2 1 Middlesbro 0.436 0.281 0.281 0.438 1.0 0.564 0.318 0.564
5 2015-03-07 English Championship Huddersfield 0 2 Rotherham 0.540 0.390 0.287 0.323 0.0 -0.540 0.292 0.540
7 2015-03-07 English Championship Wigan 0 1 Leeds 0.547 0.398 0.287 0.316 0.0 -0.547 0.299 0.547
8 2015-03-07 English Championship Ipswich 1 1 Brentford 0.585 0.445 0.280 0.275 0.5 -0.085 0.007 0.085
10 2015-03-07 English Championship Millwall 1 4 Norwich 0.296 0.175 0.236 0.589 0.0 -0.296 0.087 0.296
12 2015-03-07 English Championship Blackpool 0 1 Sheff Wed 0.363 0.218 0.260 0.522 0.0 -0.363 0.132 0.363
13 2015-03-07 English Championship Wolves 2 2 Watford 0.434 0.276 0.280 0.444 0.5 0.066 0.004 0.066
62 2015-03-07 English FA Cup Aston Villa 2 0 West Brom 0.482 0.326 0.288 0.387 1.0 0.518 0.268 0.518
63 2015-03-07 English FA Cup Bradford 0 0 Reading 0.615 0.484 0.271 0.245 0.5 -0.115 0.013 0.115
14 2015-03-07 English League One Crawley 1 2 Bristol C 0.291 0.171 0.233 0.596 0.0 -0.291 0.085 0.291
15 2015-03-07 English League One Yeovil 2 1 Oldham 0.445 0.288 0.283 0.429 1.0 0.555 0.308 0.555
17 2015-03-07 English League One Rochdale 2 1 Colchester 0.755 0.654 0.207 0.139 1.0 0.245 0.060 0.245
18 2015-03-07 English League One Crewe 2 0 Scunthorpe 0.507 0.351 0.289 0.361 1.0 0.493 0.243 0.493
20 2015-03-07 English League One Peterborough 1 0 Leyton Orient 0.706 0.585 0.237 0.178 1.0 0.294 0.086 0.294
21 2015-03-07 English League One Sheff Utd 1 2 Fleetwood 0.686 0.568 0.244 0.188 0.0 -0.686 0.471 0.686
22 2015-03-07 English League One Barnsley 3 0 Walsall 0.629 0.493 0.268 0.238 1.0 0.371 0.138 0.371
23 2015-03-07 English League One Gillingham 1 1 Doncaster 0.538 0.389 0.287 0.323 0.5 -0.038 0.001 0.038
24 2015-03-07 English League One Swindon 3 0 Notts Co 0.700 0.592 0.235 0.174 1.0 0.300 0.090 0.300
25 2015-03-07 English League One Coventry 2 3 Port Vale 0.508 0.354 0.289 0.357 0.0 -0.508 0.258 0.508
26 2015-03-07 English League One MK Dons 0 2 Preston 0.336 0.197 0.249 0.555 0.0 -0.336 0.113 0.336
27 2015-03-07 English League Two Stevenage 2 1 Newport Co 0.613 0.478 0.272 0.249 1.0 0.387 0.150 0.387
28 2015-03-07 English League Two Carlisle 1 3 Exeter 0.580 0.439 0.281 0.281 0.0 -0.580 0.336 0.580
29 2015-03-07 English League Two Hartlepool 0 1 Burton 0.370 0.228 0.264 0.507 0.0 -0.370 0.137 0.370
30 2015-03-07 English League Two Tranmere 2 3 Dag & Red 0.474 0.317 0.287 0.396 0.0 -0.474 0.225 0.474
31 2015-03-07 English League Two Luton 2 3 Morecambe 0.724 0.607 0.228 0.165 0.0 -0.724 0.524 0.724
32 2015-03-07 English League Two AFC W’bledon 2 1 York 0.461 0.302 0.285 0.413 1.0 0.539 0.291 0.539
33 2015-03-07 English League Two Plymouth 2 0 Northampton 0.463 0.304 0.285 0.410 1.0 0.537 0.288 0.537
34 2015-03-07 English League Two Bury 0 1 Oxford 0.748 0.636 0.216 0.148 0.0 -0.748 0.560 0.748
35 2015-03-07 English League Two Shrewsbury 1 1 Cambridge U 0.741 0.630 0.218 0.152 0.5 -0.241 0.058 0.241
36 2015-03-07 English League Two Accrington 1 1 Portsmouth 0.524 0.369 0.289 0.342 0.5 -0.024 0.001 0.024
37 2015-03-07 English League Two Cheltenham 1 1 Mansfield 0.417 0.260 0.276 0.465 0.5 0.083 0.007 0.083
38 2015-03-07 English League Two Southend 2 2 Wycombe 0.580 0.433 0.282 0.285 0.5 -0.080 0.006 0.080
1 2015-03-07 English Premier QPR 1 2 Tottenham 0.354 0.210 0.256 0.534 0.0 -0.354 0.125 0.354
39 2015-03-07 Football Conference Braintree 1 0 Gateshead 0.490 0.335 0.288 0.377 1.0 0.510 0.260 0.510
40 2015-03-07 Football Conference Wrexham 1 0 Chester 0.537 0.388 0.288 0.325 1.0 0.463 0.214 0.463
41 2015-03-07 Football Conference Alfreton 2 0 Kidderminster 0.523 0.376 0.288 0.335 1.0 0.477 0.228 0.477
42 2015-03-07 Football Conference Barnet 1 3 Forest Green 0.613 0.484 0.271 0.245 0.0 -0.613 0.376 0.613
43 2015-03-07 Football Conference Southport 0 0 Nuneaton 0.658 0.534 0.256 0.210 0.5 -0.158 0.025 0.158
44 2015-03-07 Football Conference Halifax 0 0 Dartford 0.731 0.633 0.217 0.150 0.5 -0.231 0.053 0.231
45 2015-03-07 Football Conference Macclesfield 0 0 Aldershot 0.735 0.625 0.221 0.155 0.5 -0.235 0.055 0.235
46 2015-03-07 Football Conference Dover 1 2 Lincoln 0.654 0.535 0.256 0.209 0.0 -0.654 0.428 0.654
49 2015-03-07 Football Conference Bristol R 1 2 Eastleigh 0.692 0.569 0.244 0.187 0.0 -0.692 0.479 0.692
50 2015-03-07 Football Conference Woking 1 2 Grimsby 0.553 0.405 0.286 0.309 0.0 -0.553 0.306 0.553
53 2015-03-07 Football Conference Torquay 0 1 Telford 0.754 0.656 0.206 0.137 0.0 -0.754 0.568 0.754
60 2015-03-07 Ryman Premier Lewes 1 0 Kingstonian 0.420 0.267 0.278 0.455 1.0 0.580 0.336 0.580
64 2015-03-08 English FA Cup Liverpool 0 0 Blackburn 0.829 0.732 0.168 0.100 0.5 -0.329 0.108 0.329
48 2015-03-08 Football Conference Welling 0 1 Altrincham 0.416 0.263 0.276 0.461 0.0 -0.416 0.173 0.416
65 2015-03-09 English FA Cup Man Utd 1 2 Arsenal 0.560 0.413 0.285 0.302 0.0 -0.560 0.313 0.560
6 2015-03-10 English Championship Reading 2 1 Brighton 0.526 0.369 0.289 0.342 1.0 0.474 0.224 0.474
16 2015-03-10 English League One Coventry 1 1 Bradford 0.428 0.272 0.279 0.450 0.5 0.072 0.005 0.072
19 2015-03-10 English League One Yeovil 0 3 Bristol C 0.274 0.160 0.225 0.615 0.0 -0.274 0.075 0.274
47 2015-03-10 Football Conference Aldershot 1 1 Halifax 0.536 0.387 0.288 0.325 0.5 -0.036 0.001 0.036
51 2015-03-10 Football Conference Wrexham 0 0 Southport 0.640 0.513 0.263 0.224 0.5 -0.140 0.020 0.140
52 2015-03-10 Football Conference Gateshead 1 1 Welling 0.802 0.704 0.183 0.114 0.5 -0.302 0.091 0.302
54 2015-03-10 Football Conference Kidderminster 1 3 Eastleigh 0.507 0.352 0.289 0.359 0.0 -0.507 0.257 0.507
55 2015-03-10 Football Conference Torquay 0 1 Chester 0.559 0.421 0.284 0.295 0.0 -0.559 0.312 0.559
61 2015-03-10 Football Conference Macclesfield 1 0 Telford 0.810 0.716 0.176 0.108 1.0 0.190 0.036 0.190
11 2015-03-11 English Championship Blackburn 1 0 Bolton 0.667 0.543 0.253 0.204 1.0 0.333 0.111 0.333