从一个小向量创建 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)
。
我已经浏览了一个小时来寻找我的特定问题的答案,但没有找到任何东西。我认为问题是当更通用的工具能够执行此操作时,我正在寻找特定问题。
我是这样读取数据的:
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" 步骤借鉴自 CJ.dt
function,如 CJ.dt(dat,dat)
。