使用 discreteRV 包中的概率函数时出现奇怪的结果

Weird results when using the probability function from the discreteRV package

library(discreteRV)
X <- RV(c(0, 9), c(1/2, 1/2))
Y <- RV(c(-3, 1), c(1/7, 6/7))

P1 <- P(X - Y > 0) # P1 = 0.57
P2 <- P( X - Y < 0 | X > 0) # P2 = 0
P3 <- P( X - Y < 0 | Y <= 0) # P3 = 3
P4 <- P(cos(pi * X * Y) < 1/2) # doesn't compile 
P5 <- P(X ** 2 + 3 * Y >= 3) # P5 = 0.9285
P6 <- P(X - Y < X ** 2 + 3 * Y) # P6 = 0 

当我使用包 discreteRV 中的内置函数 P 时,我得到了一些非常奇怪的结果。我还尝试了一种不同的方法,并使用函数样本创建了一个离散随机变量,结果似乎还不错

Xpmf <- c(1/2, 1/2)
X <- sample(c(0, 9), size = 10000, replace = TRUE, prob = Xpmf)
Ypmf <- c(1/7, 6/7)
Y <- sample(c(-3, 1), size = 10000, replace = TRUE, prob = Ypmf)
P1 <- mean(X - Y > 0) # P1 = 0.57
P2 <- mean( X - Y < 0 | X > 0) # P2 = 0.92
P3 <- mean( X - Y < 0 | Y <= 0) # P3 = 0.56 
P4 <- mean(cos(pi * X * Y) < 1/2) # P4 = 0.50
P5 <- mean(X ** 2 + 3 * Y >= 3) # P5 = 0.92
P6 <- mean(X - Y < X ** 2 + 3 * Y) # P6 = 0.92 

看来 P() 函数不能像您输入的那样采用 or 运算符 (|)。您可以改为对概率求和,就像这里的 P3 等于 0.57116,非常接近到你的模拟。

P(X - Y < 0) + P(Y <= 0)

使用更多的模拟,我得到了 0.5712,所以看起来概率求和就像你想要的那样有效。

xS <- sample(c(0,9), size = 1000000, replace = TRUE, prob = c(0.5, 0.5))
yS <- sample(c(-3,1), size = 1000000, replace = TRUE, prob = c(1/7, 6/7))
mean(xS - yS < 0 | yS <= 0)

编辑:

正如第一条评论所指出的,您第二种方法中的 | 是逻辑或,因此它不计算条件概率。因此,我之前的回答具有误导性,我认为@StephaneLaurent 的回答提供了所有线索。

我将介绍第二种方法的结果,以便您了解会发生什么:

set.seed(1)
Xpmf <- c(1/2, 1/2)
X_sampled <- sample(c(0, 9), size = 10000, replace = TRUE, prob = Xpmf)
Ypmf <- c(1/7, 6/7)
Y_sampled <- sample(c(-3, 1), size = 10000, replace = TRUE, prob = Ypmf) 

让我们看看那些向量:

head(X_sampled)
[1] 9 9 0 0 9 0
head(Y_sampled)
[1] 1 1 1 1 1 1

现在您要计算 mean(X_sampled - Y_sampled < 0 | X_sampled > 0)。让我们分解一下:

head(X_sampled > 0)
[1]  TRUE  TRUE FALSE FALSE  TRUE FALSEn # this simply reflects 9, 9, 0, 0... 
head(X_sampled - Y_sampled < 0)
[1] FALSE FALSE  TRUE  TRUE FALSE  TRUE # this reflects 9 - 1, 9 - 1, 0 - 1...

因此 X_sampled - Y_sampled < 0 | X_sampled > 0 将查看所有位置并确定 X_sampledX_sampled - Y_sampled < 0 在该位置是否为真。结果 TRUEs 的比例为 0.9292。

当你这样做时:

Xpmf <- c(1/2, 1/2)
X <- sample(c(0, 9), size = 10000, replace = TRUE, prob = Xpmf)
Ypmf <- c(1/7, 6/7)
Y <- sample(c(-3, 1), size = 10000, replace = TRUE, prob = Ypmf)
P2 <- mean( X - Y < 0 | X > 0) # P2 = 0.92

不是计算条件概率的近似值P( X - Y < 0 | X > 0)mean( X - Y < 0 | X > 0) 中的 | 是逻辑或,这不是条件。很容易检查 X-YX>0 时永远不会 <0,因此 P2 的正确值是 0.

高于3的概率听起来像是一个错误。或者你需要设置联合分布jointRV,不知道discreteRV默认是不是独立的


编辑

包默认不假设独立:

> P((X == 0) %AND% (Y == 1)) # should be 1/2*6/7 if independence
[1] 0

所以你必须使用jointRV

__

编辑

您可以指定独立性如下:

XandY <- jointRV(
  outcomes = list(c(0,9), c(-3,1)), 
  probs = c(t(outer(c(1/2,1/2), c(1/7,6/7))))
)
X <- marginal(XandY, 1)
Y <- marginal(XandY, 2)

但这并不能解决问题:

P( X - Y < 0 | Y <= 0) # still 3

那是因为 X-YY 不是在同一个样本上定义的 space。

可以这样得到这个条件概率:

XminusY_and_Y <- joint(X-Y, Y)
XminusY <- marginal(XminusY_and_Y, 1)
Y <- marginal(XminusY_and_Y, 2)
P(XminusY < 0 | Y <= 0) # 0.3673469

不太方便...