这并不准确,但 NORTA/copula 方法应该非常接近且易于实现。
相关引用为:
Cario、Marne C. 和 Barry L. Nelson。 建模和生成具有任意边际分布和相关矩阵的随机向量。技术报告,工业工程和管理科学系,西北大学,伊利诺伊州埃文斯顿,1997 年。
论文可以在here找到。
从任何分布生成相关随机变量的一般方法是:
- 使用
corr2data从联合标准正态分布中绘制两个(或更多)相关变量
- 使用
normal() 计算每个变量的单变量正态 CDF
- 应用任何分布的逆 CDF 来模拟从该分布中抽取。
使用[0,1] uniform,第三步非常简单:您甚至不需要它。通常,您获得的相关性的大小会小于原始(正常)相关性的大小,因此将它们稍微提高一点可能会很有用。
相关性为 0.75 的 2 个统一变量的 Stata 代码:
clear
// Step 1
matrix C = (1, .75 \ .75, 1)
corr2data x y, n(10000) corr(C) double
corr x y, means
// Steps 2-3
replace x = normal(x)
replace y = normal(y)
// Make sure things worked
corr x y, means
stack x y, into(z) clear
lab define vars 1 "x" 2 "y"
lab val _stack vars
capture ssc install bihist
bihist z, by(_stack) density tw1(yline(-1 0 1))
如果您想改进 统一情况的近似值,您可以像这样转换相关性(参见链接论文的第 5 节):
matrix C = (1,2*sin(.75*_pi/6)\2*sin(.75*_pi/6),1)
这是 0.76536686 而不是 0.75。
cmets 中问题的代码
相关矩阵C写得更紧凑,我正在应用变换:
clear
matrix C = ( 1, ///
2*sin(-.46*_pi/6), 1, ///
2*sin(.53*_pi/6), 2*sin(-.80*_pi/6), 1, ///
2*sin(0*_pi/6), 2*sin(-.41*_pi/6), 2*sin(.48*_pi/6), 1 )
corr2data v1 v2 v3 v4, n(10000) corr(C) cstorage(lower)
forvalues i=1/4 {
replace v`i' = normal(v`i')
}