2012-12-07 80 views
2

我想樣本值,但有一個約束,要求兩個值至少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

不是'動物園'有一些很酷的方式來處理這個嗎? –

+0

@ AriB.Friedman這是我最初的想法(因此我參考了抽樣天),但是出現了空。 –

+0

有趣。理論和找到一個cli的問題que(一個完整的子圖)在一個無向圖中。 – flodel

回答

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 
+0

有趣的想法。如果沒有人有更好的主意,我會使用這個實現。我希望你不介意如果我的解釋如果你的代碼添加到你的後代爲我們的後代。 –

+0

@RomanLuštrik你的版本是一個很好的改進。 –

1

那麼,這樣的事情呢。

window <- 14 
sample_pair <- sample(1:365, size=2) 
sample_pair[2] <- sample_pair[2] + window*(diff(foo)<window) 

然後將該對轉儲到任何更大的樣本組中。

或者您可以在繪製完成後縮放整個樣本集。僞碼:如果需要,通過一個或roundtruncate

samp.window <- diff(range(sample.set)) 
if (sample.window < window) sample.set <- sample.set *window/sample.window 

其次。也許值得檢查,以確保這些分佈均勻:-(爲此

相關問題