求助:生成符合指定协方差矩阵的100组观测数据——扰动项构建难题
生成符合指定协方差矩阵的100个观测值数据(R实现)
方法一:按给定变量生成规则构建
按照你提供的变量生成逻辑,先确定各扰动项的分布参数,再逐步生成变量:
set.seed(123) # 设置随机种子,保证结果可复现 n <- 100 # 生成独立正态分布的x1、x2 x1 <- rnorm(n, mean = 0, sd = 1) x2 <- rnorm(n, mean = 0, sd = 1) # 计算e3的方差,匹配x3的目标方差1.350 var_x3_target <- 1.350 var_e3 <- (var_x3_target - 0.25*var(x1) - 0.25*var(x2)) / (0.5^2) e3 <- rnorm(n, mean = 0, sd = sqrt(var_e3)) x3 <- 0.5*x1 + 0.5*x2 + 0.5*e3 # 构造e4、e5的联合正态分布(协方差0.5),匹配x4、x5的目标方差 var_e4_target <- (1.265 - 0.25*var_x3_target) / (0.707^2) var_e5_target <- (0.949 - 0.25*var_x3_target) / (0.707^2) e_cov <- matrix(c(var_e4_target, 0.5, 0.5, var_e5_target), nrow = 2) e4e5 <- MASS::mvrnorm(n, mu = c(0,0), Sigma = e_cov) e4 <- e4e5[,1] e5 <- e4e5[,2] # 生成x4、x5 x4 <- 0.5*x3 + 0.707*e4 x5 <- 0.5*x3 + 0.707*e5 # 合并为数据集 data <- data.frame(x1, x2, x3, x4, x5) # 查看样本协方差矩阵(保留3位小数) round(cov(data), 3)
注:由于仅生成100个观测值,样本协方差会与目标值存在轻微偏差,增大样本量可缩小差异。
方法二:直接基于目标协方差矩阵生成
如果需要更精准匹配给定的协方差矩阵,可直接生成多元正态分布数据:
# 补全目标协方差矩阵(对称结构) target_cov <- matrix( c(0.931, 0.171, 0.630, 0.384, 0.324, 0.171, 1.094, 0.762, 0.368, 0.385, 0.630, 0.762, 1.350, 0.743, 0.611, 0.384, 0.368, 0.743, 1.265, 0.624, 0.324, 0.385, 0.611, 0.624, 0.949), nrow = 5, byrow = TRUE, dimnames = list(c("x1","x2","x3","x4","x5"), c("x1","x2","x3","x4","x5")) ) set.seed(123) n <- 100 data <- MASS::mvrnorm(n, mu = rep(0,5), Sigma = target_cov) data <- as.data.frame(data) # 查看样本协方差矩阵 round(cov(data), 3)
这种方法无需手动推导扰动项参数,直接生成符合要求的数据集,效率更高。
内容的提问来源于stack exchange,提问作者Ramakrishna S
相关产品推荐
相关产品推荐

