Странные результаты при использовании функции вероятности из пакета discreteRV - PullRequest
1 голос
/ 28 апреля 2020
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 

Когда я использую встроенную функцию P из пакета discreteRV , я получаю действительно странные результаты. Я также попробовал другой подход и использовал образец функции для создания дискретной случайной величины, и результаты выглядят нормально

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 

Ответы [ 3 ]

2 голосов
/ 28 апреля 2020

Когда вы делаете:

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 никогда не бывает <0, когда X>0, поэтому правильное значение P2 равно 0.

Вероятность выше 3 звучит как ошибка. Или, может быть, вам нужно установить совместное распространение с jointRV, я не знаю, предполагает ли discreteRV независимость по умолчанию.


EDIT

Пакет не предполагает независимости по умолчанию:

> 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 не определены в одном и том же пробном пространстве.

Вы можете получить эту условную вероятность следующим образом:

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

Не очень удобно ...

1 голос
/ 28 апреля 2020

РЕДАКТИРОВАТЬ:

Как указано в первом комментарии, | в вашем втором подходе является логическим ИЛИ, поэтому он не рассчитывает условные вероятности. Поэтому мой предыдущий ответ вводил в заблуждение, и я думаю, что ответ @StephaneLaurent дает все подсказки.

Я go расскажу, как результаты вашего второго подхода позволят вам увидеть, что происходит:

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 с составляет 0,9292.

1 голос
/ 28 апреля 2020

Похоже, что функция P() не может принимать оператор или (|), как вы ввели. Вместо этого вы можете суммировать вероятности, как здесь, с 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)
...