如何从联合分布中模拟对
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)
但这会出错,提示 x
和 y
已经存在。
此外,一旦我有了样本,我将如何将 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 变量名称。由于 x
和 y
已经存在,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)
drawnorm
的 mean
和 cov
选项都记录在 help
文件中。
我有两个正态分布 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)
但这会出错,提示 x
和 y
已经存在。
此外,一旦我有了样本,我将如何将 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 变量名称。由于 x
和 y
已经存在,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)
drawnorm
的 mean
和 cov
选项都记录在 help
文件中。