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

时间:2015-09-22 13:51:53

标签: random stata correlation

(此问题与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]。我怎么能这样做?

1 个答案:

答案 0 :(得分:4)

这不是确切的,但NORTA / copula方法应该非常接近并且易于实现。

相关引文是:

  

Cario,Marne C.和Barry L. Nelson。 建模和生成具有任意边际分布和相关矩阵的随机向量。技术报告,西北大学工业工程与管理科学系,伊利诺伊州埃文斯顿,1997年。

可以找到论文here

任何分布生成相关随机变量的一般方法是:

  1. 使用corr2data
  2. 从联合标准正态分布中绘制两个(或更多)相关变量
  3. 使用normal()
  4. 计算每个变量的单变量正常CDF
  5. 应用任何分布的逆CDF来模拟该分布的绘制。
  6. [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')
    }