两个编码用于相同的目的但给出不同的结果

时间:2017-03-21 14:16:46

标签: r

以下两大块代码执行相同的工作,但会给出不同的结果。运行代码需要一到两分钟:

# chunk 1:
n <- 10000000
set.seed(1)
a <- rbinom(n, 1, .5)
b1 <- (a==0) * rexp(n, 1/182.5)
b2 <- (a==1) * rexp(n, 1/365)
e <- (a==1) * rbinom(n, 1, .5)
b3 <- (e==1) * rexp(n, 1/365)
g <- (1-a)*b1 + a*(b2+b3)
p <- length(g[g>150])/length(g)
p

# chunk 2:
n <- 10000000
set.seed(1)
a <- rbinom(n, 1, .5)
b1 <-  rexp(n, 1/182.5)
b2 <-  rexp(n, 1/365)
e <-  rbinom(n, 1, .5)
b3 <-  rexp(n, 1/365)
g <- (1-a)*b1 + a*(b2+b3)
p <- length(g[g>150])/length(g)
p

这两个块是相同的,因为a等于一,(1-a)*b1中的g部分将消失,b1是否等于无关紧要零或任何其他值。

同样,如果a为1,a*(b2+b3)中的g部分将会消失。因此,如果b2的对应元素为零,则a的元素是零还是其他值无关紧要。

但为什么2块的结果不同?

1 个答案:

答案 0 :(得分:2)

问题是,块1中的(a==0)(a==1)语法看起来像是导致与块2中相同的数值结果,但它们会导致命令g[g>150]切片{ {1}}在块1中不同于在块2中切片。

在块1中,g确保将所有不需要的索引设置为零。在块2中,这些索引处仍然存在值,其中一些值可能导致(a==0) * rexp(n, 1/182.5)大于150.因此,g对于块2来说是一个更大的数字,因此您得到一个不同的答案。