Python 基于PyMC的贝叶斯协方差预测

Python 基于PyMC的贝叶斯协方差预测,python,statistics,bayesian,pymc,Python,Statistics,Bayesian,Pymc,我试图使用pyMC来提供给定数据的协方差矩阵的贝叶斯估计。我大致遵循了本在线指南中提供的股票协方差示例,但我有一个更简单的示例模型。我从多元正态分布中得到了两个值,我以这样的方式构造它,我知道这两个变量之间的协方差/相关性 我已经在下面发布了我的短代码。基本上我所做的是构建一个人工数据集,其中相关矩阵应该是[[1,-0.5],-0.5,1]]。在mcmc采样结束时,我得到了一个非对角项的预测值,它有点不同。我已经研究了收敛标准,它看起来自相关性很低,分布是平稳的。然而,我承认我仍然在思考这里的细

我试图使用pyMC来提供给定数据的协方差矩阵的贝叶斯估计。我大致遵循了本在线指南中提供的股票协方差示例,但我有一个更简单的示例模型。我从多元正态分布中得到了两个值,我以这样的方式构造它,我知道这两个变量之间的协方差/相关性

我已经在下面发布了我的短代码。基本上我所做的是构建一个人工数据集,其中相关矩阵应该是[[1,-0.5],-0.5,1]]。在mcmc采样结束时,我得到了一个非对角项的预测值,它有点不同。我已经研究了收敛标准,它看起来自相关性很低,分布是平稳的。然而,我承认我仍然在思考这里的细微差别,可能有一些方面我仍然无法理解

这个问题与其他两个SO问题和相关,并在很大程度上基于这两个SO问题和。我觉得有必要问我自己的问题,尽管有相似之处,因为我没有得到我期望得到的答案。如果你们中的任何一位计算统计学家能够帮助我们深入了解这个问题,我们将不胜感激

import numpy as np
import pandas as pd
import pymc as pm
import matplotlib.pyplot as plt
import seaborn as sns

p=2
prior_mu=np.ones(p)
prior_sdev=np.ones(p)
prior_corr_inv=np.eye(p)

def cov2corr(A):
    """
    covariance matrix to correlation matrix.
    """
    d = np.sqrt(A.diagonal())
    A = ((A.T / d).T) / d
    #A[ np.diag_indices(A.shape[0]) ] = np.ones( A.shape[0] )
    return A

# construct artificial data set
muVector=[10,5]
sdevVector=[3.,5.]
corrMatrix=np.matrix([[1,-0.5],[-0.5, 1]])
cov_matrix=np.diag(sdevVector)*corrMatrix*np.diag(sdevVector)
n_obs = 500
x = np.random.multivariate_normal(muVector,cov_matrix,n_obs)

prior_mu = np.array(muVector)
prior_std = np.array(sdevVector)

inv_cov_matrix = pm.Wishart( "inv_cov_matrix", n_obs, np.diag(prior_std**2) )
mu = pm.Normal( "returns", prior_mu, 1, size = 2)

# create the model and sample
obs = pm.MvNormal( "observed returns", mu, inv_cov_matrix, observed = True, value = x )
model = pm.Model( [obs, mu, inv_cov_matrix] )
mcmc = pm.MCMC(model)
mcmc.use_step_method(pm.AdaptiveMetropolis,inv_cov_matrix)
mcmc.sample( 1e5, 2e4, 10)

# Determine prediction - Does not equal corrMatrix!
inv_cov_samples = mcmc.trace("inv_cov_matrix")[:]
mean_covariance_matrix = np.linalg.inv( inv_cov_samples.mean(axis=0) )
prediction = cov2corr(mean_covariance_matrix*n_obs)