Làm thế nào để tạo dữ liệu phân loại ngẫu nhiên?


14

Giả sử tôi có một biến phân loại có thể lấy các giá trị A, B, C và D. Làm cách nào tôi có thể tạo 10000 điểm dữ liệu ngẫu nhiên và kiểm soát tần số của từng điểm? Ví dụ:

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

Bất kỳ ý tưởng làm thế nào tôi có thể làm điều này?

Câu trả lời:


34

Bạn có muốn tỷ lệ trong mẫu chính xác là tỷ lệ đã nêu? hoặc để thể hiện ý tưởng lấy mẫu từ một dân số rất lớn với các tỷ lệ đó (vì vậy tỷ lệ mẫu sẽ gần nhưng không chính xác)?

Nếu bạn muốn tỷ lệ chính xác thì bạn có thể làm theo gợi ý của Brandon và sử dụng samplehàm R để chọn ngẫu nhiên thứ tự của một vectơ có tỷ lệ chính xác.

Nếu bạn muốn lấy mẫu từ dân số, nhưng không giới hạn tỷ lệ chính xác thì bạn vẫn có thể sử dụng samplehàm trong R với probđối số như vậy:

> 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

Sử dụng R (http://cran.r-project.org/). Tất cả những gì tôi đang làm ở đây là tạo một danh sách ngẫu nhiên với tỷ lệ bạn đã chỉ định.

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)))

/ tôi kiên nhẫn chờ đợi để tranh luận về việc điều này thực sự ngẫu nhiên như thế nào


5
Bạn có thể rút ngắn / đơn giản hóa dòng đầu tiên của mình x <- rep( c("A","B","C","D"), 10000*c(0.1,0.2,0.65,0.05) )và bạn không cần chỉ định 10000 trong lệnh gọi để lấy mẫu, đó sẽ là mặc định (mặc dù để rõ ràng, việc xác định nó không gây hại gì).
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)))

Tôi không có nghi ngờ điều này là thực sự ngẫu nhiên. Ý tôi là, đến mức runif()ngẫu nhiên :)


4
Nếu tần số mong muốn thực sự là xác suất, việc sử dụng probđối số cho sample():sample(LETTERS[1:4], 10000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05))
caracal

Vâng, đó là dễ thương hơn nhiều. Của tôi chỉ là một lực lượng vũ phu.
StasK

Tôi thực sự đã nâng cao điều này bởi vì nó cho thấy cách thức sample(,prob=)hoạt động (ít nhất là trong đánh bóng nó được gọi là thuật toán roulette).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.