You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于给定相关矩阵生成二元分布二值变量的方法咨询

生成指定相关系数的二元二值变量实现方法

问题背景

需要生成取值仅为0或1的两个变量(x,y),二者需满足预设的皮尔逊相关系数。直接对服从指定相关的二元正态变量做截断转二值的方法存在偏差:原本预设0.5的相关系数,截断后实际相关仅为0.3左右,不符合要求。

可行解决方案

方案1:使用专门处理相关二分类数据的bindata包(推荐)

该包可以直接指定变量的边际取1概率、目标相关系数,直接生成符合要求的二值样本,使用逻辑和mvrnorm类似,符合你提到的「通过参数指定分布」的使用习惯。
代码示例:

# 首次使用需安装包
# install.packages("bindata")
library(bindata)
library(tidyverse)

# 设定参数:x取1的概率、y取1的概率,可按需调整
marginal_prob <- c(0.5, 0.5)
# 设定目标相关矩阵
target_cor <- matrix(c(1, 0.5, 0.5, 1), nrow = 2)

# 生成100个样本,固定种子可复现结果
set.seed(123)
df_bin <- rmvbin(
  n = 100,
  margprob = marginal_prob,
  bincorr = target_cor
) %>% as.data.frame() %>% rename(x = V1, y = V2)

# 验证相关系数,输出结果会非常接近预设的0.5
cor(df_bin)

方案2:校正截断正态法的相关系数

如果需要沿用正态截断的逻辑,需要先将二值变量的目标相关转换为对应的四分相关系数,再用转换后的相关生成正态样本,最后截断即可得到符合要求的结果。
代码示例:

# 首次使用需安装包
# install.packages(c("MASS", "psych"))
library(MASS)
library(psych)
library(tidyverse)

# 目标二值相关
target_bin_cor <- 0.5
# 转换为底层正态分布需要的四分相关,可按需调整p参数修改x、y的取1概率
tetra_cor <- tetrachoric(
  matrix(c(0.5*(1-target_bin_cor), 0.5*target_bin_cor, 0.5*target_bin_cor, 0.5*(1-target_bin_cor)), 2),
  p = c(0.5,0.5)
)$rho

# 生成二元正态样本
df_norm <- mvrnorm(
  100, mu = c(0,0),
  Sigma = matrix(c(1, tetra_cor, tetra_cor, 1), nrow = 2),
  empirical = TRUE
) %>% as.data.frame() %>% rename(x=V1, y=V2)

# 截断为二值变量
df_bin <- df_norm %>% mutate(
  x = ifelse(x < 0, 0, 1),
  y = ifelse(y < 0, 0, 1)
)

# 验证相关系数
cor(df_bin)

注意事项

  • 二值变量的相关系数存在理论上限,上限由两个变量的边际取1概率决定,如果设置的目标相关超过理论上限,函数会报错提示,此时需要调整边际概率或者降低目标相关。
  • 如果需要生成的二值变量边际取1概率不是0.5,只需要修改对应参数即可,两种方案都支持自定义边际概率。

内容的提问来源于stack exchange,提问作者Rtist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:48:02