【问题标题】:Generate correlated variables in Stata在Stata中生成相关变量
【发布时间】:2016-01-06 08:03:17
【问题描述】:

我想在 Stata 中生成 5 个相关变量。四个具有特定均值和标准差的正态分布,一个服从伯努利概率为 0.60。

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

我的代码如下:

matrix C =     (1,                  ///                                                                 /// 
2*sin(0.05*_pi/6), 1,      /// 
2*sin(-0.45*_pi/6), 2*sin(0.44*_pi/6), 1,            /// 
2*sin(0.22*_pi/6), 2*sin(0.33*_pi/6), 2*sin(-0.54*_pi/6), 1,   /// 
2*sin(0.45*_pi/6), 2*sin(0.32*_pi/6), 2*sin(-0.22*_pi/6), 2*sin(-0.13*_pi/6), 1)    

matrix B = (40, 26, 13, 146, 0.35) 
matrix A = (9, 11, 5, 2, 1)

corr2data var1 var2 var3 var4 var5, n(10000) corr(C) means(B) sds(A) cstorage(lower)

replace var1 = rnormal(var1)
replace var2 = rnormal(var2)
replace var3 = rnormal(var3)
replace var4 = rnormal(var4)

replace var5 = normal(var5)
replace var5 = rbinomial(1,var5)

我或多或少地得到了我想要的东西,因为生成的变量所具有的值符合预期。

但是,我的方法正确吗?如果不是,您将如何修改代码以在科学合理的同时正确给出预期的结果?

【问题讨论】:

    标签: variables random stata correlation


    【解决方案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'
    

    一般来说,您必须处理法线与伯努利变量之间的相关性,才能让事情如您所愿。可能可以自动执行此搜索(或提出分析近似值),但我没有时间编写代码或解决它。

    【讨论】:

    • @Cynthia 您的建议引入了另一个需要调整的调整参数,弄乱了相关性,并且据我所知没有理论基础。尽管名称相似,rnormal()normal() 是非常不同的野兽。如果您只想生成伯努利变量(并忽略相关性),请尝试 gen b = uniform()<=0.6gen b = rbinomial(1,0.6)
    • @Cynthia 的目标是创建二元结果并估计 var1-var5 的系数吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多