如何生成相关的随机数(给定的均值,方差和相关度)?


53

很抱歉,这似乎太基本了,但是我想我只是想在这里确认了解。我觉得我必须分两步执行此操作,并且我已经开始尝试绘制相关矩阵,但是它似乎才真正开始涉及。我正在寻找一种简洁,合理的解释(理想情况下带有对伪代码解决方案的提示),这是一种生成相关随机数的理想方法。

给定两个具有已知均值和方差的伪随机变量height和weight以及给定的相关性,我认为我基本上是在试图理解第二步应该是什么样子:

   height = gaussianPdf(height.mean, height.variance)
   weight = gaussianPdf(correlated_mean(height.mean, correlation_coefficient), 
                        correlated_variance(height.variance, 
                        correlation_coefficient))
  • 如何计算相关的均值和方差?但是我想确认这确实是相关的问题。
  • 我需要诉诸矩阵操纵吗?还是我在解决此问题的基本方法上还有其他非常错误的地方?

1
不确定我是否正确理解您,但是您不必计算“相关均值和方差”。如果您假设变量是双变量正态的,则足以指定各个均值和方差以及相关性。您要为此使用任何特定的软件吗?
mark999 2012年


Answers:


44

要回答有关“生成相关随机数的一种理想的,理想的快速方法”的问题:给定所需的方差-协方差矩阵(定义为正定),则其Cholesky分解为:C = L L TL是下三角矩阵。CCLLŤ大号

如果现在使用此矩阵投影不相关的随机变量向量X,则得到的投影Y = L X将是相关随机变量的投影。大号XY=LX

您可以在这里找到简明的解释为什么会发生这种情况。


谢谢!这非常有帮助。我认为至少我对下一步需要有更好的了解。
约瑟夫·魏斯曼

7
该方法是否仅适用于高斯分布(如问题中所指定),或者可以用于生成遵循其他分布的相关变量?如果不是,您是否知道在这种情况下可以使用的方法?
user000001 2013年

1
@迈克尔:是的。前面已经说过,给定是有效的协方差矩阵,Cholesky分解是最快的方法。您还可以通过使用SVD 获得C的(对称)平方根X矩阵(所以C = X X = X X T,其中X = U S 0.5 V T,来自C = U S V T),但这会更昂贵太。CXCC=XX=XXŤX=ü小号0.5VŤC=ü小号VŤ
usεr11852说恢复单胞菌

1
@迈克尔:当然。它们的协方差将是(大约)相同,而不是数字本身。
usεr11852说恢复单胞菌

1
@Sid:整个实线上不支持的任何连续分发都将立即失败。例如,如果我们使用统一,我们不能保证“相关的数字”将在[ 0 1 ] ; 类似地,对于泊松,我们将得到非离散数。另外,任何分布的总和仍不是相同分布的分布(例如,将t分布求和不会导致t分布)也会失败。在上述所有情况下,产生的数字根据Cü[01个][01个]ŤŤC但它们与我们开始的发行版不符。
恢复单胞菌usεr11852说,

36

