(这个问题是how to generate a dataset of correlated variables with different distributions?相关)
在Stata,说我创建以下统一[0,1]分布的随机变量:
set seed 100
gen random1 = runiform()
我现在想创建与第一相关(相关应当是0.75,说)第二随机变量,而是由0和1有界谨以此第二变量也更或多或少均匀[ 0,1]。我怎样才能做到这一点?
这会不会是准确的,但NORTA /系词方法应该是相当接近,易于实现。
相关引文是:
卡里奥,马恩C.,和Barry L.尼尔森。建模和生成与任意的边缘分布和相关矩阵的随机矢量。技术报告,工业工程与管理科学学院,西北大学,伊利诺伊州埃文斯顿,1997部。
论文可以发现here。
一般的配方,以产生相关的随机变量来自任何分布为:
corr2data
相关变量从一个联合标准正态分布normal()
这些变量的单变量正常CDF第三步是与[0,1] uniform很简单:你甚至都不需要它。通常情况下,你会得到相关的幅度将小于原始(正常)的相关性的大小,所以它可能是碰到那些了一点有用的。
Stata的代码有0.75的相关性2个uniformish变量:
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')
}