是否可以使用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
有什么想法吗?
答案 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给出了更全面的图片。