使用 copula 进行数据转换

机器算法验证 数据转换 参考 系词
2022-03-15 20:46:05

我听说过使用 copula 来转换数据。例如,据说它应用于非正常的数据以使其看起来更正常。但是,我不太明白这是如何完成的。我读过 copula 的介绍(例如 Nelsen 的“An Introduction to Copula”等),虽然我理解这个概念(至少我认为我理解),但我只看到 copula 被用作衡量两个或更多随机变量。我也读过this onethis one之类的问题,但我还是没看到。

为了给我的问题一个更具体的设置,我有一个由多元时间序列组成的数据集,{Xt}t=1T在哪里XtRd. 我想为这个数据集拟合一个模型,假设

Xt|Xt1N(ΓXt1,Ω)
(在哪里Γ是一个d×d矩阵),但我的数据似乎不符合这个假设(至少,不是根据 R 中的多元正态性检验)。我可以使用 copula 将这个数据集转换为比原始数据集更正常的数据集吗?

2个回答

MathWorks 的此页面详细描述了将 copula 用于各种任务的详细说明,并在 MATLAB 中提供了很多示例:用于多元建模的概率分布这有助于了解如何在一些简单情况下使用 copula 的具体细节。

用于数据矩阵的转换X到具有边际标准正态分布函数的状态,本质上是一个两步过程。

第一步是将数据的边距转换为均匀分布。这可以通过拟合理论上已知的分布、使用经验分布函数或使用分布函数的平滑估计来完成。

第二步,利用正态分布函数的分位数函数将数据的边距转化为正态。

这就是数学理论。我现在不知道使用错误指定的分布或估计分布代替理论分布的后果是什么。

R 包regpro有一个名为的内置函数copula.trans(),可以将您的数据转换为具有按标准法线分布的边距。换句话说,它执行所描述的两个步骤。如果X是你n×d数据矩阵,然后copula.trans(X)为您返回一个数据矩阵,其中边缘转换为理论上具有标准正态分布(默认情况下)。

如何返回不包含在包中。要回溯该过程,您首先需要标准正态的百分位数函数,然后是理论分布函数、插值经验分布函数或分布函数的平滑估计量。

如果在此过程之后具有边际正态分布足以驱动至少多元正态性,那就太好了。然而,不幸的是,正如我们中的一些人所知,这通常不是真的。对于一个简单的反例,请参阅:两个正态分布的随机变量不需要联合二元正态(有关更多信息,请参阅下面的@Glen_b 评论。)

除此之外,看起来可能需要一些进一步的假设来确保转换后的分布遵循如下关系Xt|Xt1N(ΓXt1,Ω).

最初,我正在研究可能提供某些保证的条件分布的一些结果,例如在(Arnold and Pourahmadi, 1988)(Ashsanullah and Wesolowski, 1994)中发现的结果。一个例子是可交换性标准

(X1,...,Xt1)=d(X2,...,Xt).
但是,这里的设置有点不同。 (见下面@Stéphane Lauren 的评论。)

我可以使用 copula 将这个数据集转换为比原始数据集更正常的数据集吗?

也许使用 copula 变换可以很好地满足您的想法,但似乎几乎没有理论基础可以完全达到您想要拟合的模型。

M. Ahsanullah 和 J. Wesolowski (1994) 通过条件正态性实现多元正态性。 统计和概率信函20:235--238。

BC Arnold 和 M. Pourahmadi (1988) 多元分布的条件表征。 Metrika 35(1):95--108。

Copulas 用于从边缘分布中恢复联合分布。此应用程序基于Sklar 定理,该定理指出,如果您有两个边际分布,则它们通过 copula 链接到联合分布。copula 本身就是一个函数。如果你有一个双变量分布,那么 copula 也是一个双变量函数。这个定理没有告诉你的是如何找到这个 copula。它只告诉你它存在。

来到你的问题:

我可以使用 copula 将这个数据集转换为比原始数据集更正常的数据集吗?

不,你不能。你说

我想为这个数据集拟合一个模型,假设 (其中是 ad×d 矩阵),但我的数据确实似乎不遵守这个假设Xt|Xt1N(ΓXt1,Ω)Γ

这是主要问题:您想要拟合模型,这似乎不是适合您的数据的模型。如果您真的认为您的数据不正常,那么您不应该拟合正常模型。时期。

现在,您可以使用 copula 以不同的方式对数据进行建模。就是这样。

  1. 选择一个系词。如何?您可以从高斯 copula 开始。关于这个的“好”之处在于,如果你的边际实际上是高斯人,那么联合将是多元高斯人。如果你的边际是“某种”正常的,那么这个系词可能对你很有效。
  2. 建立一个经验分布,例如在 MATLAB 中使用ecdf这个想法是将您的数据输入此函数,该函数将构建累积分布,而无需对分布的函数形式进行任何假设。或者,您可以使用非参数分布,例如核密度估计。底线是获得单变量累积分布,即边际,因为它是 copula 的输入。
  3. 将 copula 拟合到数据。
  4. 使用拟合的 copula 生成随机样本,它将产生 0 到 1 之间的多元随机数。
  5. 插入逆经验 CDF,将 [0,1] 范围转换为随机变量。

请注意,这里的主要假设是 copula。那里有很多 copula,您可以尝试其中的几个。这是这个链条中最薄弱的环节。

这是MATLAB 中的一个示例。