来自给定双变量离散分布的随机样本

mpi*_*tas 7 statistics r

假设我有一个双变量离散分布,即概率值P(X = i,Y = j)表,i = 1,... n和j = 1,... m.如何从这样的分布中生成随机样本(X_k,Y_k),k = 1,... N?也许有一个准备好的R函数,如:

sample(100,prob=biprob)
Run Code Online (Sandbox Code Playgroud)

biprob是2维矩阵?

一种直观的采样方法如下.假设我们有一个data.frame

dt=data.frame(X=x,Y=y,P=pij)
Run Code Online (Sandbox Code Playgroud)

x和y来自哪里

expand.grid(x=1:n,y=1:m)
Run Code Online (Sandbox Code Playgroud)

和pij是P(X = i,Y = j).

然后我们得到大小为N的样本(Xs,Ys),方法如下:

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

我使用set.seed()来模拟"双变量".直观地说,我应该得到类似于我需要的东西.我不确定这是否正确.因此问题:)

另一种方法是使用吉布斯采样,边际分布很容易计算.

我试过谷歌搜索,但没有真正相关的东西出现.

Ani*_*iko 8

你快到了.假设您拥有dt包含x,y和pij值的数据框,只需对行进行采样!

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]
Run Code Online (Sandbox Code Playgroud)


Tri*_*tan 7

我不清楚为什么你应该关心它是双变量的.概率总和为1,结果是离散的,因此您只是从分类分布中抽样.唯一的区别是您使用行和列而不是单个位置索引观察.这只是表示法.

因此,在R中,您可以通过重新整形数据和从分类分布中抽样来轻松地从您的分布中进行抽样.可以使用rmultinom和使用which来选择索引来完成从分类中的采样,或者如Aniko建议的那样,使用sample来对重构数据的行进行采样.一些簿记可以照顾你的确切情况.

这是一个解决方案:

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)
Run Code Online (Sandbox Code Playgroud)

这将返回3个随机从您的矩阵绘制,报告ij行和列的:

  i j
1 1 1
2 2 2
3 2 2
Run Code Online (Sandbox Code Playgroud)