我可以使用Cholesky分解生成具有相关性1的双变量正态随机变量吗?

时间:2014-10-14 16:15:18

标签: r

是否可以使用cholesky分解技术设置correlation = 1

set.seed(88)
mu<- 0
sigma<-1
x<-rnorm(10000, mu, sigma)
y<-rnorm(10000, mu, sigma)
MAT<-cbind(x,y)
cor(MAT[,1],MAT[,2])

#this doesn't work because 1 makes it NOT positive-definite. any number 0 to .99 works
correlationMAT<- matrix(1,nrow = 2,ncol = 2)

U<-chol(correlationMAT)
newMAT<- MAT %*% U 
cor(newMAT[,1], newMAT[,2])  #.....but I want to make this cor = 1

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

实际上,您可以使用旋转 Cholesky分解。

correlationMAT<- matrix(1,nrow = 2,ncol = 2)
U <- chol(correlationMAT, pivot = TRUE)
#Warning message:
#In chol.default(correlationMAT, pivot = TRUE) :
#  the matrix is either rank-deficient or indefinite

U
#     [,1] [,2]
#[1,]    1    1
#[2,]    0    0
#attr(,"pivot")
#[1] 1 2
#attr(,"rank")
#[1] 1

注意,U具有相同的列。如果我们执行MAT %*% U,我们会复制MAT[, 1]两次,这意味着第二个随机变量将与第一个相同。

newMAT<- MAT %*% U

cor(newMAT)
#     [,1] [,2]
#[1,]    1    1
#[2,]    1    1

您不必担心两个随机变量是相同的。请记住,这仅表示标准化后(N(0, 1))相同。您可以通过不同的标准偏差重新缩放它们,然后将它们移动不同的平均值以使它们不同。

透视Cholesky分解非常有用。我对这篇文章的回答是:Generate multivariate normal r.v.'s with rank-deficient covariance via Pivoted Cholesky Factorization给出了更全面的图片。