从一个小向量创建 n=2 的所有唯一组合(无替换),每个值在另一个 vec 中都有其对应的概率

Creating all unique combinations (without replacement) of n=2 from a small vector and each value has its corresponding prob in another vec

我已经浏览了一个小时来寻找我的特定问题的答案,但没有找到任何东西。我认为问题是当更通用的工具能够执行此操作时,我正在寻找特定问题。

我是这样读取数据的:

 dat<-as.data.frame(rbind(c(1, .4),
                          c(2, .4),
                          c(3, .1),
                          c(4, .1)))
names(dat)<-c("yi", "del i")

我正在尝试创建 2 个 yi 变量的所有唯一组合的 table 并列出该选择的概率。是否有可以为我执行此操作的预构建工具?如果没有,我怎么能在循环中构建循环来计算呢?由于问题的无替换部分,我自己构建它时遇到了问题。

谢谢

编辑 1:最终的 table 看起来像

 sample    prob.     tau    v(tau)
{1,2}     .5333      etc    etc
{1,3}     .1111
{1,4}      etc
.
.
.
{3,4}"

编辑 2:

   P(1,2)=P(getting 1 first n 2 second or getting 2 first and 1 second)
         =P(getting 1 first 2 second) + P(getting 2 first 1 second)
          =(.4)(4/6)+(.4)(4/6)

没有放回的抽样很乱。可能最好为此推出自己的功能:

combos = combn(dat$yi,2)
#      [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    1    1    1    2    2    3
# [2,]    2    3    4    3    4    4

probs = combn(dat$deli,2,function(x) x[1]*x[2]*(1/(1-x[1]) + 1/(1-x[2])) )
# [1] 0.53333333 0.11111111 0.11111111 0.11111111 0.11111111 0.02222222

肯定有这个包,但我不知道。


data.table 您也可以将 dat 的笛卡尔积与自身一起从那里开始:

library(data.table)

# take Cartesian product and drop diagonal
cart <- setDT(dat)[, c(
  y = CJ(yi,yi,sorted=FALSE), 
  del = CJ(deli,deli,sorted=FALSE))
][y.V1 != y.V2]

# sort values
cart[y.V1 > y.V2, `:=`( y.V1 = y.V2, y.V2 = y.V1)]

# compute probabilities
cart[, sum( del.V1 * del.V2/(1-del.V1) ), by=.(y.V1,y.V2)]

这给出了

   y.V1 y.V2         V1
1:    1    2 0.53333333
2:    1    3 0.11111111
3:    1    4 0.11111111
4:    2    3 0.11111111
5:    2    4 0.11111111
6:    3    4 0.02222222

"sort values" 步骤借鉴自 . Taking the Cartesian product could also be done with @jangorecki's & Stephanie Locke's CJ.dt function,如 CJ.dt(dat,dat)