我试图找到一种从多个二项分布生成相关随机数的方法。
我知道如何使用正态分布(使用mvrnorm),但我找不到适用于二项式的函数。
答案 0 :(得分:11)
您可以使用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个相关的二项式变量。
答案 1 :(得分:9)
具有n次试验和每次成功概率p的二项式变量 审判可以被视为n个伯努利审判的总和 成功的概率p。
类似地,您可以通过构造相关的二项式变量对 总结具有所需相关性的伯努利变量对。
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()
中的模拟方法产生其中一个,但它是否合适将取决于生成数据的过程。
正如this R-help answer中提到的类似问题(然后继续讨论 更详细地解释这个想法):
虽然二元正态(给定平均值和方差)由相关系数唯一定义,但对于二元二项式不是这种情况
答案 2 :(得分:0)
具有相关二进制数据的矩阵也可以通过遗传算法进行迭代,例如在 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)