如何从联合分布中模拟对

How to simulate pairs from a joint distribution

我有两个正态分布 X 和 Y,它们之间有给定的协方差以及 X 和 Y 的方差,我想模拟(比如 200 个点)来自联合分布的点对,但我不能'似乎找不到 command/way 来执行此操作。我想最终在散点图中绘制这些点。

到目前为止,我有

set obs 100
set seed 1

gen y = 64*rnormal(1, 5/64)
gen x = 64*rnromal(1, 5/64)
matrix D = (1, .5 | .5, 1)

drawnorm x, y, cov(D)

但这会出错,提示 xy 已经存在。

此外,一旦我有了样本,我将如何将 drawnorm 输出绘制为散点图?

这是一个几乎最小的例子:

. clear 

. set obs 100
number of observations (_N) was 0, now 100

. set seed 1

. matrix D = (1, .5 \ .5, 1)

. drawnorm x y, cov(D)

正如 help for drawnorm 所解释的那样,您必须提供 new 变量名称。由于 xy 已经存在,drawnorm 将您排除在外。您还有一个会触发语法错误的多余逗号。

help scatter 告诉你散点图。

生成相关数据的相关方法是使用corr2data命令:

clear

set obs 100
set seed 1

matrix D = (1, .5 \ .5, 1)

drawnorm x1 y1, cov(D)
corr2data x2 y2, cov(D)


. summarize x*

Variable |        Obs        Mean    Std. Dev.       Min        Max
-------------+---------------------------------------------------------
      x1 |        100    .0630304    1.036762  -2.808194   2.280756
      x2 |        100    1.83e-09           1  -2.332422   2.238905

. summarize y*

Variable |        Obs        Mean    Std. Dev.       Min        Max
-------------+---------------------------------------------------------
      y1 |        100   -.0767662    .9529448  -2.046532   2.726873
      y2 |        100    3.40e-09           1  -2.492884   2.797518

重要的是要注意,与 drawnorm 不同,corr2data 方法不会生成来自基础人群的样本数据。


然后您可以创建一个 scatter 图,如下所示:

scatter x1 y1 

或者在一张图中比较两种方法:

twoway scatter x1 y1 || scatter x2 y2

编辑:

对于特定的均值和方差,您需要在 drawnorm 中指定均值向量 μ 和协方差矩阵 Σ。例如,要绘制两个均值分别为 8 和 12 且方差分别为 5 和 8 的联合正态分布的随机变量,您可以键入:

matrix mu = (8, 12)
scalar cov = 0.4 * sqrt(5 * 8) // assuming a correlation of 0.4
matrix sigma = (5, cov \ cov, 8)

drawnorm double x y, means(mu) cov(sigma)

drawnormmeancov 选项都记录在 help 文件中。