繁体   English   中英

从二项分布生成相关随机数

[英]Generate correlated random numbers from binomial distributions

我试图找到一种方法来从几个二项分布中生成相关的随机数。

我知道如何使用正态分布(使用MASS::mvrnorm ),但我没有找到适用于二项式响应的函数。

您可以使用copula包生成相关制服,然后使用qbinom函数将它们转换为二项式变量。 这是一个快速示例:

library(copula)

tmp <- normalCopula( 0.75, dim=2 )
x <- rcopula(tmp, 1000)
x2 <- cbind( qbinom(x[,1], 10, 0.5), qbinom(x[,2], 15, 0.7) )

现在x2是一个矩阵,其中 2 列代表 2 个相关的二项式变量。

具有 n 次试验且每次试验成功概率为 p 的二项式变量可以被视为 n 次伯努利试验的总和,每个试验也具有成功概率 p。

类似地,您可以通过对具有所需相关性 r 的伯努利变量对求和来构造相关二项式变量对。

require(bindata)

# Parameters of joint distribution
size <- 20
p1 <- 0.5
p2 <- 0.3
rho<- 0.2

# Create one pair of correlated binomial values
trials <- rmvbin(size, c(p1,p2), bincorr=(1-rho)*diag(2)+rho)
colSums(trials)

# A function to create n correlated pairs
rmvBinomial <- function(n, size, p1, p2, rho) {
    X <- replicate(n, {
             colSums(rmvbin(size, c(p1,p2), bincorr=(1-rho)*diag(2)+rho))
         })
    t(X)
}
# Try it out, creating 1000 pairs
X <- rmvBinomial(1000, size=size, p1=p1, p2=p2, rho=rho)
#     cor(X[,1], X[,2])
# [1] 0.1935928  # (In ~8 trials, sample correlations ranged between 0.15 & 0.25)

需要注意的是,有许多不同的联合分布共享所需的相关系数。 rmvBinomial()的模拟方法生成其中之一,但它是否合适将取决于生成数据的过程。

正如这个 R-help对类似问题的回答中所指出的(然后继续更详细地解释这个想法):

虽然二元正态(给定的均值和方差)由相关系数唯一定义,但二元二项式并非如此

具有相关二进制数据的矩阵也可以通过遗传算法进行迭代,例如在 R 包“RepeatedHighDim”( https://github.com/jkruppa/RepeatedHighDim )中实现。 该算法在这里描述https://www.sciencedirect.com/science/article/abs/pii/S0010482517303499

library(RepeatedHighDim)
X0 <- start_matrix(p = c(0.5, 0.3), k = 1000) # sample size k
R <- diag(2)
R[1,2] = 0.2
R[2,1] = 0.2
X1 <- iter_matrix(X0, R = R, T = 10000, e.min = 0.00001)$Xt
cor(X1)

该包还实现了另外两种算法:

X2 = rmvbinary_EP(n = 1000, R = R, p = c(0.5, 0.3))
X3 = rmvbinary_QA(n = 1000, R = R, p = c(0.5, 0.3))
cor(X2)
cor(X3)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM