对无连接的连续元素组进行采样

时间:2012-06-11 13:32:53

标签: r sampling

我有以下数据框

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 $分钟的连续间隔中取样的概率至少为{{1 }} 会出现。例如,对于 j = 2 (2分钟间隔),样本空间将是 ddd$positive。但是,如果在k个试验的第一个中,间隔ddd$minutes[1:2, 2:3, 3:4, 4:5, 5:6, 6:7, …:14:15]被采样(一次成功),则从采样空间中移除间隔ddd$minutes[1:2](在下一个随机采样之前),作为两个组相交(ddd$minutes[2:3]存在于两者中)。

这不是一个简单的无需替换的采样问题,因为在下一次采样发生之前,不仅应该采样,而且应该从采样空间中删除所有与已采样相交的组。

编辑(来自Tim P的评论)ddd$minutes[2]可能介于1000-1200之间; k 介于1和16之间。 j 介于1到30之间

EDIT2(蒂埃里评论)

我发表了一个例子,接着是蒂埃里的评论和回答

length(ddd$minutes)

样品空间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被重新定义为S1,没有元素2:4,3:5,4:6,5:7,

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

等等直到* k *样本。最终我的目标是多次运行这种抽样,看看至少有一个ddd $成功出现的概率会被提升。

2 个答案:

答案 0 :(得分: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
  })
}))

答案 1 :(得分:0)

我宁愿将数据集聚合到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
    })
}))