【问题标题】:Generate numbers with specific correlation [closed]生成具有特定相关性的数字[关闭]
【发布时间】:2012-11-08 23:57:21
【问题描述】:

如何使用 R 程序生成一个具有特定相关性(例如 0.56)的数字序列,并且由 50 个数字组成? 泰。

【问题讨论】:

  • 您要求一个具有特定相关性的数字向量。我假设与自身相关,还是您的意思是与另一组数字相关?提示:相关性涉及 2 个数据向量!如果你的意思是自相关,你的意思是滞后 1 相关 = 0.56?
  • 如果您确实想要两个具有指定相关性它们之间的集合,MASS 包中的mvrnorm 是一个不错的起点。

标签: r


【解决方案1】:

假设您的意思是两个具有相关性 0.56 的值的正态/高斯向量

我们可以使用包MASS中的mvrnorm()

require(MASS)
out <- mvrnorm(50, mu = c(0,0), Sigma = matrix(c(1,0.56,0.56,1), ncol = 2),
               empirical = TRUE)

给了

> cor(out)
     [,1] [,2]
[1,] 1.00 0.56
[2,] 0.56 1.00

empirical = TRUE 位很重要,否则实现的实际相关性也受随机性影响,不会完全是规定的值,对于较小的样本会有较大的差异。

假设您的意思是 0.56 和高斯随机变量的滞后 1 相关性

对于这个你可以使用arima.sim()函数:

> arima.sim(list(ar = 0.56), n = 50)
Time Series:
Start = 1 
End = 50 
Frequency = 1 
 [1]  0.62125233 -0.04742303  0.57468608 -0.07201988 -1.91416757 -1.11827563
 [7]  0.15718249  0.63217365 -1.24635896 -0.22950855 -0.79918784  0.31892842
[13]  0.33335688 -1.24328177 -0.79056890  1.08443057  0.55553819  0.33460674
[19] -0.33037659 -0.65244221  0.70461755  0.61450122  0.53731454  0.19563672
[25]  1.73945110  1.27119241  0.82484460  1.58382861  1.81619212 -0.94462052
[31] -1.36024898 -0.30964390 -0.94963216 -3.75725819 -1.77342095 -1.20963799
[37] -1.76325350 -1.20556172 -0.94684678 -0.85407649  0.14922226 -0.31109945
[43]  0.39456259  0.89610859 -0.70913792 -2.27954408 -1.14722464  0.39140446
[49]  0.66376227  1.63275483

【讨论】:

  • 除了非半定矩阵的对数正态分布之外,您如何做到这一点?
【解决方案2】:

如果您不想指定这些矩阵,其他选项是 corgen from ecodist

library("ecodist")
xy <- corgen(len = 50, r = 0.56, epsilon = 0.01)

或者自己滚动:

simcor <- function (n, xmean, xsd, ymean, ysd, correlation) {
    x <- rnorm(n)
    y <- rnorm(n)
    z <- correlation * scale(x)[,1] + sqrt(1 - correlation^2) * 
             scale(resid(lm(y ~ x)))[,1]
    xresult <- xmean + xsd * scale(x)[,1]
    yresult <- ymean + ysd * z
    data.frame(x=xresult,y=yresult)
}

测试

> r <- simcor(n = 50, xmean = 12, ymean = 30, xsd = 3, ysd = 4, correlation = 0.56)
> cor(r$x,r$y)
[1] 0.56

【讨论】:

    【解决方案3】:

    使用mvtnorm 包中的rmvnorm 从多元正态分布中采样。例如对于 0.56 的相关性:

    library("mvtnorm")
    foo <- rmvnorm(10000,c(0,0),matrix(c(1,0.56,0.56,1),2,2))
    

    测试:

    > cor(foo[,1],foo[,2])
    [1] 0.5611207
    

    【讨论】:

      猜你喜欢
      • 2013-08-09
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      相关资源
      最近更新 更多