首页 文章

从现有变量创建相关变量[关闭]

提问于
浏览
3

假设我有一个向量:

Q<-rnorm(10,mean=0,sd=20)

从这个向量我想:

1. 创建10个变量 (a1...a10) ,每个变量具有高于.5(即在.5和1之间)与Q的相关性 .

第一部分可以完成:

t1<-sapply(1:10, function(x) jitter(t, factor=100))

2. 这些变量 (a1...a10) 中的每一个都应该具有彼此预先指定的相关性 . 例如,一些应该是相关的.8和一些-.2 .

这两件事可以完成吗?

我创建了一个相关矩阵:

cor.table <- matrix( sample( c(0.9,-0.9) , 2500 , prob = c( 0.8 , 0.2 ) , repl = TRUE ) , 50 , 50 )
k=1
while (k<=length(cor.table[1,])){
    cor.table[1,k]<-0.55
    k=k+1
    }
k=1
while (k<=length(cor.table[,1])){
    cor.table[k,1]<-0.55
    k=k+1
    }   
    diag(cor.table) <- 1

但是,当我应用@SprengMeister的优秀解决方案时,我收到错误:

Error in eigen(cor.table)$values > 0 : 
  invalid comparison with complex values

继续在这里:Eigenvalue decomposition of correlation matrix

3 回答

  • 1

    我刚才回答了一个非常相似的问题

    R: Constructing correlated variables

    我不熟悉抖动,所以也许我的解决方案更冗长,但它可以让你确切地确定每个变量和q应该是什么相互关系 .

    该答案中引用的F矩阵描述了您想要对数据施加的相互关系 .

    EDIT to answer question in comment:

    如果我没有记错,您正在尝试创建多变量相关数据集 . 因此集合中的所有变量都有不同程度的相关性 . 我假设Q是你的标准或DV,a1-a10是预测变量或IV .

    在F矩阵中,您将反映这些变量之间的关系 . 例如

    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)
    

    描述了三个变量之间的关系 . 第一个可以是Q,第二个是a1,第三个是a2 . 所以在这种情况下,q与a1(.90)和a2(.20)相关 .

    a1与a2(.40)相关

    矩阵的其余部分是多余的 .

    在代码的其余部分中,您只是创建原始的,不相关的变量,然后施加先前从F矩阵中提取的加载 .

    我希望这有帮助 . 如果R中有一个包可以做到这一切,请告诉我 . 我构建它是为了帮助我理解多变量数据集是如何实际生成的 .

    要将此概括为10个变量加q,只需将现在设置为3的参数设置为11并创建一个11x11 F矩阵 .

  • 2

    作为解决方案的指针使用R中的噪声函数jitter

    set.seed(100)
    t = rnorm(10,mean=0,sd=20)
    t1 = jitter(t, factor = 100)
    cor(t,t1)
    [1] 0.8719447
    
  • 4

    要生成具有规定相关性(或方差)的数据,您可以从随机数据开始,并使用所需相关矩阵的Cholesky分解对其进行重新缩放 .

    # Sample data
    Q <- rnorm(10, mean=0, sd=20)
    desired_correlations <- matrix(c(
      1, .5, .6, .5,
      .5, 1, .2, .8,
      .6, .2, 1, .5,
      .5, .8, .5, 1 ), 4, 4 )
    stopifnot( eigen( desired_correlations )$values > 0 )
    
    # Random data, with Q in the first column
    n <- length(Q)
    k <- ncol(desired_correlations)
    x <- matrix( rnorm(n*k), nc=k )
    x[,1] <- Q
    
    # Rescale, first to make the variance equal to the identity matrix, 
    # then to get the desired correlation matrix.
    y <- x %*% solve(chol(var(x))) %*% chol(desired_correlations)
    var(y)
    y[,1] <- Q  # The first column was only rescaled: that does not affect the correlation
    cor(y)      # Desired correlation matrix
    

相关问题