Bagaimana cara menghasilkan data kategori acak?


15

Katakanlah saya memiliki variabel kategori yang dapat mengambil nilai A, B, C, dan D. Bagaimana saya bisa menghasilkan 10.000 poin data acak dan mengontrol frekuensi masing-masing? Sebagai contoh:

A = 10% B = 20% C = 65% D = 5%

Ada ide bagaimana saya bisa melakukan ini?

Jawaban:


35

Apakah Anda ingin proporsi dalam sampel persis proporsi yang dinyatakan? atau untuk mewakili gagasan pengambilan sampel dari populasi yang sangat besar dengan proporsi tersebut (sehingga proporsi sampel akan dekat tetapi tidak tepat)?

Jika Anda menginginkan proporsi yang tepat maka Anda dapat mengikuti saran Brandon dan menggunakan samplefungsi R untuk mengacak urutan vektor yang memiliki proporsi tepat.

Jika Anda ingin mengambil sampel dari populasi, tetapi tidak membatasi proporsi tepatnya, Anda masih dapat menggunakan samplefungsi dalam R dengan probargumen seperti:

> x <- sample( LETTERS[1:4], 10000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05) )
> prop.table(table(x))
x
     A      B      C      D 
0.0965 0.1972 0.6544 0.0519 

6

Menggunakan R (http://cran.r-project.org/). Yang saya lakukan di sini adalah membuat daftar acak dengan proporsi yang Anda tentukan.

x <- c(rep("A",0.1*10000),rep("B",0.2*10000),rep("C",0.65*10000),rep("D",0.05*10000))
# cheating    
x <- sample(x, 10000) 


prop.table(summary(as.factor(x)))

/ Aku Menunggu dengan sabar untuk argumen tentang seberapa acak ini


5
Anda dapat mempersingkat / menyederhanakan baris pertama x <- rep( c("A","B","C","D"), 10000*c(0.1,0.2,0.65,0.05) )Anda dan Anda tidak perlu menentukan 10000 dalam panggilan untuk sampel, itu akan menjadi default (meskipun untuk kejelasan tidak ada salahnya untuk menentukannya).
Greg Snow

3
    n <- 10000
    blah <- character(n)
    u <- runif(n)
    blah[u<=0.1] <- "A"
    blah[u>0.1 & u<=0.3] <- "B"
    blah[u>0.3 & u<=0.95] <- "C"
    blah[u>0.95] <- "D"
    table(blah)
    prop.table(summary(as.factor(blah)))

Saya tidak ragu ini benar-benar acak. Maksudku, sampai-sampai itu runif()acak :)


4
Jika frekuensi yang diinginkan benar-benar probabilitas, akan lebih mudah untuk menggunakan probargumen untuk sample():sample(LETTERS[1:4], 10000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05))
caracal

Ya, itu jauh lebih manis. Milik saya hanya kekuatan kasar.
Tugas

Saya benar-benar telah meningkatkan ini karena ini menunjukkan cara sample(,prob=)kerjanya (setidaknya dalam bahasa Polandia disebut algoritma roulette).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.