使用给定的样本协方差矩阵生成数据


22

给定协方差矩阵,如何生成数据,使其具有样本协方差矩阵\ hat {\ boldsymbol \ Sigma} = \ boldsymbol \ Sigma_sΣsΣ^=Σs


更笼统地说:我们经常对从密度f(x \ vert \ boldsymbol \ theta)生成数据感兴趣f(x|θ),其中数据x给出了一些参数矢量θ。这产生了一个样本,然后我们可以据此再次估计值θ^。我感兴趣的是一个反向问题:如果给我们一组参数θs,并且我们想生成一个样本x例如\ boldsymbol {\ hat \ theta} = \ boldsymbol,该怎么办?\ theta_ {s}θ^=θs

这是一个已知问题吗?这样的方法有用吗?有可用的算法吗?


Attilio Meucci提供了可扩展的解决方案。看到这个风险条MATLAB代码
彼得棉

Answers:


16

这些类型的问题有两种不同的典型情况:

i)您想从给定的分布中生成样本,其总体特征与指定的总体特征相匹配(但由于样本变化,您没有完全匹配的样本特征)。

ii)您想生成一个样本特征与指定特征相匹配的样本(但是,由于将样本量与预先指定的一组值完全匹配的限制,实际上并不是来自您想要的分布)。

您需要第二种情况-但是您可以通过采用与第一种情况相同的方法来实现,但是需要额外的标准化步骤。

因此,对于多元法线,可以用一种非常简单的方式来完成:

对于第一种情况,您可以使用不具有总体结构的随机法线(例如具有期望0和恒等协方差矩阵的iid标准法线),然后对其进行强加-变换以获得协方差矩阵并表示您想要的。如果和是人口均值和协方差,你需要和是独立同分布的标准正态分布,则计算,对于一些其中(例如一个合适的可经由Cholesky分解获得) 。则具有所需的总体特征。μΣzy=Lz+μLLL=ΣLy

在第二个步骤中,您必须首先对随机法线进行变换,以消除甚至远离零均值和同一性协方差的随机变化(使样本均值为零,并且样本协方差),然后像以前一样进行操作。但是从精确均值(方差中消除样本偏差的初始步骤会干扰分布。(在小样本中,它可能非常严重。)In0I

这可以通过减去的样本均值()并计算的Cholesky分解来完成。如果是左Cholesky因子,则应该具有样本均值0和同一性样本协方差。然后,您可以计算并获得具有所需样本矩的样本。(根据样本量的定义方式,可能会用类的因素进行乘除除的小提琴,但确定需求很容易。)zz=zz¯zŽ 0 = 大号* - 1个 Z ^ * ý = 大号Ž 0 + μ Lz(0)=(L)1zy=Lz(0)+μn1n


1
+1。前几天,我需要使用给定的样本协方差矩阵生成一些数据,不知道该怎么做,由于某种原因,我花了很多时间才能找到答案。为了增加该线程的可视性并说明您的建议,我在此处发布了一些Matlab代码的另一个答案。
变形虫说恢复莫妮卡

@amoeba我想知道是否有可能将您使用的尚未在此处出现的搜索词放入问题标签中(或可能在问题文本的小幅编辑中插入几个,这仍将有助于找到它)。我现在想知道我是否应该在R中做同样的事情……但是这样做对我的回答会更好,还是作为对你的补充?
Glen_b-恢复莫妮卡2015年

1
我已经可以自由地编辑问题,并且还试图制定答案,使其包含尽可能多的关键字。希望这会有所帮助。顺便说一句,令我惊讶的是,这个简单的技巧(在转换为所需的协方差之前将生成的数据变白)很难用Google搜索;找不到任何东西(在简历或其他地方),直到我终于找到了答案。
变形虫说恢复莫妮卡

1
@amoeba哦,好的,谢谢。是的,实际上,我不能说我记得曾经在多变量案例中提到它(毫无疑问,因为它是一个很明显的主意,尤其是如果您已经为单变量案例想到过,或者已经在单变量案例中看到过)。
Glen_b-恢复莫妮卡2015年

@Glen_b就像您说的那样,这些“清洗过的”样本的最终分布不正常。您是否知道最终的分布是什么?或者,也许它是否等于/不等于条件分布Zz¯=μ,Cov(z)=Σ
GG

17

@Glen_b给出了一个很好的答案(+1),我想用一些代码来说明。

如何从具有给定协方差矩阵Σd维多元高斯分布中生成样本?通过从标准高斯生成样本并将其乘以协方差矩阵的平方根(例如,乘以c h o lΣ )),即可轻松做到这一点。这在CV的许多线程中都有介绍,例如:在这里:如何使用预先指定的相关矩阵生成数据?这是一个简单的Matlab实现:ndΣchol(Σ)

n = 100;
d = 2;
Sigma = [ 1    0.7  ; ...
          0.7   1   ];
rng(42)
X = randn(n, d) * chol(Sigma);

结果数据的样本协方差矩阵当然不是精确的;例如在上面的示例中返回Σcov(X)

1.0690    0.7296
0.7296    1.0720

如何使用预先指定的样本相关性或协方差矩阵生成数据?

正如@Glen_b所写,在从标准高斯生成数据之后,将其居中,加白并标准化,以使其具有样本协方差矩阵;然后将其与相乘。Ç ħ ø Σ Ichol(Σ)

这是我的Matlab示例的延续:

X = randn(n, d);
X = bsxfun(@minus, X, mean(X));
X = X * inv(chol(cov(X)));
X = X * chol(Sigma);

现在cov(X),根据需要返回

1.0000    0.7000
0.7000    1.0000

+1。不知何故,这个问题在简历中的不同位置以各种形式出现。如果我们知道多元分布是非高斯分布的,是否可以进行?
rgk

如果您知道多元分布的形式,则可能希望它看起来像这样。
Glen_b-恢复莫妮卡
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.