带约束的样本,矢量化

时间:2011-11-29 21:48:01

标签: r

在特定约束条件下对数据帧进行采样的最有效方法是什么?

例如,假设我有一个名称和工资目录,如何选择3以使其总和不超过某个值。我只是使用了一个while循环,但这似乎效率很低。

3 个答案:

答案 0 :(得分:1)

一种方法是从完整的数据框开始并对一个案例进行抽样。创建一个数据框,其中包含薪水小于约束减去所选薪水的所有案例。从中选择第二个案例并重复创建剩余案例集的过程以供选择。如果你得到你需要的号码就停止(3),或者在任何时候数据框中都没有可供选择的情况(拒绝你到目前为止的情况并重新开始采样程序)。

请注意,不同的方法会为包含的案例创建不同的概率分布;通常它不会是统一的。

答案 1 :(得分:1)

您的数据集有多大?如果它很小(而且实际上很小,取决于你的硬件),你可以只列出所有三个组,计算总和,并从中进行采样。

## create data frame
N <- 100
salary <- rnorm(N))
## list all possible groups of 3 from this
x <- combn(salary, 3)
## the sum
sx <- colSums(x)
sxc <- sx[sx<1]
## sampling with replacement
sample(sxc, 10, replace=TRUE) 

答案 2 :(得分:1)

你可能面临组合爆炸。这模拟了一组20的EE的3种组合的选择,其中工资的平均值为60和sd 20.它表明,从1140组合的枚举中,你会发现只有263的工资总和小于150。 / p>

> sum( apply( combn(1:20,3) , 2, function(x) sum(salry[x, "sals"]) < 150))
[1] 200
> set.seed(123)

> salry <- data.frame(EEnams = sapply(1:20 , 
                                       function(x){paste(sample(letters[1:20], 6) , 
                                             collapse="")}), sals = rnorm(20, 60, 20))
> head(salry)
  EEnams     sals
1 fohpqa 67.59279
2 kqjhpg 49.95353
3 nkbpda 53.33585
4 gsqlko 39.62849
5 ntjkec 38.56418
6 trmnah 66.07057

> sum( apply( combn(1:NROW(salry), 3) , 2, function(x) sum(salry[x, "sals"]) < 150))
[1] 263

如果您有1000个EE,那么您将拥有:

> choose(1000, 3)   # Combination possibilities
# [1] 166,167,000   Commas added to output