我目前正在使用python和RPY来使用R中的功能。
如何使用R库生成符合两个变量之间相关性的蒙特卡罗样本。例如,如果变量A和B的相关性为85% (0.85),我需要生成符合A和B之间相关性的所有蒙特卡洛样本。
如果任何人能分享想法/片段,我将不胜感激
谢谢
发布于 2011-04-16 00:04:29
Iman and Conover的秩相关方法似乎是一种广泛使用和通用的方法来产生基于计算机的实验,灵敏度分析等相关的蒙特卡罗样本。
他们的方法更通用,因为每个变量可以来自不同的分布,而不是@Dirk答案的多元正态分布。
更新:我在mc2d
包中找到了上述方法的R实现,特别是您需要cornode()
函数。
下面是取自?cornode
的一个示例
> require(mc2d)
> x1 <- rnorm(1000)
> x2 <- rnorm(1000)
> x3 <- rnorm(1000)
> mat <- cbind(x1, x2, x3)
> ## Target
> (corr <- matrix(c(1, 0.5, 0.2, 0.5, 1, 0.2, 0.2, 0.2, 1), ncol=3))
[,1] [,2] [,3]
[1,] 1.0 0.5 0.2
[2,] 0.5 1.0 0.2
[3,] 0.2 0.2 1.0
> ## Before
> cor(mat, method="spearman")
x1 x2 x3
x1 1.00000000 0.01218894 -0.02203357
x2 0.01218894 1.00000000 0.02298695
x3 -0.02203357 0.02298695 1.00000000
> matc <- cornode(mat, target=corr, result=TRUE)
Spearman Rank Correlation Post Function
x1 x2 x3
x1 1.0000000 0.4515535 0.1739153
x2 0.4515535 1.0000000 0.1646381
x3 0.1739153 0.1646381 1.0000000
matc
中的等级相关性现在非常接近corr
的目标相关性。
这样做的想法是,您从每个变量的分布中分别绘制样本,然后使用Iman & Connover方法使样本(尽可能接近)与目标相关性。
发布于 2011-04-15 23:56:49
这是一个常见问题。以下是使用推荐软件包的一个答案:
R> library(MASS)
R> example(mvrnorm)
mvrnrmR> Sigma <- matrix(c(10,3,3,2),2,2)
mvrnrmR> Sigma
[,1] [,2]
[1,] 10 3
[2,] 3 2
mvrnrmR> var(mvrnorm(n=1000, rep(0, 2), Sigma))
[,1] [,2]
[1,] 8.82287 2.63987
[2,] 2.63987 1.93637
mvrnrmR> var(mvrnorm(n=1000, rep(0, 2), Sigma, empirical = TRUE))
[,1] [,2]
[1,] 10 3
[2,] 3 2
R>
相关性和协方差之间的切换很简单(提示:标准差向量的外积)。
发布于 2012-10-02 23:13:00
这个问题没有标记为python,但根据您的评论,看起来您可能也在寻找Python解决方案。我可以编写的Iman Convover的最基本的Python实现在Python中如下所示(实际上是numpy):
def makeCorrelated( y, corMatrix ):
c = multivariate_normal(zeros(size( y, 0 ) ) , corMatrix, size( y, 1 ) )
key = argsort( argsort(c, axis=0), axis=0 ).T
out = map(take, map(sort, y), key)
out = array(out)
return out
其中y
是来自边缘分布的样本数组,corMatrix是半正定对称相关矩阵。假设此函数对c矩阵使用multivariate_normal(),则可以看出此函数使用了隐含的高斯Copula。要使用不同的copula结构,您需要为c矩阵使用不同的驱动程序。
https://stackoverflow.com/questions/5679114
复制相似问题