【问题标题】:Can I generate bivariate normal random variables with correlation 1 using Cholesky factorization?我可以使用 Cholesky 分解生成具有相关性 1 的二元正态随机变量吗?
【发布时间】:2014-10-14 16:15:17
【问题描述】:

是否可以使用 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

有什么想法吗?

【问题讨论】:

  • 如果你想用cor 1 创建变量,这很容易...x &lt;- rnorm(10000), y &lt;- constant * x 其中constant 是你想要的大于0的任何东西。但是如果有噪音,则相关性将小于 1。
  • @Gregor - 但我想转换为使用 chol 或类似的东西。
  • @user3022875 为什么重要的是你怎么做的? 1是一个病态的案例,但它是一个微不足道的案例。
  • 如果你想使用矩阵乘法,你可以使用MAT %*% M 其中M &lt;- matrix(c(1, 0, constant, 0), 2)constant > 0。但是,再一次,@ 的第二列是什么并不重要987654330@ 是...如果您的答案取决于第二列,则相关性不会为 1。

标签: r


【解决方案1】:

实际上,您可以通过使用 pivoted 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))。您可以按不同的标准差重新调整它们,然后按不同的平均值移动它们以使它们不同。


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-27
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2011-01-05
    • 1970-01-01
    • 2019-03-16
    相关资源
    最近更新 更多