【问题标题】:Sample consecutive groups of elements without replacement对连续的元素组进行采样而不进行替换
【发布时间】:2012-06-11 13:32:53
【问题描述】:

我有以下数据框

ddd<-data.frame(minutes=1:15,positive=c(0,1,0,1,1,0,1,0,0,0,1,1,1,0,1)) 

使用抽样,我想找出在 k 试验中从 j 长度的 ddd$分钟的连续间隔中抽样至少一个ddd$positive 的概率是多少会出现。例如对于 j=2(2 分钟间隔),样本空间将是 ddd$minutes[1:2, 2:3, 3:4, 4:5, 5:6, 6:7, …:14:15]。但是,如果在 k 次试验的第一次中,间隔 ddd$minutes[1:2] 被采样(一次成功),则间隔 ddd$minutes[2:3] 将从采样空间中删除(在下一次随机采样之前),因为两组相交(@987654326 @ 两者都存在)。

这不是一个简单的无放回抽样问题,因为在下一次抽样发生之前,不仅要从样本空间中删除已抽样的,还应从样本空间中删除与已抽样的所有相交的组。

编辑(来自 Tim P 的评论)length(ddd$minutes) 可以介于 1000-1200 之间; k 在 1 到 16 之间。j 在 1 到 30 之间

EDIT2(蒂埃里评论)

我正在举一个例子,遵循蒂埃里的评论和回答

ddd<-data.frame(minutes=1:15,positive=c(0,1,0,1,1,0,1,0,0,0,1,1,1,0,1)) 
l=3;k=3

Sample Space S0(第一次采样前): S0:{1:3, 2:4, 3:5, 4:6, 5:7, 6:8, 7:9, 8:10, 9:11, 10:12, 11:13, 12:14 , 13:15} S0 的长度为 13 (n-k+1)

k 中的第一次试验:元素 8:10 被选中。

然后将 S1 重新定义为 S0,但不包含与采样元素 8:10 相交的元素 6:8、7:9、8:10、9:11、10:12

所以,S1 是:{ 1:3, 2:4, 3:5, 4:6, 5:7, 11:13, 12:14, 13:15}

k 中的第二次试验:元素 4:6 被选中

S2 被重新定义为没有元素 2:4, 3:5, 4:6, 5:7, 的 S1,

所以,S2:{1:3, 11:13, 12:14, 13:15}

以此类推,直到第 *k* 个样本。最终我的目标是多次运行这种采样,看看至少出现一个 ddd$success 的概率是多少。

【问题讨论】:

  • 嗨,有趣的问题。我们对 k 相对于 j 和 n = 长度(分钟)了解多少?我问是因为在您的 j = 2 示例中,如果选择了 2:3 和 5:6,则无法进行其他选择。如果你先选择这些,你永远无法扩展到 k = 3 的选择,比如说。
  • 非常好的评论。 n 可以达到 1000,也许是 1200。k 假定值从 1 到 16。j 是 1 到 30。
  • 您是否最感兴趣的是 n 在 1000 到 1200 范围内的解决方案,而不是像 n=15 这样的小情况?我有个主意……
  • 我在我的问题中提到的 ddd 只是我的一个例子。我尝试解决的问题需要 300 到 1200 之间的任何值,通常在 1000 到 1200 之间。非常感谢您的努力和时间。

标签: r sampling


【解决方案1】:

你可以使用递归函数。

n <- 1000
j <- 10
set.seed(12345)
ddd <- data.frame(minutes=seq_len(n), positive = rbinom(n, 1, 0.1))
dataset <- ddd
k <- 16
sillySampling <- function(dataset, k, j){
  i <- sample(nrow(dataset) - j + 1, 1)
  thisSample <- max(dataset$positive[i - 1 + seq_len(j)])
  if(k > 1){
    toRemove <- i + -j:j
    toRemove <- toRemove[toRemove >= 1 & toRemove <= nrow(dataset)]
    thisSample <- c(thisSample, sillySampling(dataset[-toRemove, ], k  = k - 1, j = j))
  }
  return(thisSample)
}
rowMeans(replicate(100, {
  sapply(1:16, function(k){
    sum(sillySampling(ddd, k, 10)) / k
  })
}))

【讨论】:

    【解决方案2】:

    我宁愿将数据集聚合为 k 分钟的样本。然后对聚合数据集进行采样。您希望从您的抽样中获得更多信息?您的采样方式会丢弃更多数据。

    n <- 1000
    j <- 10
    set.seed(12345)
    ddd <- data.frame(minutes=seq_len(n), positive = rbinom(n, 1, 0.1))
    ddd$group <- ddd$minutes %/% j
    AGR <- aggregate(ddd$positive, by = ddd[, "group", drop = FALSE], FUN = max)
    rowMeans(replicate(1000, {
        sapply(1:16, function(k){
            sum(sample(AGR$x, k, replace = FALSE)) / k
        })
    }))
    

    【讨论】:

    • 感谢您的回答,但在下一次采样之前重新评估样本空间并拒绝样本空间中与先前采样的元素相交的元素非常重要。在您的回答中, ddd 的样本空间的长度为 1000/10=100。这是不正确的。 ddd 的样本空间应该是 n-j+1 (见问题)。整个目的是在每次采样之前揭示样本空间并拒绝与先前选择的样本相交的元素。这是整个目的。有什么想法吗?
    • 请注意您的样本空间不是 n-j+1。这只是第一个样本的情况。假设一个样本在 1:j,一个样本在 j + 1 + (1:j)。位置 j + 1 不会出现在样本中,但由于您的规则无法选择。假设第二个样本位于 2 * j - 1 + (1:j)。那么从 j + 1 到 2 * j - 1 的所有点都不再可用。
    • 我的样本空间是n/j。当样本之间没有间隙时,您的有效样本空间为 n / j。在最坏的情况下,它将是 n / (2 * j -1)。您的有效样本空间永远不会大于 n / j。
    • 我同意你的观点,但你的解决方案没有回答我的问题。初始样本空间 S0(在第一个样本之前)是 n-j+1(n 的所有可能的 j-连续组合)。在第一个样本之后,重新定义样本空间,以减少 S1
    猜你喜欢
    • 2019-05-12
    • 1970-01-01
    • 2016-02-21
    • 2021-11-02
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多