scipy - 生成具有相关性的随机变量

Mik*_*and 11 python numpy scipy

我正在努力在Python中实现一个基本的蒙特卡罗模拟器,用于我正在尝试的一些项目管理风险建模(基本上是Crystal Ball/@Risk,但是在Python中).

我有一组n随机变量(所有scipy.stats实例).我知道我可以用来从这些变量中rv.rvs(size=k)产生k 独立的观察结果n.

我想通过指定n x n正半正定相关矩阵来引入变量之间的相关性.

scipy有一个干净的方法吗?

我试过的

这个答案这个答案似乎表明"copulas"将是一个答案,但我没有看到他们的scipy任何参考.

这个链接似乎实现了我正在寻找的东西,但我不确定scipy是否已经实现了这个功能.我也喜欢它适用于非正常变量.

似乎Iman,Conover论文是标准方法.

Jos*_*sef 11

如果您只想通过高斯Copula(*)进行相关,那么可以通过numpy和scipy在几个步骤中进行计算.

  • 创建具有所需协方差的多变量随机变量numpy.random.multivariate_normal,并创建(n_by k_variables)数组

  • 适用scipy.stats.norm.cdf于将常规变换为均匀随机变量,为每个列/变量获得均匀的边际分布

  • 适用dist.ppf于将均匀边距转换为所需的分布,其中dist可以是其中一个分布scipy.stats

(*)高斯copula只是一种选择,当我们对尾部行为感兴趣时它并不是最好的,但它最容易使用,例如http://archive.wired.com/techbiz/it/magazine/17 -03/wp_quant?当前页=所有

两个参考

https://stats.stackexchange.com/questions/37424/how-to-simulate-from-a-gaussian-copula

http://www.mathworks.com/products/demos/statistics/copulademo.html

(我可能刚才在python中做过这个,但是现在没有任何脚本或函数.)