Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 模拟抛硬币_R_Loops - Fatal编程技术网

R 模拟抛硬币

R 模拟抛硬币,r,loops,R,Loops,在这篇文章中,有一篇文章提到“头”出现后出现“头”的概率不是0.5(假设是一枚公平的硬币),这对“热手”神话提出了挑战。我想证明给自己看 因此,我正在对7次抛硬币的模拟进行编码,并在第一个硬币头之后计算硬币头的数量,当然前提是有第一个硬币头 我提出了以下几行R代码,但我仍然得到NA值,并希望得到一些帮助: n <- 7 # number of tosses p <- 0.5 # probability of heads sims <

在这篇文章中,有一篇文章提到“头”出现后出现“头”的概率不是0.5(假设是一枚公平的硬币),这对“热手”神话提出了挑战。我想证明给自己看

因此,我正在对7次抛硬币的模拟进行编码,并在第一个硬币头之后计算硬币头的数量,当然前提是有第一个硬币头

我提出了以下几行R代码,但我仍然得到NA值,并希望得到一些帮助:

n <- 7              # number of tosses
p <- 0.5            # probability of heads
sims <- 100         # number of simulations

Freq_post_H <- 0    # frequency of 'head'-s after first 'head' 
    for(i in 1:sims){
        z <- rbinom(n, 1, p)
        if(sum(z==1)!=0){
        y <- which(z==1)[1]
        Freq_post_H[i] <- sum(z[(y+1):n])/length((y+1):n) 
        }else{
            next()
        }
    Freq_post_H
    }
Freq_post_H

n
n这是他们在报纸上所做的模拟:

nsims <- 10000
k <- 4
set.seed(42)
sims <- replicate(nsims, {
  x <- sample(0:1, k, TRUE)
  #print(x)
  sum( # sum logical values, i.e. 0/1
   diff(x) == 0L & # is difference between consecutive values 0? 
     x[-1] == 1L ) / # and are these values heads? 
       sum(head(x, -1) == 1L) #divide by number of heads (without last toss)
})

mean(sims, na.rm = TRUE)  #NaN cases are samples without heads, i.e. 0/0
#[1] 0.4054715

k <- 7

sims <- replicate(nsims, {
  x <- sample(0:1, k, TRUE)
  #print(x)
  sum(diff(x) == 0L & x[-1] == 1L) / sum(head(x, -1) == 1L) 
})

mean(sims, na.rm = TRUE) 
#[1] 0.4289402

nsims这是模拟100次公平硬币投掷30000次

counter <- 1 
coin <- sum(rbinom(100,1,0.5)) 
while(counter<30000){
  coin <- c(coin, sum(rbinom(100,1,0.5)))
  counter <- counter+1
}

下面是R中的一些示例代码,使用示例函数模拟R中的公平抛硬币。可以根据需要对其进行修改,以模拟任意数量的翻转。由于每次抛硬币的结果都是独立的,因此对于任何给定的抛硬币,头部或尾部的概率始终为0.5。在多次抛硬币时,至少一半的硬币正面(或反面)的概率将收敛到0.5。得到半正面和半反面的概率接近0

n <- 7
count_heads <- 0
coin_flip <- sample(c(0,1), n, replace = TRUE)
for(flip_i in 1:n)
{
  if(coin_flip[flip_i] == 1)
  {
    count_heads = count_heads + 1
  }
}
count_heads/n

n我不明白你为什么要为此模拟第一次抛硬币。你不能简单地做一下rbinom(sims,6,0.5)
Freq\u post\u H
不受循环的影响。你的意思是要让价值发生某种变化吗?你可能还必须考虑到最后一次掷硬币是第一个人头<代码>z在文章中提到一篇文章,本质上是说“头”出现后出现“头”的概率不是0.5(假设是一枚公平的硬币),这对“热手”神话提出了挑战。我想证明给自己看。@Pierrela是真的。这使问题无效。然而,即使我犯了一个愚蠢的错误,没有增加计数(I+1)来消除已经实现的“头”,我也得到了NA。是的。那是我的意图。。。非常感谢。我只是通过复制和粘贴来运行您的代码,但我没有在最后执行
的意思,而是简单地打印
Prob\u post\H
。。。我确实得到了NA'sNA表示跳过的迭代。我不知道,因为我从未使用
next
命令。这绝对解决了这个问题。谢谢。
next
不是函数(从技术上讲,它是函数,但不需要括号)。它也不需要,因为您可以简单地省略
else
部分。我认为这可能是有意义的。我和牙医有预约,得去看牙医。我稍后再谈。你能给我一笔奖金,告诉我什么是
diff(x)==0L
?我不知道
L
diff
。谢谢<代码>差异
计算向量元素之间的差异。一个后跟
L
的数字表示一个整数值(相对于数字/双精度)。你能告诉我我是英国人成功在做什么吗?这已经超出我的理解了…我已经添加了一些评论。谢谢。我看了“L”,现在看到了整数和数字之间的区别,但我不完全理解为什么需要在这里包含它。此外,你是否仍然认为即使在你的模拟和阅读了《纽约时报》引用的论文后,这一比例仍为50%?看起来它比0.5低了一点,是吗?
counter <- 1 
coin <- sum(rbinom(100,1,0.5)) 
while(counter<30000){
  coin <- c(coin, sum(rbinom(100,1,0.5)))
  counter <- counter+1
}
 hist(coin)
 str(coin)
 mean(coin)
 sd(coin)
n <- 7
count_heads <- 0
coin_flip <- sample(c(0,1), n, replace = TRUE)
for(flip_i in 1:n)
{
  if(coin_flip[flip_i] == 1)
  {
    count_heads = count_heads + 1
  }
}
count_heads/n