আর: প্রতিস্থাপন ছাড়াই এবং পরপর একই মান ব্যতীত কীভাবে নমুনা জানাতে হয়


10

খুব সাধারণ জিনিস বলে মনে হচ্ছে এমনটি করার জন্য আমি একদিন ধরে কাটিয়েছি। আমাকে 300 'র্যান্ডম' সিক্যুয়েন্স তৈরি করতে হবে যাতে 1,2,3 এবং 4 নম্বরগুলি 12 বার প্রদর্শিত হয়, তবে একই সংখ্যাটি 'একটানা' / পরপর দু'বার ব্যবহার হয় না।

আমার সেরা চেষ্টা (আমার ধারণা) ছিল:

  1. প্রতিস্থাপন ছাড়াই আর 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: চিরকাল ধরে takes

এটি করার কিছু সহজ উপায় থাকতে হবে, তাই না? কোন সাহায্য ব্যাপকভাবে প্রশংসা করা হয়!

উত্তর:


3

সম্ভবত replicate()একটি repeatলুপ ব্যবহার করা আরও দ্রুত is এখানে 3অনুক্রম সহ একটি উদাহরণ । দেখে মনে হচ্ছে এটি প্রায় লাগবে। 300(পরীক্ষিত নয়) সহ 1490 সেকেন্ড ।

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.