2014-09-05 57 views
1

我面臨這個無法解決的問題: 一個甕包含三個紅球,兩個綠球和一個白色。三個球依次繪製而不從骨灰盒中取代。他們的顏色被記錄。列出使用R.列出樣本空間?

我試圖樣品空間:

combn(c(rep("R",3), rep("G",2),"W"),3) 

但此函數不佔元素的順序和讀出三個R等R1,R2和R3。結果是輸出中有重複的行。

我需要的功能,產生這種序列:

Ω = {"GGR" "GGW" "GRG" "GRR" "GRW" "GWG" "GWR" "RGG" "RGR" "RGW" "RRG" "RRR" "RRW" "RWG" "RWR" "WGG" "WGR" "WRG" "WRR"} 

回答

0

你可以做這樣的事情:

balls<-c(rep("R",3), rep("G",2),"W") 
paste(sample(balls,3), collapse="") #this collapses your output so rather 
            # than "G" "G" "W", it comes back as: 

#[1] "GGW" 

做例如10次​​

replicate(10, (paste(sample(balls,3), collapse=""))) 

# [1] "RGW" "RWR" "RGR" "WRG" "RRW" "RRW" "RWR" "RGG" "GRR" "RRR" 
+2

這將從正確的分佈繪製每個元素的概率,但它不一定會根據請求生成樣本空間。 (除非你多次運行它,並採取觀察到的獨特的價值,但停止短暫的無窮大有可能會錯過一次)。 – MrFlick 2014-09-05 19:24:23

+0

@MrFlick - 哦,好點 - 沒有完全解決問題。很遺憾,現在沒時間去試試吧 - 期待其他答案 – jalapic 2014-09-05 19:28:05

+0

謝謝你的努力! – 2014-09-07 08:10:11

3

事情是,如果訂單很重要,那麼你想排列而不是組合。排列通常迅速爆炸並變得難以管理。我相信這是非常低效的,但它似乎工作。

balls<-c(rep("R",3), rep("G",2),"W") 

permn <- function(x, n) { 
    if (n<1) return(vector(class(x))) 
    do.call(rbind, lapply(1:length(x), function(i) { 
     cbind(x[i], permn(x[-i], n-1)) 
    }) 
    ) 
} 
x <- permn(balls, 3) 
unique(sort(apply(x, 1, paste, collapse=""))) 

並將其返回

[1] "GGR" "GGW" "GRG" "GRR" "GRW" "GWG" "GWR" "RGG" "RGR" "RGW" "RRG" 
[12] "RRR" "RRW" "RWG" "RWR" "WGG" "WGR" "WRG" "WRR" 

如所期望。

permn函數遞歸地工作。您傳入值列表(x)以及要從列表中選擇多少項(n)。如果您至少選擇了一個值,那麼我們設置一個循環來選擇每個元素。然後,在我們選擇了一個值後,我們需要從剩餘的項目中選擇更多的n-1。所以我們再次調用函數,這次刪除了我們剛選擇的值,並減少了我們需要選擇的項目數量。

到目前爲止,我們實際上忽略了集合中的值(我們假定它們都是唯一的)。但是因爲在這種情況下,某種顏色的所有球都難以區分,所以我們需要摺疊我們的結果。由於permn實際上會返回一個矩陣,因此我們會將行從c("G","G","R")這樣的向量摺疊爲字符串"GGR",然後只取這些唯一值。

當然,並不是每一個結果都是相同的可能性。如果我們想看看他們是如何發生的時候,你可以做

sort(prop.table(table(apply(x, 1, paste, collapse="")))) 

這也將計算樣本空間

 GGW  GWG  WGG  GGR  GRG  GRW 
0.01666667 0.01666667 0.01666667 0.05000000 0.05000000 0.05000000 
     GWR  RGG  RGW  RRR  RRW  RWG 
0.05000000 0.05000000 0.05000000 0.05000000 0.05000000 0.05000000 
     RWR  WGR  WRG  WRR  GRR  RGR 
0.05000000 0.05000000 0.05000000 0.05000000 0.10000000 0.10000000 
     RRG 
0.10000000 
+0

謝謝MrFlick! 請不要擔心它效率低下 - 我會花一整天的時間搞清楚這個功能是如何實現的。 – 2014-09-07 08:08:21

+0

@KaterinaBakunina希望找出它的工作原理並不難。我已經給答案添加了進一步的描述,希望能夠讓它更容易。 – MrFlick 2014-09-07 15:25:00