我想对值进行采样,但是有一个约束,要求两个值至少相隔window
。这类似于一年中的抽样天数,但将window
设置为相隔至少两周。到目前为止,我已经尝试过这样的
check.diff <- TRUE
window <- 14
while (check.diff == TRUE) {
sampled.session <- sort(sample(1:365, size = 5, replace = FALSE))
check.diff <- any(diff(sampled.session) < window)
}
如果window
约束很小,这很有效。如果指定一个相当大的值,则可以成为无限循环。虽然我可以插入各种检查和最大迭代次数,但我想知道是否有更聪明的方法来攻击它?
答案 0 :(得分:2)
这样做的一种方法是从您从中取样的人群中删除候选人:
set.seed(42)
population <- 1:356
n_samples <- 5
window <- 14
sampled_session <- rep(sample(population, 1), n_samples) # initialize the vector
for (i in seq.int(2, n_samples)) {
borders <- sampled_session[i - 1] + (window - 1) * c(-1, 1)
days_in_window <- seq.int(borders[1], borders[2])
population <- setdiff(population, days_in_window)
sampled_session[i] <- sample(population, 1)
}
sort(sampled_session)
# [1] 90 193 264 309 326
diff(sort(sampled_session))
# [1] 103 71 45 17
另一种方式是
set.seed(357)
population <- 1:357
n_samples <- 5
window <- 14
sampled.session <- numeric(n_samples)
for (i in seq_len(n_samples)) {
sampled.session[i] <- pick <- sample(population, 1)
population <- population[-which(population < pick + window & population > pick - window)]
}
sort(sampled.session)
[1] 19 39 111 134 267
答案 1 :(得分:1)
嗯,这样的事情怎么样。
window <- 14
sample_pair <- sample(1:365, size=2)
sample_pair[2] <- sample_pair[2] + window*(diff(foo)<window)
然后将该对转储到任何更大的样本组中。
或者您可以在绘制后缩放整个样本集。伪代码:
samp.window <- diff(range(sample.set))
if (sample.window < window) sample.set <- sample.set *window/sample.window
如果需要,请跟round
或truncate
。可能值得检查以确保这些分布是统一的: - (