提问人:Hack-R 提问时间:4/14/2016 最后编辑:Hack-R 更新时间:4/14/2016 访问量:54
这个已发布的 R 函数中是否存在错误,用于计算二项式多臂强盗的最优概率?
Is there an error in this published R function for computing optimality prob. of Binomial Multi-Arm Bandits?
问:
谷歌的研究员史蒂文·斯科特(Steven Scott)在《商业和工业中的应用随机模型》(Applied Stochastic Models in Business and Industry)上发表了一篇名为“现代贝叶斯视角”的论文。
在图 4 的第 649 页上,他给出了一组 3 个 R 函数,用于通过仿真计算二项式多臂强盗的最优概率:
sim.post <- function(y, n, ndraws){
k <- length(y)
ans <- matrix(nrow=ndraws, ncol=k)
no <- n-y
for(i in 1:k){
ans[,i] <- rbeta(ndraws,y[i]+1,no[i]+1)
return(ans)
}
}
prob.winner <- function(post){
k <- ncol(y)
w <- table(factor(max.col(post), levels=1:k))
return(w/sum(w))
}
compute.win.prob <- function(y, n, ndraws){
return(prob.winner(sim.post(y,n,ndraws)))
}
哪里
y
= 成功试验的次数
n
= 试验次数
ndraws
= 模拟的绘制次数
然而,每次我尝试使用这些函数时,我都会收到一个与没有列的事实相关的错误。这在他在第 648 页图 3 中给出的积分计算函数中没有问题。y
y <- c(1,2,3,4,5,6,7,8,9,10)
n <- c(10,10,10,10,10,10,10,10,10,10)
ndraws <- 50
compute.win.prob(y = y, n = n, ndraws = ndraws)
1:k 中的错误:长度为 0 的参数调用自:factor(max.col(post), 水平 = 1:k)
这个公式中是否有错别字,如果有,有什么解决办法?
答:
2赞
Andrie
4/14/2016
#1
我不知道这段代码是否有意义,但我修复了两个相当明显的错误并得到了这个。我使用注释内联标记了更改。
sim.post <- function(y, n, ndraws){
k <- length(y)
ans <- matrix(nrow=ndraws, ncol=k)
no <- n-y
for(i in 1:k){
ans[,i] <- rbeta(ndraws,y[i]+1,no[i]+1)
# return(ans) # Obviously wrong - move outside the loop
}
return(ans)
}
prob.winner <- function(post){
k <- ncol(post) # change y to post
w <- table(factor(max.col(post), levels=1:k))
return(w/sum(w))
}
compute.win.prob <- function(y, n, ndraws){
return(prob.winner(sim.post(y,n,ndraws)))
}
y <- c(1,2,3,4,5,6,7,8,9,10)
n <- c(10,10,10,10,10,10,10,10,10,10)
ndraws <- 50
compute.win.prob(y = y, n = n, ndraws = ndraws)
结果:
1 2 3 4 5 6 7 8 9 10
0.00 0.00 0.00 0.00 0.00 0.02 0.00 0.10 0.16 0.72
评论
0赞
A. Webb
4/15/2016
请注意,error 是 OP 的转录错误。在论文中,表达式没有大括号。本文还正确地缩进了 return 语句,以表明它不在 的作用域内。return(ans)
for
for
0赞
Andrie
4/15/2016
@A.Webb:谢谢你恢复了我对其他作者的信心!
评论
prob.winner
y
y
post
post
return()
sim.post()
for
ncol(y)
length(y)
prob.winner()