2

値をサンプリングしたいのですが、2 つの値が少なくともwindow離れていることを要求する制約があります。これは、1 年のサンプリング日と似ていますwindowが、少なくとも 2 週間間隔を空けるように設定します。これまでのところ、私はこのように試しました

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制約が小さい場合、これはうまく機能します。かなり大きな値を指定すると、無限ループになる可能性があります。あらゆる種類のチェックと最大反復回数を挿入できますが、これを攻撃するよりスマートな方法があるかどうか疑問に思っていましたか?

4

2 に答える 2

2

これを行う1つの方法は、サンプルを取得した母集団から候補を削除することです。

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
于 2012-12-07T12:33:32.040 に答える
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ます。おそらく、これらの分布が均一であることを確認するためにチェックする価値があります:-(

于 2012-12-07T12:32:38.043 に答える