(此问题与how to generate a dataset of correlated variables with different distributions?)
有关在Stata中,假设我按照Uniform [0,1]分布创建一个随机变量:
set seed 100
gen random1 = runiform()
我现在想要创建一个与第一个相关的第二个随机变量(相关性应该是.75,比方说),但是以0和1为界。我希望第二个变量也更多 - 或者 - 统一[0,1]。我怎么能这样做?
答案 0 :(得分:4)
这不是确切的,但NORTA / copula方法应该非常接近并且易于实现。
相关引文是:
Cario,Marne C.和Barry L. Nelson。 建模和生成具有任意边际分布和相关矩阵的随机向量。技术报告,西北大学工业工程与管理科学系,伊利诺伊州埃文斯顿,1997年。
可以找到论文here。
从任何分布生成相关随机变量的一般方法是:
corr2data
normal()
[0,1] uniform的第三步非常简单:你甚至不需要它。通常,您获得的相关性的幅度将小于原始(正常)相关的幅度,因此将这些相关性稍微提高可能是有用的。
2个统一变量的Stata代码,相关系数为0.75:
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。
评论中的问题代码
相关矩阵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')
}