使用 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_sampled
或 X_sampled - Y_sampled < 0
在该位置是否为真。结果 TRUE
s 的比例为 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-Y
在 X>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-Y
和 Y
不是在同一个样本上定义的 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
不太方便...
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_sampled
或 X_sampled - Y_sampled < 0
在该位置是否为真。结果 TRUE
s 的比例为 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-Y
在 X>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-Y
和 Y
不是在同一个样本上定义的 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
不太方便...