4

我想从一个向量中采样值s<-0:1440来创建一个向量u,以便sum(u)=x同时length(u)<k,对于给定的 kx。显然k*max(s)>sum(u)

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

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

4

2 回答 2

3

好的,这是一个回答你问题的算法。基本上,我们正在做两个随机样本。第一个找到满足length(u)<k约束的 ak。使用该 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 的数字,则很难得到 sum==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
}
于 2012-05-28T02:16:20.587 回答
0

length(u)<k我不认为你可以在没有 MIP的情况下强行强制约束。但是,如果您将其固定为一个数字,则可以使用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
于 2012-05-27T18:14:01.060 回答