我想生成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
是否有一种系统的方法可以在保持其他参数固定的同时改变标准偏差?
答案 0 :(得分:2)
您的方差 - 协方差(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 。
答案 1 :(得分:1)
你已经创建了一个矩阵Sigma,其中对角线元素是5,但是mvnorm想要一个协方差矩阵(不是标准偏差矩阵)作为Sigma。因此,您需要使对角线元素等于25.它还没有正确使用p = 0.7的值,这些是相关性,而不是协方差。您需要将相关性转换为协方差。
请参阅:
https://math.stackexchange.com/questions/446093/generate-correlated-normal-random-variables