如何生成相关的 Uniform[0,1] 变量
How to generate correlated Uniform[0,1] variables
(此问题与how to generate a dataset of correlated variables with different distributions?相关)
在 Stata 中,假设我创建了一个遵循均匀 [0,1] 分布的随机变量:
set seed 100
gen random1 = runiform()
我现在想创建第二个与第一个相关的随机变量(相关性应该是 .75,比如说),但以 0 和 1 为界。我希望第二个变量也更-或更少 Uniform[0,1]。我该怎么做?
这并不准确,但 NORTA/copula 方法应该非常接近并且易于实施。
相关引用为:
Cario, Marne C., and Barry L. Nelson. Modeling and generating random vectors with arbitrary marginal distributions and correlation matrix. Technical Report, Department of Industrial Engineering and Management Sciences, Northwestern University, Evanston, Illinois, 1997.
论文可以找到here。
从 any 分布生成相关随机变量的一般方法是:
- 使用
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)*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')
}
(此问题与how to generate a dataset of correlated variables with different distributions?相关)
在 Stata 中,假设我创建了一个遵循均匀 [0,1] 分布的随机变量:
set seed 100
gen random1 = runiform()
我现在想创建第二个与第一个相关的随机变量(相关性应该是 .75,比如说),但以 0 和 1 为界。我希望第二个变量也更-或更少 Uniform[0,1]。我该怎么做?
这并不准确,但 NORTA/copula 方法应该非常接近并且易于实施。
相关引用为:
Cario, Marne C., and Barry L. Nelson. Modeling and generating random vectors with arbitrary marginal distributions and correlation matrix. Technical Report, Department of Industrial Engineering and Management Sciences, Northwestern University, Evanston, Illinois, 1997.
论文可以找到here。
从 any 分布生成相关随机变量的一般方法是:
- 使用
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)*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')
}