2015-09-16 18 views
1

我一直在瀏覽一個小時以找到針對特定問題的答案,並且沒有發現任何內容。我認爲問題在於當一個更通用的工具能夠做到這一點時,我正在尋找一個特定的問題。從小向量創建n = 2的所有獨特組合(無需替換),並且每個值在另一個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個義變量的所有獨特的組合的表,並列出了選擇的可能性。有沒有一個預製的工具可以爲我做到這一點?如果沒有,我怎麼能在一個循環內建立一個循環來計算這個?由於沒有替換方面的問題,我自己無法自行構建。

感謝

編輯1:決賽桌看起來像

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) 
+0

你是怎麼計算概率的? – Whitebeard

+0

的概率計算如下: P(1,2)= P(1獲得第一n 2秒或2獲得的第一和1秒) = P(1得到第一2秒)+ P(2得到第一個1秒) =(。4)(4/6)+(。4)(4/6) 抱歉,我無法弄清楚評論的格式。 – depizza

回答

4

不放回抽樣是凌亂。可能最好只是推出自己的功能:

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 

「排序值」 的步驟借用my answer to a related question。採取笛卡爾產品也可以用@jangorecki's & Stephanie Locke's CJ.dt function完成,如CJ.dt(dat,dat)

+0

我認爲這個問題可能會導致我建立一個通用模型,以此作爲我的第一個軟件包。我非常感謝Frank的投入,如果我在創建一個廣義模型方面取得進展,我會告訴你。 – depizza

+0

@depizza酷!我會很樂意看到結果。查看'sample'函數的內部可能是一個很好的開始,因爲它在默認情況下不會被替換。 – Frank

相關問題