首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用discreteRV包中的概率函数时的奇怪结果

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

Stack Overflow用户
提问于 2020-04-28 09:03:36
回答 3查看 53关注 0票数 1
代码语言:javascript
运行
复制
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时,我得到了一些非常奇怪的结果。我还尝试了一种不同的方法,并使用函数示例创建了一个离散的随机变量,结果看起来不错。

代码语言:javascript
运行
复制
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 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-28 09:58:29

当你这样做时:

代码语言:javascript
运行
复制
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)的近似。| in mean( X - Y < 0 | X > 0)是一个逻辑OR,这不是一个条件条件。在X-Y时,很容易检查X>0是否为<0,因此P2的正确值是0

3更高的概率听起来像个bug。或者您需要使用jointRV设置联合发行版,我不知道discreteRV默认是否独立。

编辑

默认情况下,包不具有独立性:

代码语言:javascript
运行
复制
> P((X == 0) %AND% (Y == 1)) # should be 1/2*6/7 if independence
[1] 0

所以你必须使用jointRV

__

编辑

您可以按以下方式指定独立性:

代码语言:javascript
运行
复制
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)

然而,这并不能解决这个问题:

代码语言:javascript
运行
复制
P( X - Y < 0 | Y <= 0) # still 3

这是因为X-YY没有在相同的示例空间上定义。

您可以得到这个条件概率如下:

代码语言:javascript
运行
复制
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

不是很方便..。

票数 2
EN

Stack Overflow用户

发布于 2020-04-28 09:43:34

看来,P()函数不能像您输入的那样接受or运算符(|)。您可以将概率相加,如这里的P3,它等于0.57116,非常接近您的模拟。

代码语言:javascript
运行
复制
P(X - Y < 0) + P(Y <= 0)

使用更多的模拟,我得到了0.5712,所以它似乎总结的概率,这种方式工作,如你所愿。

代码语言:javascript
运行
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2020-04-28 09:44:19

编辑:

正如第一个注释所指出的,第二个方法中的|是一个逻辑OR,因此它不计算条件概率。因此,我先前的回答是误导的,我认为@StephaneLaurent的回答提供了所有的线索。

我将介绍第二种方法的结果,这样您就可以看到发生了什么:

代码语言:javascript
运行
复制
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) 

让我们看看这些向量:

代码语言:javascript
运行
复制
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)。让我们分解这个:

代码语言:javascript
运行
复制
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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61476448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档