【问题标题】:Simulating correlated Bernoulli data模拟相关的伯努利数据
【发布时间】:2020-04-23 00:06:37
【问题描述】:

我想用 5 列模拟 100 个数据。我想在列之间获得 0.5 的相关性。为了完成它,我做了以下操作

F1 <- matrix( c(1, .5, .5, .5,.5,
                   .5, 1, .5, .5,.5,
                   .5, .5, 1, .5,.5,
                   .5, .5, .5, 1,.5,
                   .5, .5, .5, .5,1
), 5,5)

为了模拟预期的数据框,我做了这个,但它不能正常工作。

 df2 <- as.data.frame (rbinom(100, 1,.5),ncol(5), F1)

【问题讨论】:

  • 此代码需要稍作修改,但它应该可以满足您的需求:stats.stackexchange.com/a/285008/87002
  • 谢谢@Phil,你能帮上忙吗
  • 这是另一种可以提供帮助的材料:stats.stackexchange.com/questions/156456/…。尽管在每对列之间获得相同的相关性似乎很困难,因为一旦有了Cov(A,B)=Cov(A,C)=70%,我就看不出Cov(B,C) 怎么能等于70%。这可能是交叉验证的问题,而不是 SO
  • @Romain,我完全知道如何使用离散数据运行它,非常简单但我不知道如何获得 0 和 1

标签: r simulation


【解决方案1】:

我很惊讶这不是重复的(this question 专门指非二元响应,即 N>1 的二项式)。 bindata package 做你想做的事。

library(bindata)
## set up correlation matrix (compound-symmetric with rho=0.5)
m <- matrix(0.5,5,5)
diag(m) <- 1

以 0.5 的平均值进行模拟(如您的示例中所示):

set.seed(101)
## this simulates 10 rather than 100 realizations
## (I didn't read your question carefully enough)
## but it's easy to change
r <- rmvbin(n=10, margprob=rep(0.5,5), bincorr=m)
round(cor(r),2)

结果

 1.00 0.22  0.80  0.05 0.22
 0.22 1.00  0.00  0.65 1.00
 0.80 0.00  1.00 -0.09 0.00
 0.05 0.65 -0.09  1.00 0.65
 0.22 1.00  0.00  0.65 1.00
  • 这看起来是错误的 - 相关性并不完全是 0.5 - 但平均而言它们会是(当我对 10,000 个向量而不是 10 个向量进行采样时,值的范围从大约 0.48 到 0.51)。同样,如果您模拟了 10 个样本并计算了每个样本的相关矩阵,您应该会发现预期的(平均)相关矩阵是正确的。
  • 模拟相关值完全等于指定值要困难得多(而且不一定是您想要做的,取决于应用程序)
  • 请注意,对于哪些均值向量和相关矩阵是可行的,会有一些限制。例如,n×n 复合对称(等相关)矩阵的非对角元素不能小于 -1/(n-1)。同样,对于给定的一组均值,可能存在哪些相关性可能存在限制(这可能在技术参考中进行了讨论,我没有检查过)。

这个方法的参考是

Leisch、Friedrich 和 Weingessel、Andreas 和 Hornik、Kurt (1998) 关于相关人工二进制数据的生成。工作论文 SFB“经济与管理科学中的自适应信息系统与建模”,13。 SFB 经济与管理科学中的自适应信息系统与建模,WU 维也纳经济与商业大学,维也纳。 https://epub.wu.ac.at/286/

【讨论】:

  • 非常漂亮的答案,非常感谢。完美!
猜你喜欢
  • 2019-10-05
  • 2019-06-21
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 2018-04-11
  • 2020-12-17
相关资源
最近更新 更多