首页 > 解决方案 > 在 R 的模拟中更新值

问题描述

我正在构建一个可以预测 NFL 比赛的模型,并希望运行整个赛季的模拟并为每支球队生成预期的输赢。

该模型的一部分基于每周根据球队是否输球而变化的评级。例如,假设比尔队和乌鸦队在周日比赛开始时的评分均为 100,在乌鸦队获胜后,他们的评分现在增加到 120,而比尔队则下降到 80。

在运行模拟时,我想在整个过程中更新球队评分,以便更准确地表示一个赛季可以进行的方式数量,但我不确定如何在循环中包含这样的内容。

我的 2017 赛季循环。

full.sim <- NULL

    for(i in 1:10000){
      nflpredictions$sim.homewin <- with(nflpredictions, rbinom(nrow(nflpredictions), 1, homewinpredict)) 
      nflpredictions$winner <- with(nflpredictions, ifelse(sim.homewin, as.character(HomeTeam), as.character(AwayTeam)))
      winningteams <- table(nflpredictions$winner)
      projectedwins <- data.frame(Team=names(winningteams), Wins=as.numeric(winningteams))
      full.sim <- rbind(full.sim, projectedwins)
    }

full.sim <- aggregate(full.sim$Wins, by= list(full.sim$Team), FUN = sum)
full.sim$expectedwins <- full.sim$x / 10000
full.sim$expectedlosses <- 16 - full.sim$expectedwins

这在运行 2017 年的模拟时效果很好,我已经拥有完整的赛季数据,但我无法适应模型来模拟 2018 年。

我的第一个想法是在循环中创建另一个 for 循环,该循环遍历行并更新每周的评分,类似于

full.sim <- NULL

        for(i in 1:10000){
            for(i in 1:nrow(nflpredictions)){

这个想法是更新团队评分,然后使用我构建的 GLM 生成一周的获胜概率,模拟谁获胜,然后继续遍历整个数据框。唯一真正阻碍我的是不知道如何根据不在正上方的行向行添加值。那么根据球队上一场比赛的结果每周更新评分的最简单方法是什么?

数据框是这样构建的,但显然规模更大:

nflpredictions

 Week    HomeTeam    AwayTeam    HomeRating    AwayRating    HomeProb   AwayProb
 1       BAL         BUF         105           85            .60        .40
 1       NE          HOU         120           90            .65        .35
 2       BUF         LAC         NA            NA            NA         NA
 2       JAX         NE          NA            NA            NA         NA

我希望我解释得足够好......任何输入都非常感谢,谢谢!

标签: r

解决方案


推荐阅读