+1到@ user11852和@ jem77bfp,这些都是不错的答案。让我从不同的角度来看待这个问题,不是因为我认为它在实践中一定更好,而是因为我有启发性。以下是我们已经知道的一些相关事实:

  1. 是回归线当两个斜率 X ÿ标准化的,即, Ñ0 1 [RXÿñ01个
  2. Y的方差可归因于 X的方差的比例, [R2ÿX



    (另请参见方差规则):

  3. 随机变量乘以常数的方差是常数乘以原始方差的平方
    Var[一种X]=一种2Var[X]
  4. 方差相加,即两个随机变量之和(假设它们是独立的)是两个方差之和:
    Var[X+ε]=Var[X]+Var[ε]

现在,我们可以结合这四个事实来创建两个标准正态变量,它们的总体将具有给定的相关性(更恰当地说是ρ),尽管您生成的样本将具有变化的样本相关性。我们的想法是创建一个伪随机变量,X,也就是标准正常,Ñ0 1 ,和然后找到一个系数,一个和误差方差,v ê,使得ÿ Ñ0 一个2 + v e,其中[RρXñ01个一种vËÿñ0一种2+vË。(注意, | a |必须小于等于 1才能起作用,而且 a = r。)因此,您从所需的 r开始;那就是你的系数 a。然后找出所需的误差方差,即 1 r 2。(如果软件要求您使用标准偏差,则取该值的平方根。)最后,对于生成的每个伪随机变量 x i,生成一个伪随机误差变量 e i一种2+vË=1个|一种| 1个一种=[R[R一种1个-[R2X一世Ë一世具有适当的误差方差,并通过相乘加法来计算相关的伪随机变量y ivËÿ一世

如果您想在R中执行此操作,则以下代码可能适用于您:

correlatedValue = function(x, r){
  r2 = r**2
  ve = 1-r2
  SD = sqrt(ve)
  e  = rnorm(length(x), mean=0, sd=SD)
  y  = r*x + e
  return(y)
}

set.seed(5)
x = rnorm(10000)
y = correlatedValue(x=x, r=.5)

cor(x,y)
[1] 0.4945964

(编辑:我忘了提及:)正如我已经描述的那样,此过程为您提供了两个标准的正态相关变量。如果您不希望使用标准法线,但是希望变量具有特定的均值(非0)和SD(非1),则可以对其进行变换而不会影响相关性。因此,您将减去观察到的均值以确保该均值正好为0,将变量乘以所需的SD,然后加上所需的均值。如果您希望观察到的均值围绕所需均值正常波动,则可以将初始差值加回来。本质上,这是相反的Z分数转换。由于这是线性变换,因此变换后的变量将与其他变量具有相同的相关性。

同样,这只是最简单的形式,它只能让您生成一相关变量(此变量可以放大,但很快就会变丑),并且肯定不是完成工作的最便捷方法。在R中,您可能想在MASS软件包中使用?mvrnorm,这既因为它更容易,又因为您可以使用给定的人口相关矩阵生成许多变量。尽管如此,我认为值得一遍,以简单的方式了解一些基本原理。


这种本质上回归的方法特别好,可以让它生成一个与任意数量的现有 X“预测变量” 相关的随机Y。我这样理解对吗?
ttnphns

这取决于您想要的变量@ttnphns中到底是什么相关模式。您可以一次又一次地进行迭代,但这会很乏味。要使用给定的模式创建许多相关变量,最好使用Cholesky分解。
gung-恢复莫妮卡

gung,您是否知道如何使用Cholesky根据与多个现有(未模拟)Xs 的相关矢量来生成一个与Y相关的Y(与您的方法类似)?
ttnphns

@ttnphns,您要生成一个带有给定总体相关性且带有一组X的Y,而不是一组都具有预先指定的总体相关性的p变量吗?一种简单的方法是编写一个回归方程,以从您的X生成单个Y帽,然后使用上述方法生成Y作为您的Y帽的相关项。如果需要,您可以问一个新的问题。
gung-恢复莫妮卡

1
这就是我在最初的评论中的意思:此方法将直接扩展您在回答中所说的内容:本质上是一种回归(Hat)方法。
ttnphns

16

一般来说,这不是一个简单的事,但我相信有用于包装多元正态分布变量代(至少在R,看到mvrnormMASS包中),在那里你只需输入协方差矩阵和平均向量。

还有另一种“建设性”的方法。假设我们要对随机向量建模并得到其分布函数F x 1x 2。第一步是获得边际分布函数。即整合˚F在所有X 2˚F X 1X 1= ∫ - ˚F X 1X 2ð X 2(X1,X2)F(x1,x2)Fx2 随后,我们发现 ˚F - 1 X 1 -的反函数 ˚F X 1 -和插入的随机变量 ξ 1,其上的间隔均匀地分布 [ 0 1 ]。在此步骤中,我们产生第一坐标 X 1 = ˚F - 1 X 1ξ

FX1(x1)=F(x1,x2)dx2.
FX11FX1ξ1[0,1]x^1=FX11(ξ)

现在,既然我们已经得到了一个坐标,我们需要将其插入到我们最初的分布函数,然后用获得条件的条件分布函数X 1 = X 1˚F X 2 | X 1 = X 1= ˚F X 1X 2F(x1,x2)x1=x^1 其中˚FX1是边际的概率密度函数X1分布; 即˚F ' X 1X1=˚FX1X1

F(x2|X1=x^1)=F(x^1,x2)fX1(x^1),
fX1X1FX1(x1)=fX1(x1)

ξ2[0,1]ξ1F(x2|X1=x^1)x^2=(F(x2|X1=x^1))1(ξ)x^2F(x^2|X1=x^1)=ξ

如果您不了解将统一变量插入逆概率分布函数的含义,请尝试绘制单变量情况的草图,然后记住逆函数的几何解释是什么。


聪明的主意!具有简单直观的吸引力。但是,在计算上似乎是昂贵的。
MichaelChirico

fX,Y(x,y)=fX(x)fY|X(y)

1

如果您准备放弃效率,则可以使用一次性算法。它的优点是,它允许任何种类的分布(不仅是高斯分布)。

{X一世}一世=1个ñ{ÿ一世}一世=1个ñC

CØd=CØ[R[R{X一世}{ÿ一世}

ñ1个ñ21个ñ1个2ñ

Xñ1个Xñ2

CñËw=CØ[R[R{X一世}{ÿ一世}

|C-CñËw|<|C-CØd|

|Cc|<ϵ

xi

祝好运!


x一世co[R[RX一世ÿ一世

X一世{X一世}ÿcorr(xi,yi)corr({xi},{yi})=(1/N)Σi=1N(xix¯)(yyy¯

{}corr({xi},{yi})
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.