根据2个条件从采样中创建矢量

时间:2012-05-27 15:16:27

标签: r conditional simulation sampling

我想从向量s<-0:1440中抽取值来创建向量u,以便sum(u)=xlength(u)<k同时为kx k*max(s)>sum(u)。显然是u

有没有办法蛮力模拟许多这样的u向量?我想避免弄乱概率分布(对于抽样),我不在乎是否会丢弃一些length(u)向量。

编辑:关于P Lapointe对length(u)的好评。重要的是length(u)<k不应该被修复(u),以便向量length(u)=k具有可变长度。另一种方法是修复sum(u),但算法应该能够在u向量中随机插入(模拟)零。这将导致通过添加零,length(u)保持不变,但length(u)=k增加一(直到length(u)=k)。重要的是零随机出现(不仅仅是在模拟向量的末尾,只是为了满足{{1}})

2 个答案:

答案 0 :(得分:2)

好的,这是一个回答你问题的算法。基本上,我们正在做两个随机样本。第一个找到满足length(u)<k约束的k。使用该k,我们然后使用另一个样本来查找k-1个数字。这在算法中称为initial。当我们找到低于k-1的样本x时,我们会添加x-sum(initial)之差来完成系列。

#Inputs
x <-2500 # desired sum
s1<-0:min(1440,x) #universe
max.k <-10

k <-sample(3:(max.k-1),1) #length(u)<k, starts at 3 because low k can be problematic 
                          #with current inputs
initial <-x+1 #deliberately above limit to initialize the while
u <-s1+1      #deliberately above limit to initialize the while

while (sum(initial)>x | max(u)>max(s1)) {
initial <-sample(s1,k-1,replace=TRUE) #Find k-1 samples
u <-c(initial,x-sum(initial)) #add number that makes sum == x
}
 #example 
 > k
[1] 4
> x
[1] 2500
> u
[1]  282 1337  876    5
> sum(u)
[1] 2500

此外,如果你有一个很大的max.k,添加一个概率向量可能是一件好事,它会给样本中的低数字提供更多概率。否则,在当前示例中,如果您有多个数字超过1000,则很难获得总和== 2500。

prob1 <-1/((s1+1)*max.k ) #gives more probality to low numbers

while (sum(initial)>x | max(u)>max(s1)) {
initial <-sample(s1,k-1,replace=TRUE,prob=prob1) #Find k-1 samples
u <-c(initial,x-sum(initial)) #add number that makes sum == x
}

答案 1 :(得分:0)

我不认为你可以在没有MIP的情况下强行执行length(u)<k约束。但如果您将其修改为数字,则可以使用sample

在此示例中,前五行是样本,总和将添加到矩阵的最后一行。如果找不到匹配项,您可以增加replicate(目前为20000)的大小。您还应该检查range(all[k+1,]),看看您希望总和(x)是否在采样总和中。

set.seed(1)
s<-0:1440 #universe
k <-5 #fixed number of items in sample
x <-2500 # desired sum
all <-replicate(20000, sample(s,k,replace=TRUE))
all <-rbind(all,colSums(all))
all[,all[k+1,]==x,drop=FALSE] #gives two possible samples

      [,1] [,2]
[1,]  410  241
[2,]  189  687
[3,]  988  401
[4,]  897  983
[5,]   16  188
[6,] 2500 2500