R

时间:2016-06-25 18:49:40

标签: r optimization

我正试图在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函数来解决它们,但无法确定如何设置它以便它们可以在游戏数据数据框架和同时组建数据框架。

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

1 个答案:

答案 0 :(得分:1)

因此,我建议将所有内容设置为方程组问题:

评级= adjMOV +(1 / nGames)* Sched *评级

如果评级是具有每个团队评级的大小为N的向量,则调整每个团队的调整后的胜利边界的大小为N的向量,以及每个团队彼此面对的次数的N×N矩阵。向量中的行顺序以及矩阵中的行和列应该相同。现在有了一些线性代数,你的方程组应该如下:

(I-(1 / nGames)* Sched)*评级= adjMOV

现在使用任何非线性解算器很容易解决它,我在limSolve包中使用了lsei()方法,所以你的代码应该是这样的:

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

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