在各种分布后创建相关变量

时间:2015-09-03 00:00:43

标签: r math distribution correlation covariance

问题

在R中,我想创建长度为n的{​​{1}}个变量,这些变量由名为L的{​​{3}}给出。重要的是,cor_matrix变量可能遵循不同的分布(包括连续分布和离散分布)。

相关帖子

  1. correlation matrix

  2. how-to-generate-sample-data-with-exact-moments

  3. generate-a-random-variable-with-a-defined-correlation-to-an-existing-variable

  4. 从上面列出的r-constructing-correlated-variables进行了修改,只要所有n变量都是连续的且来自同一分布,就可以得到以下解决方案。

    n

    third post

    但是,无法使用以下分布创建相关变量

    library(psych) 
    
    set.seed(199)
    
    fun = function(cor_matrix, list_distributions, L)
    {
        n = length(list_distributions)
        if (ncol(cor_matrix) != nrow(cor_matrix)) stop("cor_matrix is not square")
        if (nrow(cor_matrix) != n) stop("the length of list_distributions should match the number of columns and rows of cor_matrix")
        if (L<=1) stop("L should be > 1")
    
        fit = principal(cor_matrix, nfactors=n, rotate="none")
        loadings = matrix(fit$loadings[1:n, 1:n], nrow=n,ncol=n,byrow=F)
        cases = t(sapply(1:n, FUN=function(i, L) list_distributions[[i]](L), L=L))
        multivar = loadings %*% cases
        T_multivar = t(multivar)
        vars=as.data.frame(T_multivar)
        return(vars)
    }
    
    L = 1000
    cor_matrix =  matrix(c (1.00, 0.90, 0.20 ,
                         0.90, 1.00, 0.40 ,
                         0.20, 0.40, 1.00), 
                      nrow=3,ncol=3,byrow=TRUE)
    
    list_distributions = list(function(L)rnorm(L,0,2), function(L)rnorm(L,10,10), function(L) rnorm(L,0,1))
    vars = fun(cor_matrix, list_distributions, L)
    cor(vars)
    plot(vars)
    

    enter image description here

1 个答案:

答案 0 :(得分:3)

使用@NatePope和@JoshO'Brien建议的copulas

<button type="button">This is the button label</button>

enter image description here

此解决方案默认创建相关的正态分布变量,然后将它们转换为均匀分布的变量。可能有一个更高效的解决方案可以直接创建均匀分布的相关变量。