2010-02-17 36 views
5

Giả sử tôi có phân bố riêng biệt hai biến, tức là bảng giá trị xác suất P (X = i, Y = j), cho i = 1, ... n và j = 1 ,. ..m. Làm cách nào để tạo một mẫu ngẫu nhiên (X_k, Y_k), k = 1, ... N từ phân phối như vậy? Có thể có một hàm R sẵn sàng như:Mẫu ngẫu nhiên từ phân phối riêng biệt bivariate

sample(100,prob=biprob) 

trong đó biprob là ma trận 2 chiều?

Một cách trực quan để lấy mẫu là như sau. Giả sử chúng ta có một data.frame

dt=data.frame(X=x,Y=y,P=pij) 

Trong đó x và y đến từ

expand.grid(x=1:n,y=1:m) 

và pij là P (X = i, Y = j).

Sau đó, chúng tôi nhận mẫu của chúng tôi (Xs, Ys) có kích thước N, theo cách sau:

set.seed(1000) 
Xs <- sample(dt$X,size=N,prob=dt$P) 
set.seed(1000) 
Ys <- sample(dt$Y,size=N,prob=dt$P) 

tôi sử dụng set.seed() để mô phỏng "bivariateness". Trực giác tôi sẽ nhận được một cái gì đó tương tự như những gì tôi cần. Tôi không chắc chắn rằng đây là cách chính xác mặc dù. Do đó câu hỏi :)

Một cách khác là sử dụng lấy mẫu Gibbs, phân phối cận biên dễ tính toán.

Tôi đã thử googling, nhưng không có gì thực sự có liên quan đến.

Trả lời

7

Bạn sắp hoàn tất. Giả sử bạn có khung dữ liệu dt với các giá trị x, y và pij, chỉ cần lấy mẫu các hàng!

dt <- expand.grid(X=1:3, Y=1:2) 
dt$p <- runif(6) 
dt$p <- dt$p/sum(dt$p) # get fake probabilities 
idx <- sample(1:nrow(dt), size=8, replace=TRUE, prob=dt$p) 
sampled.x <- dt$X[idx] 
sampled.y <- dt$Y[idx] 
+0

Reading này một lần nữa một cách cẩn thận, điều này là như nhau giải pháp như những gì tôi đề nghị. Các hàng lấy mẫu có lẽ sạch hơn so với kết hợp rmultinom và đó. Điều quan trọng là nhận ra rằng các hàng và cột chỉ là ký hiệu. – Tristan

+0

Có ký hiệu là chìa khóa. Phân phối rời rạc song song cũng giống như phân phối rời rạc đơn biến với ký hiệu thay đổi. Tôi chọn câu trả lời của Anika là câu trả lời đúng, nhưng chỉ vì đoạn mã đơn giản hơn :) Tristan đưa ra giải thích lý thuyết tốt hơn. – mpiktas

+0

+1 cho ví dụ hay – andi

7

Nó không rõ ràng với tôi tại sao bạn nên quan tâm rằng nó là hai biến thể. Xác suất tổng hợp thành một và kết quả là rời rạc, vì vậy bạn chỉ lấy mẫu từ một số categorical distribution. Sự khác biệt duy nhất là bạn đang lập chỉ mục các quan sát bằng cách sử dụng các hàng và cột chứ không phải là một vị trí duy nhất. Đây chỉ là ký hiệu.

Trong R, bạn có thể dễ dàng lấy mẫu từ phân phối của mình bằng cách định lại lại dữ liệu và lấy mẫu từ phân phối phân loại. Lấy mẫu từ một phân loại có thể được thực hiện bằng cách sử dụng rmultinom và sử dụng which để chọn chỉ mục hoặc, như Aniko đề xuất, sử dụng sample để lấy mẫu các hàng của dữ liệu được định dạng lại. Một số sổ sách kế toán có thể xử lý trường hợp chính xác của bạn.

Dưới đây là một giải pháp:

library(reshape) 

# Reshape data to long format. 
data <- matrix(data = c(.25,.5,.1,.4), nrow=2, ncol=2) 
pmatrix <- melt(data) 

# Sample categorical n times. 
rcat <- function(n, pmatrix) { 
    rows <- which(rmultinom(n,1,pmatrix$value)==1, arr.ind=TRUE)[,'row'] 
    indices <- pmatrix[rows, c('X1','X2')] 
    colnames(indices) <- c('i','j') 
    rownames(indices) <- seq(1,nrow(indices)) 
    return(indices) 
} 

rcat(3,pmatrix) 

này trả về 3 ngẫu nhiên rút ra từ ma trận của bạn, báo cáo ij của các hàng và cột:

i j 
1 1 1 
2 2 2 
3 2 2 
Các vấn đề liên quan