【问题标题】:Probability of random variable from group A being larger than group BA组随机变量大于B组的概率
【发布时间】:2021-10-19 03:07:23
【问题描述】:

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

dataset1$height
dataset2$height

我需要知道从 dataset1 中随机选择的高度大于从 dataset2 中随机选择的高度的概率。

我知道我正在尝试在这里计算 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

【问题讨论】:

  • 您在寻找t.testalternative = "greater" 的功能吗?
  • 如果您不需要精确值,请尝试蒙特卡罗模拟:{N <- 20000000; sum(sample(dataset1, N, TRUE) > sample(dataset2, N, TRUE))/N} 如需精确公式,请查看:stats.stackexchange.com/questions/50501/…
  • 这是一个准确的答案,但可能不是您想要的:{M <- outer(dataset1, dataset2, ">"); sum(M) / length(M)}

标签: r probability


【解决方案1】:

从您提出问题的方式来看,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 ~ 分布 1 中随机选择的高度大于从 Y ~ 中随机选择的高度的概率分布2,这取决于您对基础分布的知识/假设。例如,如果它们都是具有已知均值 mu1mu2 和标准差 sigma1sigma2 的独立正态分布,那么 X - Y 的分布将是正态分布,均值 mu1 - mu2 和标准差 @ 987654334@。 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

【讨论】:

    【解决方案2】:

    我们可以利用 Pr(X>Y) = 1-E[F_X(Y)] 来创建一个计算概率的有效函数。请注意,使用outer() 的其他答案会增加内存使用量,因为它们会创建一个巨大的 Nx by 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 方法使用更多的内存。

    【讨论】:

    • ecdf 使它非常简洁。一班:mean(ecdf(dataset2)(dataset1))
    • 您必须小心离散值,其中 Pr(xx)(ECDF 计算 Pr(x
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 2020-07-02
    • 2022-01-08
    • 2020-09-14
    • 1970-01-01
    相关资源
    最近更新 更多