给定二元离散分布的随机样本
假设我有一个二元离散分布,即对于i = 1,...,n和j = 1,...,m的概率值表P(X = i,Y = j)。 如何从这样的分布生成一个随机样本(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()来模拟“双变量”。 直觉上我应该得到类似于我需要的东西。 我不确定这是否正确。 因此,问题:)
另一种方法是使用吉布斯抽样,边际分布很容易计算。
我尝试了谷歌搜索,但没有真正相关的出现。
你几乎在那里。 假设您有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]
我不清楚为什么你应该关心它是二元的。 概率总和为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)
这会从您的矩阵中返回3个随机绘制,报告行和列的i
和j
:
i j
1 1 1
2 2 2
3 2 2
链接地址: http://www.djcxy.com/p/24809.html
上一篇: Random sample from given bivariate discrete distribution
下一篇: How to convert tidy hierarchical data frame to hierarchical list grid in R?