首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用R对LatinHypercube /蒙特卡罗试验的相关性进行评价

使用R对LatinHypercube /蒙特卡罗试验的相关性进行评价
EN

Stack Overflow用户
提问于 2011-04-15 23:36:38
回答 3查看 1.3K关注 0票数 5

我目前正在使用python和RPY来使用R中的功能。

如何使用R库生成符合两个变量之间相关性的蒙特卡罗样本。例如,如果变量A和B的相关性为85% (0.85),我需要生成符合A和B之间相关性的所有蒙特卡洛样本。

如果任何人能分享想法/片段,我将不胜感激

谢谢

EN

回答 3

Stack Overflow用户

发布于 2011-04-16 00:04:29

Iman and Conover的秩相关方法似乎是一种广泛使用和通用的方法来产生基于计算机的实验,灵敏度分析等相关的蒙特卡罗样本。

他们的方法更通用,因为每个变量可以来自不同的分布,而不是@Dirk答案的多元正态分布。

更新:我在mc2d包中找到了上述方法的R实现,特别是您需要cornode()函数。

下面是取自?cornode的一个示例

代码语言:javascript
运行
复制
> 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方法使样本(尽可能接近)与目标相关性。

票数 8
EN

Stack Overflow用户

发布于 2011-04-15 23:56:49

这是一个常见问题。以下是使用推荐软件包的一个答案:

代码语言:javascript
运行
复制
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> 

相关性和协方差之间的切换很简单(提示:标准差向量的外积)。

票数 5
EN

Stack Overflow用户

发布于 2012-10-02 23:13:00

这个问题没有标记为python,但根据您的评论,看起来您可能也在寻找Python解决方案。我可以编写的Iman Convover的最基本的Python实现在Python中如下所示(实际上是numpy):

代码语言:javascript
运行
复制
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矩阵使用不同的驱动程序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5679114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档