【问题标题】:Sports Simple Rating System Implementaion in RR中的体育简单评分系统实现
【发布时间】:2017-12-12 22:59:35
【问题描述】:

我正在尝试在 R 中实现运动简单评分系统,但遇到了很多麻烦。我可以在 excel 中完成,您可以在此视频中看到:http://www.screencast.com/users/Sports-Reference/folders/PFR/media/cea8d1e3-ed91-431f-a0df-1336c03b1268

为了测试这一点,我使用的数据(基本上)与视频中的数据相同,您可以在此处访问:https://drive.google.com/file/d/0Bzr6jaapQdMRUFhpU0h4NDBNaTQ/view?usp=sharing

数据框的第一行可以这样构建,但是有206条记录:

dat$Week <- c(1,1,1)
dat$Team <- c("Arizona Cardinals", "Arizona Cardinals", "Arizona Cardinals")
dat$Location <- c("HOME", "AWAY", "HOME")
dat$Opponent <- c("San Francisco 49ers", "Jacksonville Jaguars", "Indianapolis Colts")
dat$Points.For <- c(16, 31, 10)
dat$Points.Against <- c(20, 17, 31)

我使用以下代码设置数据:

library(dplyr)
## Load data
dat <- read.csv("data/footballsrstestdata.csv", stringsAsFactors = FALSE)

## Delete last row
dat <- dat[-207,]

## Create MOV and adjusted MOV variables
dat <- mutate(dat, mov = Points.For - Points.Against)
dat <- mutate(dat, adjMOV = mapply(function(x, y) 
  {if(y == "HOME") x - 1.3529 else x + 1.3529}, dat$mov, dat$Location))

## Create SRS df
srsTable <- data.frame(teams = unique(dat$Team), stringsAsFactors = FALSE)

## Create average MOV
srsTable <- mutate(srsTable,
                   avgAdjMOV = sapply(teams, function(x) {
                     mean(dat$adjMOV[dat$Team == x])
                   }, USE.NAMES = FALSE))

## Create placeholder varaiables
dat$oSRS <- NA
srsTable$SOS <- NA
srsTable$SRS <- NA

在 excel 中,您将有两张相互引用的工作表,创建一个循环引用,该引用会迭代直到它们达到稳定。比赛数据中的每一行都有对手的 SRS,在球队 SRS 表上,SRS 将等于 avgAdjMOV + 比赛数据表中的平均对手 SRS。我假设我需要创建一个包含一系列方程的函数并使用optim 函数来解决它们,但无法弄清楚如何设置它以便它们在游戏数据数据帧和团队数据帧上工作同时。

有人对如何进行有任何想法吗? 谢谢!

【问题讨论】:

  • 我对类似的问题感兴趣。你有没有想过这个问题??
  • 不,从来没有得到任何答案...

标签: r optimization


【解决方案1】:

所以我建议将所有内容都设置为方程组问题:

收视率 = adjMOV+(1/nGames)*Sched*Ratings

其中 Ratings 是一个大小为 N 的向量,其中包含每支球队的评分,adjMOV 是一个大小为 N 的向量,其中包含每支球队调整后的胜利边际,以及 Sched 一个 NxN 矩阵,其中包含每支球队相互交锋的次数。向量中的行顺序和矩阵中的行和列的顺序应该相同。现在有了一些线性代数,你的方程组应该是这样的:

(I-(1/nGames)*Sched)*Ratings = adjMOV

现在使用任何非线性求解器都很容易解决它,我使用了 limSolve 包中的lsei() 方法,所以您的代码应该如下所示:

library(limSolve)
A = (diag(N)-(1/nGames)*Sched)
b = adjMOV
solution = lsei(A=A,B=b)
Ratings = solution$X

我知道这已经一年多了,但我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多