R 列出示例空间?

R 列出示例空间?,r,space,sample,urn,R,Space,Sample,Urn,我面临着这个无法解决的问题: 骨灰缸里有三个红色的球,两个绿色的球和一个白色的球。三个球按顺序从瓮中取出,无需更换。它们的颜色被记录下来。使用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

我面临着这个无法解决的问题: 骨灰缸里有三个红色的球,两个绿色的球和一个白色的球。三个球按顺序从瓮中取出,无需更换。它们的颜色被记录下来。使用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"}

你可以这样做:

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"
unique(urnsamples(x, size = 3, replace = F, ordered = T))

问题是,如果顺序很重要,那么你需要的是排列而不是组合。排列通常会迅速爆发并变得难以管理。我敢肯定这是非常低效的,但它似乎工作

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="")))
如所愿

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 

您还可以使用
prob
软件包中的
urnsamples
函数,如下所示:

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"
unique(urnsamples(x, size = 3, replace = F, ordered = T))
“prob”包中有几个样本空间和概率函数:

您可以使用以下代码打开此软件包的pdf文件:


vignette(“prob”)

这将从正确的分布中提取,但不一定会按要求生成样本空间。(除非你多次运行它,并获取观察到的唯一值,但如果停在无穷远处,你就有可能错过一个)。@flick先生——哦,说得好——没有完全理解这个问题。不幸的是,我现在没有时间去尝试-期待其他答案谢谢你,Flick先生!请不要担心它效率低下-我会花一整天的时间来弄清楚这个函数是如何做到这一点的。@Katerinabakuna希望弄清楚它是如何工作的并不太难。我对答案做了进一步的描述,希望能让答案更简单。