如何在Matlab中生成指定相关系数的两个Weibull随机向量?
生成指定相关系数、同参数Weibull分布双变量样本的方法
核心方案采用高斯Copula实现,既可以保证两个向量的边缘分布为指定参数的Weibull分布,也能精准控制二者的相依性(包括你要求的偏相关系数),具体步骤如下:
- 第一步:校准Copula相关参数
如果需要控制的是斯皮尔曼秩相关系数等于目标ρ,高斯Copula的相关参数可以直接取ρ;如果需要控制的是皮尔逊线性相关系数或者偏相关系数等于目标ρ,先做参数校准:若你要求的是控制其他变量下的偏相关ρ,先通过偏相关公式反推出X、Y的零阶相关系数,再通过Weibull分布的矩属性迭代校准,得到Copula所需的相关参数
ρ_copula;如果仅为两变量的偏相关(无控制变量),偏相关等价于二者的普通相关系数,直接按线性相关校准即可。 - 第二步:生成带相依性的均匀分布样本
- 构造2×2的高斯Copula相关矩阵:
corr_mat = [[1, ρ_copula], [ρ_copula, 1]] - 生成N个服从二维标准正态分布的样本
Z,均值为0,协方差矩阵为上述corr_mat - 对
Z的每一列做标准正态累积分布(CDF)转换,得到均匀分布样本U:U = scipy.stats.norm.cdf(Z),此时U的两列均服从(0,1)均匀分布,且保留了目标相依结构
- 构造2×2的高斯Copula相关矩阵:
- 第三步:转换为Weibull分布样本
调用Weibull分布的逆CDF(分位数函数)对U的两列分别做转换,Weibull逆CDF公式为:Q(p) = λ * (-ln(1-p)) ** (1/k)
其中p为均匀分布输入值,λ为尺度参数,k为形状参数,转换后得到的两列结果就是你需要的向量X和Y。
以下是Python实现的示例代码:
import numpy as np from scipy.stats import norm, weibull_min def generate_correlated_weibull(N, k, lam, rho_target): # 示例为控制斯皮尔曼秩相关为rho_target的场景,线性相关可自行添加校准逻辑 rho_copula = rho_target # 构造相关矩阵 corr_mat = np.array([[1, rho_copula], [rho_copula, 1]]) # 生成二维正态样本 Z = np.random.multivariate_normal(mean=[0,0], cov=corr_mat, size=N) # 转均匀分布 U = norm.cdf(Z) # 转Weibull分布,weibull_min的c参数对应形状k,scale参数对应尺度lam X = weibull_min.ppf(U[:,0], c=k, scale=lam) Y = weibull_min.ppf(U[:,1], c=k, scale=lam) return X, Y # 调用示例:N=1000,k=2,λ=1,目标相关系数0.5 X, Y = generate_correlated_weibull(N=1000, k=2, lam=1, rho_target=0.5)
内容的提问来源于stack exchange,提问作者Kinka-Byo
相关产品推荐
相关产品推荐

