【问题标题】:Create a vector from sampling based on 2 conditions根据 2 个条件从采样创建向量
【发布时间】:2012-06-02 06:03:15
【问题描述】:

我想从向量s<-0:1440 中采样值以创建向量u,以便sum(u)=xlength(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

【问题讨论】:

  • 这看起来像是带有基数约束 (k) 的 MIP(混合整数规划)。您可以在 cran.r-project.org/web/views/Optimization.html 上尝试 MIP 求解器
  • “一些”是多少?您可以使用少于k 的术语对大量向量进行采样,然后丢弃所有不等于x 的向量。
  • 有人能给我指出一些 MIP(初学者)的阅读材料吗?

标签: r conditional simulation sampling


【解决方案1】:

我认为你不能在没有 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

【讨论】:

  • 我明白你的意思,但这太慢了。 非常重要的是 length(u) 不是固定的。另一种方法是固定长度(u),但算法可以随机向 u 插入(模拟)零(这将导致通过向 u 添加 0,总和将保持不变但长度会增加)。
【解决方案2】:

好的,这是一个回答您问题的算法。基本上,我们正在做两个随机样本。第一个找到满足length(u)&lt;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 的数字,则很难得到 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
}

【讨论】:

    猜你喜欢
    • 2020-06-04
    • 1970-01-01
    • 2022-06-28
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    相关资源
    最近更新 更多