首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R上模拟足球联赛赛季

在R上模拟足球联赛赛季
EN

Stack Overflow用户
提问于 2014-03-18 20:39:55
回答 1查看 1.1K关注 0票数 0

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

代码语言:javascript
复制
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 r的列表,与我想要的匹配。

但是当我做的时候

teamHome

1“奥尔德赛”

我只得到第一组在我的输出和当我这样做

代码语言:javascript
复制
   levels(teamHome)

    NULL

这对于我所有的变量来说都是一样的,并且使得很难将结果格式化为“排行榜”。

我的代码中是否有任何错误意味着我没有得到"teamHome“的完整列表,或者是否有一个方法来访问这个列表。

我希望我正确地解释了这个问题。

谢谢

斯蒂芬

EN

回答 1

Stack Overflow用户

发布于 2014-03-19 21:40:39

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

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

代码语言:javascript
复制
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

并符合以下模式:

代码语言:javascript
复制
mod <- glm(y ~ ., data=dat, family='poisson')

bcoef(mod)的比较表明,该模型相对准确地估计了真实系数(尽管我们需要大量的样本才能达到这一目的,考虑到我们正在估计的许多因素水平--因此也有许多系数)。

现在我们可以对一些新的数据进行拟合模型的预测。我们可以使用expand.grid返回任意数量因素的所有组合。这是有用的,如果我们想要预测所有的组合进攻队,防守队,和“主场”。

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22490544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档