आर: कैसे प्रतिस्थापन के बिना और लगातार एक ही मूल्यों के बिना नमूना करने के लिए


10

मैंने एक दिन बिताने की कोशिश की है, जो एक बहुत ही साधारण सी बात लगती है। मुझे 300 'रैंडम' सीक्वेंस बनाने हैं, जिसमें 1,2,3 और 4 नंबर बिलकुल 12 बार दिखाई देते हैं, लेकिन एक ही नंबर 'लगातार' में दो बार इस्तेमाल नहीं किया जाता '/ लगातार।

मेरे सबसे अच्छे प्रयास (मुझे लगता है) थे:

  1. प्रतिस्थापन के बिना R नमूना 48 आइटम हैं, परीक्षण करें कि क्या rle के साथ लगातार मान हैं, तो केवल उन अनुक्रमों का उपयोग करें जिनमें लगातार मान शामिल नहीं हैं। समस्या: लगभग कोई यादृच्छिक क्रम नहीं है जो इस मानदंड को पूरा करता है, इसलिए यह हमेशा के लिए लेता है।

  2. लगातार मूल्यों के बिना आर अनुक्रम बना सकते हैं (कोड देखें)।

pop<-rep(1:4,12)
y=c()
while(length(y)!=48)
  {
  y= c(y,sample(pop,48-length(y),replace=F))
  y=y[!c(FALSE, diff(y) == 0)]
  }

समस्या: यह प्रत्येक मान की अलग-अलग संख्याओं के साथ अनुक्रम बनाता है। मैंने तब प्रत्येक मूल्य के ठीक 12 के साथ केवल उन अनुक्रमों का उपयोग करने की कोशिश की, लेकिन केवल मुझे समस्या 1 में वापस लाया गया: हमेशा के लिए।

ऐसा करने का कोई आसान तरीका होना चाहिए, है ना? कोई भी मदद बहुत ही सराहनीय होगी!

जवाबों:


3

शायद लूप के replicate()साथ उपयोग repeatतेज है। यहाँ 3दृश्यों के साथ एक उदाहरण है। लगता है कि यह लगभग ले जाएगा। 1490 सेकंड 300(परीक्षण नहीं किया गया) के साथ।

set.seed(42)
seqc <- rep(1:4, each=12)  # starting sequence

system.time(
  res <- replicate(3, {
    repeat {
      seqcs <- sample(seqc, 48, replace=FALSE) 
      if (!any(diff(seqcs) == 0)) break
    }
    seqcs
  })
)
#  user  system elapsed 
# 14.88    0.00   14.90 

res[1:10, ]
#       [,1] [,2] [,3]
#  [1,]    4    2    3
#  [2,]    1    1    4
#  [3,]    3    2    1
#  [4,]    1    1    4
#  [5,]    2    3    1
#  [6,]    4    1    2
#  [7,]    3    4    4
#  [8,]    2    1    1
#  [9,]    3    4    4
# [10,]    4    3    2

1
आपको बहुत - बहुत धन्यवाद! 100 अनुक्रम बनाने में 800 सेकंड लगे, जो इस मामले में पूरी तरह से स्वीकार्य है। मेरी समस्या का हल!
कुकीमेन्स

1

एक अन्य विकल्प एक मार्कोव चैन मोंटे-कार्लो पद्धति का उपयोग करके 2 संख्याओं को बेतरतीब ढंग से स्वैप करने और नए नमूने में स्थानांतरित करने के लिए है जब केवल 1) हम एक ही नंबर स्वैप नहीं कर रहे हैं और 2) कोई 2 समान संख्याएं आसन्न नहीं हैं। सहसंबद्ध नमूनों को संबोधित करने के लिए, हम बहुत सारे नमूने उत्पन्न कर सकते हैं और फिर उनमें से 300 को बेतरतीब ढंग से चुन सकते हैं:

v <- rep(1:4, 12)
l <- 48
nr <- 3e5
m <- matrix(0, nrow=nr, ncol=l)
count <- 0
while(count < nr) {
    i <- sample(l, 2)
    if (i[1L] != i[2L]) {
        v[i] = v[i[2:1]]
        if (!any(diff(v)==0)) {
            count <- count + 1
            m[count, ] <- v
        } else {
            v[i] = v[i[2:1]]
        }
    }
}
a <- m[sample(nr, 300),]
a

1

आप लगातार मूल्यों को निकाल सकते हैं और उन्हें रख सकते हैं जहां वे लगातार नहीं हैं।

unConsecutive  <- function(x) {
    repeat{
        tt <- c(FALSE, diff(x)==0)
        if(any(tt)) {
            y <- x[which(tt)]
            x <- x[which(!tt)]
            i <- x != y[1]
            i  <- which(c(c(TRUE, diff(i)==0) & i,FALSE)
                        | c(FALSE, c(diff(i)==0, TRUE) & i))
            if(length(i) > 0) {
                i <- i[1]-1
                x <- c(x[seq_len(i)], y, x[i+seq_len(length(x)-i)])
            } else {
                x  <- c(x, y)
                break
            }
        } else {break}
    }
    x
}

unConsecutive(c(1,1,2))
#[1] 1 2 1
unConsecutive(c(1,1,1))
#[1] 1 1 1

set.seed(7)
system.time(
    res <- replicate(300, unConsecutive(sample(rep(1:4,12))))
)
#   user  system elapsed 
#  0.058   0.011   0.069 
all(apply(res, 2, table) == 12)
#[1] TRUE
all(apply(res, 2, diff) != 0)
#[1] TRUE
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.