如何生成相关的统一[0,1]变量

问题描述 投票:4回答:1

(这个问题是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]。我怎样才能做到这一点?

random stata correlation
1个回答
4
投票

这会不会是准确的,但NORTA /系词方法应该是相当接近,易于实现。

相关引文是:

卡里奥,马恩C.,和Barry L.尼尔森。建模和生成与任意的边缘分布和相关矩阵的随机矢量。技术报告,工业工程与管理科学学院,西北大学,伊利诺伊州埃文斯顿,1997部。

论文可以发现here

一般的配方,以产生相关的随机变量来自任何分布为:

  1. 绘制两个(或更多)使用corr2data相关变量从一个联合标准正态分布
  2. 计算每个使用normal()这些变量的单变量正常CDF
  3. 适用任何分布的逆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')
}
© www.soinside.com 2019 - 2024. All rights reserved.