【问题标题】:Simulating Football League Season on R在 R 上模拟足球联赛赛季
【发布时间】:2014-03-20 05:40:39
【问题描述】:

我在 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 的列表,以便匹配我想要的。

但是当我这样做时

团队主页

[1] “奥尔德肖特”

我只在我的输出中获得第一支队伍,当我这样做时

   levels(teamHome)

    NULL

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

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

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

谢谢

斯蒂芬

【问题讨论】:

  • 确保在 Buffalo 中使用 sample(c("win", "loss"), 14, TRUE, c(0, 1)) :-(
  • 每次循环,您都会覆盖存储在对象teamHometeamAwayhomeScoreawayScore 中的值。如果每个团队在您的模拟中互相对战,那么您可以制作一个矩阵score,并将模拟中的两条*Score 行替换为score[i, j] &lt;- rpois(1, predict.glm(mod3, data.frame(Attack=teamHome,Defence=teamAway,Home="Y "), type="response"))。我想。
  • 矩阵 score 应该是 92x92,在模拟之后它应该保存每个主队(行)与每个客队(列)的得分。
  • @jbaums 感谢您的回复,但我不太明白这将如何完成。你能告诉我们你将如何编辑我的代码

标签: r loops


【解决方案1】:

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

首先,让我们模拟一些数据来拟合原始模型:

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 返回任意数量的因子的所有组合。如果我们想预测攻击队、防守队和“主场”的所有组合,这很有用。

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

【讨论】:

  • 感谢您的帮助,这对我帮助很大,我非常感激。但是,有没有一种方法可以将结果与攻击和 def 列的分数一起存储。所以它更像是一个足球结果列表,我不必找到每个攻击和防守的组合
  • 我不太确定homeattdef 的关系。您所指的两个分数列是否等于对应于两种情况的分数:(1)att = team 1,def = team 2,home = TRUE; (2) att = team 2, def = team 1, home = FALSE?
  • 是的,就是这样,(1)将是主场得分,(2)将是客场得分。有没有办法将它添加到我的模型中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 2021-11-29
  • 2022-01-12
  • 2022-08-18
相关资源
最近更新 更多