生成多变量正态r.v.&x27;基于枢轴Cholesky分解的秩亏协方差s

生成多变量正态r.v.&x27;基于枢轴Cholesky分解的秩亏协方差s,r,matrix,random,statistics,normal-distribution,R,Matrix,Random,Statistics,Normal Distribution,我只是想让Cholesky分解工作起来,以模拟相关的价格变动 我使用以下代码: cormat <- as.matrix(read.csv("http://pastebin.com/raw/qGbkfiyA")) cormat <- cormat[,2:ncol(cormat)] rownames(cormat) <- colnames(cormat) cormat <- apply(cormat,c(1,2),FUN = function(x) as.numeric(x)

我只是想让Cholesky分解工作起来,以模拟相关的价格变动

我使用以下代码:

cormat <- as.matrix(read.csv("http://pastebin.com/raw/qGbkfiyA"))
cormat <- cormat[,2:ncol(cormat)]
rownames(cormat) <- colnames(cormat)
cormat <- apply(cormat,c(1,2),FUN = function(x) as.numeric(x))

chol(cormat)
#Error in chol.default(cormat) : 
#    the leading minor of order 8 is not positive definite

cholmat <- chol(cormat, pivot=TRUE)
#Warning message:
#    In chol.default(cormat, pivot = TRUE) :
#    the matrix is either rank-deficient or indefinite

rands <- array(rnorm(ncol(cholmat)), dim = c(10000,ncol(cholmat)))
V <- t(t(cholmat) %*% t(rands))

#Check for similarity
cor(V) - cormat  ## Not all zeros!

#Check the standard deviations
apply(V,2,sd) ## Not all ones!

您的代码有两个错误:

  • 您没有使用数据透视索引将已完成的数据透视还原为Cholesky因子。注意,半正定矩阵
    a
    的枢轴Cholesky分解正在进行:

    P'AP = R'R
    
    其中,
    p
    是一个列旋转矩阵,
    R
    是一个上三角矩阵。要从
    R
    恢复
    A
    ,我们需要应用
    P
    的倒数(即
    P'
    ):

    具有协方差矩阵A的多元正态分布由以下公式生成:

    XRP'
    
    其中,
    X
    是具有零均值和单位协方差的多元正态分布

  • 您生成的
    X

    X <- array(rnorm(ncol(R)), dim = c(10000,ncol(R)))
    

  • 作为上述理论的模型实现,考虑你的玩具例子:

    A <- matrix(c(1,.95,.90,.95,1,.93,.90,.93,1), ncol=3)
    
    然后我们生成目标多元正态分布:

    ## compute `V = RP'`
    V <- R[1:r, piv]
    
    ## compute `Y = X %*% V`
    Y <- X %*% V
    

    您的代码有两个错误:

  • 您没有使用数据透视索引将已完成的数据透视还原为Cholesky因子。注意,半正定矩阵
    a
    的枢轴Cholesky分解正在进行:

    P'AP = R'R
    
    其中,
    p
    是一个列旋转矩阵,
    R
    是一个上三角矩阵。要从
    R
    恢复
    A
    ,我们需要应用
    P
    的倒数(即
    P'
    ):

    具有协方差矩阵A的多元正态分布由以下公式生成:

    XRP'
    
    其中,
    X
    是具有零均值和单位协方差的多元正态分布

  • 您生成的
    X

    X <- array(rnorm(ncol(R)), dim = c(10000,ncol(R)))
    

  • 作为上述理论的模型实现,考虑你的玩具例子:

    A <- matrix(c(1,.95,.90,.95,1,.93,.90,.93,1), ncol=3)
    
    然后我们生成目标多元正态分布:

    ## compute `V = RP'`
    V <- R[1:r, piv]
    
    ## compute `Y = X %*% V`
    Y <- X %*% V
    

    我的第一个猜测是,
    cormat
    确实是p.d.,但有一些特征值几乎为零,这会导致数值问题。你可以通过计算特征值来证明或反驳这一点。顺便问一下,
    cormat
    的起源是什么?如果你能控制它,你能保证
    cormat
    是“更”正定的吗?(例如,在对角线上添加一个常数因子,或者以保证p.d.-的方式构造它。)一些特征值确实是负的。我怀疑这是因为从中获取相关性的价格是在不同时期进行的。例如,s1s2作为S2 S3取自不同的时段。我可以修改cormat,因为我认为合适。我试图将负特征值归零,但以此作为指导失败。在这一点上,我的建议是构造一个较小的矩阵,并确保您的方法有效。我收集到矩阵中的元素是时间相关性,S(I,j)=(相关性j-I时间步长相隔)。如果是这样的话,那么给定的次对角线或超对角线上的所有元素都应该相等,对吗?当距离对角线越远时,人们会期望值越小,对吗?如果你使非对角线足够小,矩阵就保证是p.d.(所谓的“对角线优势”)。无论如何,如果你用一个小的,构造的矩阵,你可以回到原来的矩阵。我的第一个猜测是,
    cormat
    确实是p.d.,但是有一些特征值接近零,这会导致数值上的麻烦。你可以通过计算特征值来证明或反驳这一点。顺便问一下,
    cormat
    的起源是什么?如果你能控制它,你能保证
    cormat
    是“更”正定的吗?(例如,在对角线上添加一个常数因子,或者以保证p.d.-的方式构造它。)一些特征值确实是负的。我怀疑这是因为从中获取相关性的价格是在不同时期进行的。例如,s1s2作为S2 S3取自不同的时段。我可以修改cormat,因为我认为合适。我试图将负特征值归零,但以此作为指导失败。在这一点上,我的建议是构造一个较小的矩阵,并确保您的方法有效。我收集到矩阵中的元素是时间相关性,S(I,j)=(相关性j-I时间步长相隔)。如果是这样的话,那么给定的次对角线或超对角线上的所有元素都应该相等,对吗?当距离对角线越远时,人们会期望值越小,对吗?如果你使非对角线足够小,矩阵就保证是p.d.(所谓的“对角线优势”)。不管怎样,如果你用一个小的,构造的矩阵来工作,你可以回到原始的。很明显。。。给谁?这更像是我的傻笑。:)明显的给谁?这更像是我的傻笑。:)
    cor(Y)
    #          [,1]      [,2]      [,3]
    #[1,] 1.0000000 0.9509181 0.9009645
    #[2,] 0.9509181 1.0000000 0.9299037
    #[3,] 0.9009645 0.9299037 1.0000000
    
    A
    #     [,1] [,2] [,3]
    #[1,] 1.00 0.95 0.90
    #[2,] 0.95 1.00 0.93
    #[3,] 0.90 0.93 1.00