r语言 - 从相关矩阵生成数据:二元分布的情况



一个显然很简单的问题:我想从一个二元分布中生成两个(模拟的)变量(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 

相关内容

  • 没有找到相关文章

最新更新