我想在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
{
...
}
我已经得到了我想要的东西,因为生成的变量所具有的值是预期的。
但是,我的方法是否正确?如果没有,你会如何修改代码,以便在科学合理的情况下正确地提供所需的结果?
答案 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'
一般情况下,您必须使用法线和伯努利变量之间的相关性,以便根据需要提供结果。可以自动执行此搜索(或提出分析近似值),但我没有时间对其进行编码或解决。