在Stata中生成相关变量

时间:2016-01-06 08:03:17

标签: variables random stata correlation

我想在Stata中生成5个相关变量。四个正态分布,具有特定的平均值和标准偏差,一个跟随bernoulli,概率为0.60。

我试图遵循帖子中给出的建议: How to generate correlated Uniform[0,1] variables

我的代码如下:

[Parameter("aaa", typeof(int), "this is aaa")]
[Parameter("bbb", typeof(bool), "this is bbb")]
[Serializable]
public class Number : DataElement
{
       ...
}

我已经得到了我想要的东西,因为生成的变量所具有的值是预期的。

但是,我的方法是否正确?如果没有,你会如何修改代码,以便在科学合理的情况下正确地提供所需的结果?

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题。首先,相关矩阵的变换仅对生成统一变量的特殊情况有用,但您需要相关法线和二项式。其次,您不需要使用rnormal重新生成var1-var4,因为corr2data已经为您执行了此操作。第三,你的相关矩阵不是正(半)明确的,所以代码不会像我所写的那样运行。第四,你需要应用伯努利分布的逆CDF来模拟来自该分布的抽取(链接帖子中的第3步),而不是使用rbinomial()

这是一个简单的例子,有两个法线和一个伯努利:

clear
local p=0.6
matrix m = (10,0,0) 
matrix sd = (5,1,1)

/* I am shooting for corr(n1,b)=0.5 and corr(n2,b)=0.75, so I exaggerate their correlations in the bottom row */
matrix c = /// 
(1, /// 
0.5, 1, ///
0.64, 0.95,1)    

corr2data n1 n2 b, n(10000) corr(c) means(m) sds(sd) cstorage(lower)

/* Steps 2-3 for the one Bernoulli variable */
replace b = cond(normal(b)>=(1-`p'),1,0)

/* Check that we did things correctly */
corr, means
qnorm n1
qnorm n2
prtest b = `p'

一般情况下,您必须使用法线和伯努利变量之间的相关性,以便根据需要提供结果。可以自动执行此搜索(或提出分析近似值),但我没有时间对其进行编码或解决。