在R上模拟足球联赛

时间:2014-03-18 20:39:55

标签: r loops

我在R上制作了代码,预测了92支球队足球联赛赛季的结果

mod3=glm(formula = Score ~ as.factor(Attack) + as.factor(Defence) + as.factor(Home),     family = poisson,    data = football)
for (i in 1:92){
  for (j in 1:92){
   if (i!=j){
     teamHome=levels(football$Attack)[i] 
     teamAway=levels(football$Attack)[j] 
     homeScore=rpois(1,predict.glm(mod3, data.frame(Attack=teamHome,Defence=teamAway,Home="Y   "),type="response"))
     awayScore=rpois(1,predict.glm(mod3, data.frame(Attack=teamAway,Defence=teamHome,Home="N   "),type="response"))
     Result= if(homeScore>awayScore){
       Result="H"
     } else if(homeScore<awayScore){
       Result="A"
     } else if(homeScore==awayScore){
       Result="D"
     }

     Results<-print(paste(teamHome,homeScore,"      ",teamAway,awayScore,Result),quote=F)
    }
  }
}  

这会生成一个8000 0r的列表,所以匹配我想要的。

但是当我这样做时

  

teamHome

[1]“Aldershot”

我只输出了输出中的第一支球队

   levels(teamHome)

    NULL

对于我的所有变量都是一样的,并且很难将结果格式化为“联赛表”

我的代码中是否有任何错误,这意味着我没有获得“teamHome”的完整列表,或者是否有方法可以访问它。

我希望我能正确解释这个问题

由于

斯蒂芬

1 个答案:

答案 0 :(得分:2)

这是一种模拟分数的简单方法,它利用了我们可以同时预测多个协变量的新组合这一事实。

首先,让我们模拟一些数据以适应原始模型:

set.seed(1)
n <- 100000
att <- sample(LETTERS, n, TRUE)
def <- sapply(att, function(x) sample(LETTERS[-grep(x, LETTERS)], 1))
X <- data.frame(att, def, home=factor(sample(0:1, n, TRUE)))
mm <- model.matrix(~ ., data=X)
b <- rnorm(ncol(mm), sd=0.1)
mu <- exp(mm %*% b)
y <- rpois(length(mu), mu)
dat <- cbind(y, X)

head(dat)

  y att def home
1 1   G   S    1
2 1   J   S    1
3 1   O   H    1
4 1   X   N    1
5 1   F   W    0
6 2   X   R    1

适合模特:

mod <- glm(y ~ ., data=dat, family='poisson')

bcoef(mod)的比较表明该模型相对准确地估计了真实系数(尽管我们需要一个大的样本量来实现这一点,因为许多因子水平 - 因此许多系数 - 我们正在估计。)

现在我们可以根据一些新数据预测拟合模型。我们可以使用expand.grid返回任意数量的因子的所有组合。如果我们想要预测攻击团队,防守团队和&#34; home&#34;的所有组合,这将非常有用。

newdat <- setNames(expand.grid(levels(dat$att), levels(dat$def), factor(0:1)),
                   c('att', 'def', 'home'))
# now reduce newdat to exclude rows where att == def
newdat <- subset(newdat, att!=def)

sim.score <- rpois(nrow(newdat), predict(mod, newdat, type='response'))
results <- cbind(newdat, score=sim.score)
head(results)

  att def home score
2   B   A    0     1
3   C   A    0     0
4   D   A    0     2
5   E   A    0     1
6   F   A    0     2
7   G   A    0     0