繁体   English   中英

R:模拟离散相关数据

[英]R: Simulating Discrete Correlated Data

我正在使用 R 编程语言。

我正在尝试模拟包含变量之间“相关性”的随机离散数据。 例如,这是我迄今为止尝试过的(我生成了具有相关性的随机连续数据,并将低于某个阈值的所有值转换为 0 else 1):

library(mvtnorm)

    
   n <- 11
A <- matrix(runif(n^2)*2-1, ncol=n) 
s <- t(A) %*% A
            

my_data = MASS::mvrnorm(100, mu = c(rnorm(11,10,1)), Sigma = s)
my_data = data.frame(my_data)

colnames(my_data)[1] <- 'p1'
colnames(my_data)[2] <- 'p2'
colnames(my_data)[3] <- 'p3'
colnames(my_data)[4] <- 'p4'
colnames(my_data)[5] <- 'p5'
colnames(my_data)[6] <- 'p6'
colnames(my_data)[7] <- 'p7'
colnames(my_data)[8] <- 'p8'
colnames(my_data)[9] <- 'p9'
colnames(my_data)[10] <- 'p10'
colnames(my_data)[11] <- 'result'

my_data[my_data < 9] <- 0
my_data[my_data > 9] <- 1 

  p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 result
1  1  1  1  0  1  1  1  0  0   0      0
2  0  1  1  1  1  0  1  1  1   1      1
3  1  1  1  0  1  0  1  1  1   1      1
4  1  1  1  0  1  1  1  1  1   1      1
5  0  1  1  1  1  0  1  1  0   0      0
6  1  0  1  0  1  1  1  0  1   1      1

我不确定我是否正确地做到了这一点 - 当然,我已经模拟了随机离散数据,但我不确定我是否保留了数据中的相关结构。 例如,我希望有相关模式,例如:

  • 当 p1 = p5 = p9 = 1 ->“结果”更有可能为 1(即取所有 p1 = p5 = p9 = 1 的行并测量结果列中 1 的百分比)
  • 当 p3 = p4 = 0 和 p9 = 1 ->“结果”更有可能为 0
  • 等等

还有其他方法可以做到这一点吗?

谢谢!

如果您对 p1 到 p10 感到满意,并且只想使用您声明的规则来生成结果列,那么您可以进行一种反向逻辑回归。 首先,设置你的规则给你数字结果。 在这里,如果 p1 = p5 = p9 = 1,我们得到 1,如果 p3 = 0,p4 = 0,p9 = 1,我们得到 -1:

log_odds <- with(my_data, p1 * p5 * p9)
log_odds <- with(my_data, result - (1 - p3) * (1 - p4) * p9)

现在我们将这些转换为在结果列中获得 1 的概率:

odds <- exp(log_odds)
probs <- odds / (1 + odds)

最后,我们使用probs生成二项式样本:

my_data$result <- rbinom(nrow(my_data), size = 1, prob = probs)

我们可以看到,总体而言,我们的样本有大约 50% 的机会出现 1 或 0:

table(my_data$result)
#>  0  1 
#> 47 53 

但是当 p1 = p5 = p9 = 1 时,得到 1 的几率会大大增加

table(my_data$result[with(my_data, p1 == 1 & p5 == 1 & p9 == 1)])
#>  0  1 
#>  3 18 

可以通过调整log_odds的权重来控制背景概率和相关强度

暂无
暂无

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

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