Перечислите пространство образца?

Я столкнулся с этим упражнением, которое не могло решить: урна содержит три красных шара, два зеленых шарика и один белый. Три шарика вырисовываются последовательно без замены из урны. Их цвета записываются. Перечислите пространство образца с помощью 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"}
+2
источник поделиться
2 ответа

Дело в том, что если порядок имеет значение, то вам нужны перестановки, а не комбинации. Перестановки обычно взрываются быстро и становятся неуправляемыми. Я уверен, что это крайне неэффективно, но, похоже, это работает.

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 самом деле возвращает матрицу, мы 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 
+3
источник

вы можете сделать что-то вроде этого:

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"
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос