我在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 r的列表,与我想要的匹配。
但是当我做的时候
teamHome
1“奥尔德赛”
我只得到第一组在我的输出和当我这样做
levels(teamHome)
NULL这对于我所有的变量来说都是一样的,并且使得很难将结果格式化为“排行榜”。
我的代码中是否有任何错误意味着我没有得到"teamHome“的完整列表,或者是否有一个方法来访问这个列表。
我希望我正确地解释了这个问题。
谢谢
斯蒂芬
发布于 2014-03-19 21:40:39
这里有一个简单的方法来模拟分数,它利用了这样一个事实,即我们可以同时预测多个新的协变量组合。
首先,让我们模拟一些数据以适应原始模型:
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返回任意数量因素的所有组合。这是有用的,如果我们想要预测所有的组合进攻队,防守队,和“主场”。
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 0https://stackoverflow.com/questions/22490544
复制相似问题