【问题标题】:Generate correlated random variables with specific standard deviations生成具有特定标准偏差的相关随机变量
【发布时间】:2016-05-11 14:13:57
【问题描述】:

我想生成N 数量的随机变量,每个变量之间都有固定的相关p。

变量应该有mean = 1和std = 5

N=10 #number of variables
mu <- rep(1,N) #means
p=0.7 #correlation
Sigma <- matrix(p,ncol=N,nrow=N) #variance covariance matrix
diag(Sigma) <- 5 #standard deviations


library(MASS)
set.seed(12)
data <- mvrnorm(10000,mu,Sigma)

但是,得到的标准差不是 5。

apply(data,2,sd)

 [1] 2.264853 2.219811 2.224703 2.245595 2.216712 2.236484 2.240794 2.220532 2.227445 
[10] 2.247943

有没有一种系统的方法可以改变标准差,同时保持其他参数不变?

【问题讨论】:

  • 我很确定 Sigma 是方差-协方差矩阵,所以如果你想要标准差为 5,你应该给它diag(Sigma) &lt;- 25。请注意,2.264853^2 是 5.129559,非常接近 5...

标签: r simulation normal-distribution


【解决方案1】:

您的方差-协方差 (VCV) 矩阵不正确。对角线应该是方差,而不是标准差。如果你这样做了

apply(data,2,var)

然后您会看到 方差 约为 5。如果您希望标准差为 5,那么您需要非对角线为 25。

此外,您正在将相关性输入到 VCV 矩阵的非对角线中,这些应该是协方差。要从correlations to covariances 获取,您需要将相关性乘以两个相关变量的标准差。在您的情况下,假设两个变量的标准差为 5,则 VCV 中的协方差应为 p = 0.7 * 5 * 5。所以你最终的 VCV 应该是

p <- 0.7 * 5 * 5
Sigma <- matrix(p,ncol=N,nrow=N) 
diag(Sigma) <- 25 

生成的 N 个随机变量将具有均值 1、协方差 p 和相关性 p/25。

【讨论】:

    【解决方案2】:

    您已经创建了一个矩阵 Sigma,其中对角元素为 5,但 mvnorm 需要一个协方差矩阵(不是标准差矩阵)作为 Sigma。所以你需要让对角线元素等于 25。它也没有正确使用 p=0.7 的值,这些是相关性,而不是协方差。您需要将相关性转化为协方差。

    见:

    http://blogs.sas.com/content/iml/2010/12/10/converting-between-correlation-and-covariance-matrices.html

    https://math.stackexchange.com/questions/446093/generate-correlated-normal-random-variables

    【讨论】:

      猜你喜欢
      • 2017-01-01
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 2015-02-27
      • 1970-01-01
      相关资源
      最近更新 更多