努力在 R 中迭代地使用另一个较大的向量从一个向量中删除值(sample.int 第一个参数无效错误)

问题描述 投票:0回答:1

我正在使用 R 在统计课上模拟 Monty Hall 问题。问题的要点是有三扇门,一扇门后面是一个奖品。另外两个有山羊。玩家选择门后,游戏节目主持人会展示其中一扇包含山羊的门,并让玩家有机会改变原来的选择。我们应该通过 10000 次实验来证明,如果玩家换门,则有 2/3 的获胜机会;如果他们坚持最初的选择,则有 1/3 的机会获胜。

值得注意的是,我的教授希望我们随机化包含奖品的门和玩家最初选择的门,这就是我的问题出现的地方。

我已经成功完成了模拟,玩家坚持他们原来的选择。现在,我正在努力创建一个函数来确定游戏节目主持人展示的门,以便玩家可以做出新的选择,排除他们原来的选择主持人展示的门。截至目前,这是我打开门的功能:

## Function to open a door
revealed_door = function(initial_choice, car_door, all_doors){
  ## if-else to determine which doors can be revealed and reveal one
  ifelse(car_door == initial_choice, sample(setdiff(all_doors, initial_choice), 1),
         setdiff(all_doors, c(initial_choice, car_door)))
}

car_door
是长度为10000的向量;每个元素都是按照1:3的比例随机抽取的。

initial_choice
是长度为10000的向量;每个元素都是按照1:3的比例随机抽取的。

all_doors
是长度为 3 的向量:c(1,2,3)。

当我稍后调用该函数时,出现以下错误:

sample.int(length(x), size, replacement, prob) 中的错误:第一个参数无效

我(显然)没有使用

sample.int
,所以我不确定为什么会出现这个错误。

此外,我尝试过:

,而不是我自己研究时看到的最常见的解决方案:

setdiff
我有时也遇到了以下错误,但我一辈子都不记得我做了什么来复制它:

只有 0 可以与负下标混合

最后,在某个时刻,我设法消除了所有错误,但揭示向量填充了

ifelse(car_door == initial_choice, sample(all_doors[-initial_choice], 1), all_doors[-c(initial_choice, car_door)])

 值,所以显然结束概率最终为 0。

这是我最近处理切换的代码块,以防有帮助:

NA
但是,我相信我的问题源于这样一个事实:我不知道如何在 

switch_wins = 0 ## Switch doors reveal = revealed_door(initial_choice, car_door, all_doors) new_choice = all_doors[-c(reveal, initial_choice)] ## Count wins ifelse(car_door == new_choice, switch_wins + 1, switch_wins) total_switch_wins = sum(switch_wins) ## Divide wins by n to calculate probability switch_win_prob = total_switch_wins / 10000 print(switch_win_prob)

 函数中迭代地使用 
all_doors
initial_choice
 中删除值,但这就是我在调试过程中所得到的。如果允许我保持 
reveal_door
 不变,我就不会遇到这个问题,因此我上面有评论。

如有任何帮助,我们将不胜感激!

r statistics
1个回答
0
投票
这是我的方法

initial_choice
    
© www.soinside.com 2019 - 2024. All rights reserved.