2017-10-17 111 views
1

采样中提取字符的概率我有定义了以下变量:该随机R中

a <- as.character(1:10) 
b <- 100 
c <- 10 
probs <- c(0.3, 0.3, 0.3, rep(0.1/7, 7)) 
min <- 5 
max <- 10 

我试图找出如何子集在下面的代码的“probs”参数与所述字符对应被随机抽样(即随机抽样字符5:10)

sample(a[min:max], size = round(b/c), replace = TRUE, prob = probs[???]) 

我不认为probs [分钟:MAX]将工作,因为它应该,但我不确定如何找出肯定,如果它确实如此。更复杂的情况是,如果我想是这样

a[c(1, 3, 5)] 

然后,我会需要“probs”对应的字符1,3,和5

我一直在使用probs [得到(paste0(试过。 ..))],但这不是最直接和最有效的方式。反正它不起作用。

任何意见表示赞赏。

+0

难道你不能重新调整probs [min:max]/sum(probs [min:max])'总和为1吗? –

+0

@RuiBarradas虽然这提出了一个我忽略提及的观点,但我不认为prob中的概率将与随机抽样的字符标签相对应... –

+0

是的,我相信它会。或者至少我读了'sample'的帮助页面:'prob - 概率权重矢量,用于获取被抽样矢量的元素。“还要注意,概率自动调整为1,所以代码在我的评论中将是无用的。 –

回答

2

您只需将子集probs设置为与a相同的子集,例如,

index = min:max 
sample(a[index], size = round(b/c), replace = TRUE, prob = probs[index]) 

对于更复杂的场景,请设置index = c(1,3,5)

你可以看到,这个工程做一个模拟和比较真实的概率观测到的概率:

set.seed(123) 
tmp = sample(a[min:max], size = 10000, replace = TRUE, prob = probs[min:max]) 
table(tmp)/10000 # the observed probabilities 

观察到的概率大致都是平等的,这是真正的概率是所有平等一致的。

如果你看看sample的帮助文件,你会发现prob不需要总和为1.该函数将负责标准化概率。