如何用R从独立Copula与共单调Copula的混合模型生成随机样本?
混合独立-共单调三元Copula的抽样实现问题
你的实现存在的问题
- 共单调Copula样本生成错误:你通过对独立样本的列排序得到
u.como,这不符合共单调Copula的定义。对于边缘为均匀分布的共单调Copula,其样本应该是三个完全正相关的均匀变量,即每个样本点的三个维度取同一个U(0,1)值(因为完全正相关时,变量间是单调递增的一一对应关系,边缘均匀下等价于共享同一个均匀随机数)。 - 混合逻辑错误:混合Copula是分布的混合,即每个样本点以概率
w来自独立Copula,以概率1-w来自共单调Copula,而不是对两个Copula的样本点做线性加权。直接加权得到的mix.sam不仅会破坏边缘分布的均匀性,甚至可能出现超出[0,1]区间的值,不符合Copula的基本要求。
正确的实现方式
以下是符合混合Copula定义的R代码(生成9个3维观测值,w=0.5):
set.seed(285) n <- 9 # 观测数 w <- 0.5 # 独立Copula的权重 # 1. 生成每个样本的来源标记:1=独立Copula,2=共单调Copula source <- sample(c(1, 2), size = n, replace = TRUE, prob = c(w, 1 - w)) # 2. 初始化样本矩阵 mix.sam <- matrix(NA, nrow = n, ncol = 3) # 3. 生成独立Copula样本 ind_idx <- which(source == 1) mix.sam[ind_idx, ] <- matrix(runif(length(ind_idx)*3), ncol = 3) # 4. 生成共单调Copula样本 como_idx <- which(source == 2) como_u <- runif(length(como_idx)) mix.sam[como_idx, ] <- como_u %*% t(rep(1, 3)) # 每个样本点三个维度取同一个均匀值 # 查看结果 mix.sam
补充说明
- 共单调Copula的核心是变量间完全正相关,因此当边缘为均匀分布时,每个样本点的三个维度必然相等(或严格单调递增,但均匀边缘下等价于取同一值)。
- 混合后的样本,每个边缘仍然是U(0,1)分布,符合Copula的边缘均匀性要求。
内容的提问来源于stack exchange,提问作者Vanesa Jordà
相关产品推荐
相关产品推荐

