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
从您表述问题的方式来看,dataset1
和 dataset2
被视为抽取 RV 的人群。在那种情况下,蒙哥马利是正确的,您可以对 dataset1
和 dataset2
之间的所有成对比较进行平均:
mean(outer(dataset1, dataset2, ">"))
不过,对于更大的数据集,更有效的方法是使用连接向量的顺序:
d12 <- order(c(dataset1, dataset2))
sum(cumsum(d12 > length(dataset1))[d12 <= length(dataset1)])/length(dataset1)/length(dataset2)
另一方面,如果 dataset1
和 dataset2
代表来自父分布的样本,并且您想知道从 X ~ distribution1 中随机选择的高度大于 a 的概率从 Y ~ distribution2 中随机选择高度,这将取决于您 knowledge/assumptions 关于基础分布。例如,如果它们都是均值 mu1
、mu2
和标准差 sigma1
、sigma2
已知的独立正态分布,则 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
方法使用了更多的内存。
我有两个数据集,其中包含存储在数据框中的人的身高(以及其他详细信息):
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
从您表述问题的方式来看,dataset1
和 dataset2
被视为抽取 RV 的人群。在那种情况下,蒙哥马利是正确的,您可以对 dataset1
和 dataset2
之间的所有成对比较进行平均:
mean(outer(dataset1, dataset2, ">"))
不过,对于更大的数据集,更有效的方法是使用连接向量的顺序:
d12 <- order(c(dataset1, dataset2))
sum(cumsum(d12 > length(dataset1))[d12 <= length(dataset1)])/length(dataset1)/length(dataset2)
另一方面,如果 dataset1
和 dataset2
代表来自父分布的样本,并且您想知道从 X ~ distribution1 中随机选择的高度大于 a 的概率从 Y ~ distribution2 中随机选择高度,这将取决于您 knowledge/assumptions 关于基础分布。例如,如果它们都是均值 mu1
、mu2
和标准差 sigma1
、sigma2
已知的独立正态分布,则 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
方法使用了更多的内存。