我在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的列表,所以匹配我想要的。
但是当我这样做时
teamHome
[1]“Aldershot”
我只输出了输出中的第一支球队
levels(teamHome)
NULL
对于我的所有变量都是一样的,并且很难将结果格式化为“联赛表”
我的代码中是否有任何错误,这意味着我没有获得“teamHome”的完整列表,或者是否有方法可以访问它。
我希望我能正确解释这个问题
由于
斯蒂芬
答案 0 :(得分:2)
这是一种模拟分数的简单方法,它利用了我们可以同时预测多个协变量的新组合这一事实。
首先,让我们模拟一些数据以适应原始模型:
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')
b
和coef(mod)
的比较表明该模型相对准确地估计了真实系数(尽管我们需要一个大的样本量来实现这一点,因为许多因子水平 - 因此许多系数 - 我们正在估计。)
现在我们可以根据一些新数据预测拟合模型。我们可以使用expand.grid
返回任意数量的因子的所有组合。如果我们想要预测攻击团队,防守团队和&#34; home&#34;的所有组合,这将非常有用。
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