[英]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 到 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.