2011-11-29 110 views
1

什么是在特定约束下采样数据框的最有效方法?具有约束的样本,矢量化

例如,假设我有一个姓名和薪水的目录,我该如何选择3,以使他们的总和不超过某个值。我只是使用while循环,但这似乎效率很低。

回答

1

您可能会遇到组合爆炸。这模拟了从一组20个工资组合中选择3个工资组合的平均值为60和20的薪水。它显示,从1140个组合的计数中可以发现,只有263个工资总和低于150.

> 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 
+0

根据什么数据集的样子,有可能做一些子集计算组合之前缩小它。例如,您可以摆脱任何超过总数减去两个最小值的薪水。 –

+0

是的,随机选择可以通过估计需要多少来指导。如果知道平均工资亩,三者的总和就意味着3 *亩,然后用sd()和pnorm()来决定样本的哪一部分就足够了。 –

1

一种方法是从完整的数据框开始,并举例说明一种情况。创建一个数据框,该数据框由薪水低于约束的所有案例减去选定的工资组成。从中选择第二个案例,并重复创建剩余案例集以供选择的过程。如果达到需要的数量(3),或者在任何时候数据框中没有任何案例可供选择(停止目前的操作并重新开始采样过程),请停止。

请注意,不同的方法会为包含的情况创建不同的概率分布;一般来说它不会是统一的。

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)