假设我们有
其中是大小为 n 的均匀随机样本,并且
那么和之间的相关性为。
如何将其扩展到三个变量:、、?
假设我们有
其中是大小为 n 的均匀随机样本,并且
那么和之间的相关性为。
如何将其扩展到三个变量:、、?
该问题包含评论中指出的几个错误 - 如问题中所定义,Z 既不统一也不具有指定的相关性。
红衣主教提到了copulas,这是最普遍的方法。然而,有几种非常简单的方法可以获得相关的制服(可以看作是不同类型 copula 的捷径)。
因此,让我们从一些获得相关制服的方法开始。
1)如果添加两个制服,结果是三角形的,而不是均匀的。但是您可以使用结果变量的 cdf 作为转换,以将结果恢复为统一。当然,结果不再是线性相关的。
这是一个 R 函数,用于将 (0,2) 上的对称三角形转换为标准统一
t2u = function(x) ifelse(x<1, x^2, 2-(2-x)^2)/2
让我们检查一下它是否提供制服
u1 = runif(30000)
u2 = runif(30000)
v1 = t2u(u1+u2)
它与 u1 和 u2 相关:
> cor(cbind(u1,u2,v1))
u1 u2 v1
u1 1.000000000 0.006311667 0.7035149
u2 0.006311667 1.000000000 0.7008528
v1 0.703514895 0.700852805 1.0000000
但不是线性的,由于单调变换到均匀性
以此为工具,我们可以生成一些额外的变量来获得三个等相关的制服:
u3 = runif(30000)
v2 = t2u(u1+u3)
v3 = t2u(u2+u3)
cor(cbind(v1,v2,v3))
v1 v2 v3
v1 1.0000000 0.4967572 0.4896972
v2 0.4967572 1.0000000 0.4934746
v3 0.4896972 0.4934746 1.0000000
v 变量之间的关系都是这样的:
--
第二种选择是通过混合生成。不要对制服求和,而是以固定的概率取它们。
例如
z = ifelse(rbinom(30000,1,.7),u1,u2)
cor(cbind(u1,z))
u1 z
u1 1.0000000 0.7081533
z 0.7081533 1.0000000
它可以再次用于生成多个相关的制服。
--
第三种简单的方法是生成相关法线并转换为均匀度。
n1=rnorm(30000)
n2=rnorm(30000)
n3=rnorm(30000)
x=.6*n1+.8*n2
y=.6*n2+.8*n3
z=.6*n3+.8*n1
cor(cbind(x,y,z))
x y z
x 1.0000000 0.4763703 0.4792897
y 0.4763703 1.0000000 0.4769403
z 0.4792897 0.4769403 1.0000000
所以现在我们转换为统一:
w1 = pnorm(x)
w2 = pnorm(y)
w3 = pnorm(z)
cor(cbind(w1,w2,w3))
w1 w2 w3
w1 1.0000000 0.4606723 0.4623311
w2 0.4606723 1.0000000 0.4620257
w3 0.4623311 0.4620257 1.0000000
方法 2 和 3 的一个好处是,您可以在选择事物的相关程度时获得多种选择(并且它们不必像这里的示例那样是等相关的)。
当然,还有很多其他方法,但这些方法都快速而简单。
棘手的部分是获得所需的人口相关性。它不像你只想要相关高斯那样简单。Quantibex 在 生成均匀分布和相关的随机数对的回答给出了一种修改我在这里的第三种方法的方法,该方法应该给出所需的总体相关性。
首先,您是否假设是独立的?如果是,则和之间的相关系数不是。如果被定义为 ,它将是。
简单看一下相关系数公式的定义和余弦定律应该会让你相信是系列之间 ,如果系列被视为向量,每个数据点被视为向量的维度。如果你有成对的独立序列,那就是三个向量,它们都是相互正交的(因为它们之间的角度的都是的。
这应该让您开始将系列分解为其组件,就像您将向量分解为其正交组件一样。