A 组随机变量的概率大于 B 组

Probability of random variable from group A being larger than group B

我有两个数据集,其中包含存储在数据框中的人的身高(以及其他详细信息):

dataset1$height
dataset2$height

我需要知道从数据集 1 中随机选择的高度大于从数据集 2 中随机选择的高度的概率。

我知道我正在尝试计算 P(X-Y)>0 此处,但我不确定如何将其放入 R 中,以及如何获得 P 的答案(即概率是多少dataset1$height - dataset2$height > 0).

我已经计算了每个数据集中身高的均值、方差和标准差,但我只是不确定如何将这些计算结果放入得出概率的公式中。

为了可重复性,以下样本可以代表我所拥有的:

dataset1 = rnorm(100, mean = 11, sd = 2)
dataset2 = rnorm(100, mean = 10, sd = 2)
mean1 = mean(dataset1)
mean2 = mean(dataset2)
var1 = var(dataset1)
var2 = var(dataset2)
sdev1 = sd(dataset1)
sdev2 = sd(dataset2)
Probability = mean(dataset2)/mean(dataset1)
Probability

从您表述问题的方式来看,dataset1dataset2 被视为抽取 RV 的人群。在那种情况下,蒙哥马利是正确的,您可以对 dataset1dataset2 之间的所有成对比较进行平均:

mean(outer(dataset1, dataset2, ">"))

不过,对于更大的数据集,更有效的方法是使用连接向量的顺序:

d12 <- order(c(dataset1, dataset2))
sum(cumsum(d12 > length(dataset1))[d12 <= length(dataset1)])/length(dataset1)/length(dataset2)

另一方面,如果 dataset1dataset2 代表来自父分布的样本,并且您想知道从 X ~ distribution1 中随机选择的高度大于 a 的概率从 Y ~ distribution2 中随机选择高度,这将取决于您 knowledge/assumptions 关于基础分布。例如,如果它们都是均值 mu1mu2 和标准差 sigma1sigma2 已知的独立正态分布,则 X - Y 的分布将是正态的均值 mu1 - mu2 和标准差 sqrt(sigma1^2 + sigma2^2)。 P(X > Y) 将是:

pnorm(0, mean = mu1 - mu2, sd = sqrt(sigma1^2 + sigma2^2), lower.tail = FALSE)

在您的示例参数中使用更大的向量,这两种方法给出相似的答案:

> set.seed(94)
> mu1 <- 11; mu2 <- 10; sigma1 <- 2; sigma2 <- 2
> dataset1 = rnorm(1e6, mean = mu1, sd = sigma1)
> dataset2 = rnorm(1e6, mean = mu2, sd = sigma2)
> d12 <- order(c(dataset1, dataset2)); sum(cumsum(d12 > length(dataset1))[d12 <= length(dataset1)])/length(dataset1)/length(dataset2)
[1] 0.6384645
> pnorm(0, mean = mu1 - mu2, sd = sqrt(sigma1^2 + sigma2^2), lower.tail = FALSE)
[1] 0.6381632

我们可以利用 Pr(X>Y) = 1-E[F_X(Y)] 的事实来创建一个计算概率的有效函数。请注意,使用 outer() 的其他答案会增加内存使用量,因为它们会创建一个巨大的 Nx × Ny 矩阵。这会很慢。

# sample some data, but with discrete values 
# just to check that it works
set.seed(1)

# Make Ns big to see slowdown
dataset1 = rbinom(100000, 10, .2)
dataset2 = rbinom(5000, 10, .3)

system.time({
  Fx = ecdf(dataset1)
  Pr1 = 1-mean(Fx(dataset2))
})
#   user  system elapsed 
#      0       0       0  
Pr1
# [1] 0.2174595

system.time({
  Pr2 = mean(outer(dataset1, dataset2, ">"))
})
#   user  system elapsed 
#   2.19    0.28    2.47 
 
Pr2
# [1] 0.2174595

如果您分析了内存使用情况,您还会看到 outer 方法使用了更多的内存。