一个显然很简单的问题:我想从一个二元分布中生成两个(模拟的)变量(x, y),它们之间有一个给定的相关矩阵。在其他wprd中,我想要两个值为0或1的变量/向量,以及它们之间定义的相关性。
MASS包很容易处理正态分布的情况。
df_norm = mvrnorm(
100, mu = c(x=0,y=0),
Sigma = matrix(c(1,0.5,0.5,1), nrow = 2),
empirical = TRUE) %>%
as.data.frame()
cor(df_norm)
x y
x 1.0 0.5
y 0.5 1.0
然而,我如何从给定的矩阵相关性生成二进制数据?
这是不工作:
df_bin = df_norm %>%
mutate(
x = ifelse(x<0,0,1),
y = ifelse(y<0,0,1))
x y
1 0 1
2 0 1
3 1 1
4 0 1
5 1 0
6 0 0
7 1 1
8 1 1
9 0 0
10 1 0
虽然这创建了二进制变量,但相关性不是(甚至接近)0.5。
cor(df_bin)
x y
x 1.0000000 0.2994996
y 0.2994996 1.0000000
理想情况下,我希望能够在函数中指定分布类型作为参数(如在lm()函数中)。
任何想法?
我猜您不是在寻找二进制,即0或1的值。如果这是你想要的,这是没有用的。
我认为你想看的是二元对-联结的构造。你说你想要指定分布。VineCopula
包将是一个良好的开端。选择分布后,可以使用相关矩阵来模拟数据。你提到了lm()
,高斯分布是一个选项-(正态分布)。你可以通过Lin和Chagnaty(2021)了解到这种方法。包信息不是基于他们的工作,但这是我开始寻找你的答案。
我使用了0.5的相关性作为一个例子,并在这个例子中使用高斯联结来创建100组点:
# vine-copula
library(VineCopula)
set.seed(246543)
df <- BiCopSim(100, 1, .5)
head(df)
# [,1] [,2]
# [1,] 0.07585682 0.38413426
# [2,] 0.44705686 0.76155029
# [3,] 0.91419758 0.56181837
# [4,] 0.65891869 0.41187594
# [5,] 0.49187672 0.20168128
# [6,] 0.05422541 0.05756005