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?

pengguna333
sumber

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 
Greg Snow
sumber
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

Brandon Bertelsen
sumber
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 :)

Tugas
sumber
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).