来自给定双变量离散分布的随机样本
Posted
技术标签:
【中文标题】来自给定双变量离散分布的随机样本【英文标题】:Random sample from given bivariate discrete distribution 【发布时间】:2011-01-17 21:39:29 【问题描述】:假设我有一个二元离散分布,即概率值表 P(X=i,Y=j),对于 i=1,...n 和 j=1,...m。如何从这种分布中生成随机样本 (X_k,Y_k), k=1,...N?也许有一个现成的 R 函数,例如:
sample(100,prob=biprob)
biprob 是二维矩阵在哪里?
一种直观的采样方式如下。假设我们有一个 data.frame
dt=data.frame(X=x,Y=y,P=pij)
x 和 y 来自哪里
expand.grid(x=1:n,y=1:m)
和 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)
我使用 set.seed() 来模拟“二元性”。直觉上我应该得到类似于我需要的东西。我不确定这是正确的方法。因此问题:)
另一种方法是使用吉布斯抽样,边际分布很容易计算。
我尝试使用谷歌搜索,但没有找到真正相关的内容。
【问题讨论】:
【参考方案1】:你快到了。假设您有带有 x、y 和 pij 值的数据框 dt
,只需对行进行采样!
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]
【讨论】:
再次仔细阅读,这与我建议的解决方案相同。采样行可能比组合 rmultinom 和 which 更干净。关键是要意识到行和列只是符号。 是的,符号是关键。双变量离散分布与符号改变的单变量离散分布相同。我选择 Anika 的答案作为正确答案,但这只是因为代码更简单 :) Tristan 给出了更好的理论解释。【参考方案2】:我不清楚为什么你应该关心它是双变量的。概率总和为 1,结果是离散的,因此您只是从 categorical distribution 中抽样。唯一的区别是您使用行和列而不是单个位置来索引观察。这只是符号。
因此,在 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)
这会从您的矩阵中返回 3 次随机抽取,报告行和列的 i
和 j
:
i j
1 1 1
2 2 2
3 2 2
【讨论】:
以上是关于来自给定双变量离散分布的随机样本的主要内容,如果未能解决你的问题,请参考以下文章