这个已发布的 R 函数中是否存在错误,用于计算二项式多臂强盗的最优概率?

Is there an error in this published R function for computing optimality prob. of Binomial Multi-Arm Bandits?

提问人:Hack-R 提问时间:4/14/2016 最后编辑:Hack-R 更新时间:4/14/2016 访问量:54

问:

谷歌的研究员史蒂文·斯科特(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)

这个公式中是否有错别字,如果有,有什么解决办法?

r

评论

0赞 MrFlick 4/14/2016
肯定存在错误,因为使用了函数中未定义的变量。也许那应该是.最好直接与作者联系,了解他的代码如此具体的事情。prob.winneryypost
0赞 Hack-R 4/14/2016
@MrFlick我联系了他,但没有收到回复。我尝试插入,但结果与这种替换没有意义。post
0赞 Miff 4/14/2016
从循环内部看起来是错误的 - 如果你在循环之后移动它,并更改为它运行,但我不知道它是否正确运行。return()sim.post()forncol(y)length(y)prob.winner()

答:

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)forfor
0赞 Andrie 4/15/2016
@A.Webb:谢谢你恢复了我对其他作者的信心!