2014-02-10 8 views
0

я прочитал следующий документ (http://www3.stat.sinica.edu.tw/statistica/oldpdf/A10n416.pdf), где они моделируют ковариационную матрицу Е, как:PyMC - ковариационная оценка матрицы

a = DIAG (S) * R * Diag (S) (уравнение 1 в бумага)

S - вектор стандартных отклонений k × 1, diag (S) - диагональная матрица с диагональными элементами S, а R - корреляционная матрица k × k.

Как я могу реализовать это с помощью PyMC?

Вот некоторый начальный код, который я написал:

import numpy as np 
import pandas as pd 
import pymc as pm 

k=3 
prior_mu=np.ones(k) 
prior_var=np.eye(k) 
prior_corr=np.eye(k) 
prior_cov=prior_var*prior_corr*prior_var 

post_mu = pm.Normal("returns",prior_mu,1,size=k) 
post_var=pm.Lognormal("variance",np.diag(prior_var),1,size=k) 
post_corr_inv=pm.Wishart("inv_corr",n_obs,np.linalg.inv(prior_corr)) 


post_cov_matrix_inv = ??? 

muVector=[10,5,-2] 
varMatrix=np.diag([10,20,10]) 
corrMatrix=np.matrix([[1,.2,0],[.2,1,0],[0,0,1]]) 
cov_matrix=varMatrix*corrMatrix*varMatrix 

n_obs=10000 
x=np.random.multivariate_normal(muVector,cov_matrix,n_obs) 
obs = pm.MvNormal("observed returns", post_mu, post_cov_matrix_inv, observed = True, value = x) 

model = pm.Model([obs, post_mu, post_cov_matrix_inv]) 
mcmc = pm.MCMC() 

mcmc.sample(5000, 2000, 3) 

Благодаря

[править]

Я думаю, что можно сделать с помощью следующих действий:

@pm.deterministic 
def post_cov_matrix_inv(post_sdev=post_sdev,post_corr_inv=post_corr_inv): 
    return np.diag(post_sdev)*post_corr_inv*np.diag(post_sdev) 
+0

Пожалуйста, обсудите то, что вы подразумеваете под "моделью". Это слово имеет много значений в статистике и науке, ни одна из которых, казалось бы, не применима здесь. Возможно, вы спрашиваете, как * разложить * ковариационную матрицу в эту форму? Если ваш вопрос касается только кодирования алгоритма в PyMC, пожалуйста, сообщите нам, чтобы мы могли перенести его в сообщество SO. – whuber

+0

Мой вопрос касается только реализации в PyMC. – akhil

+0

Я думаю, что можно сделать, используя следующие: @ pm.deterministic четкости post_cov_matrix_inv (post_sdev = post_sdev, post_corr_inv = post_corr_inv): возвращение np.diag (post_sdev) * post_corr_inv * np.diag (post_sdev) – akhil

ответ

0

Вот решение на благо кого-то, кто наткнулся на этот пост:

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


muVector=[10,5,1] 
sdevVector=[3,5,10] 
corrMatrix=np.matrix([[1,0,-.1],[0,1,.5],[-.1,.5,1]]) 
cov_matrix=np.diag(sdevVector)*corrMatrix*np.diag(sdevVector) 

n_obs=2000 
x=np.random.multivariate_normal(muVector,cov_matrix,n_obs) 

prior_cov=np.diag(prior_sdev)*np.linalg.inv(prior_corr_inv)*np.diag(prior_sdev) 

post_mu = pm.Normal("returns",prior_mu,1,size=p) 
post_sdev=pm.Lognormal("sdev",prior_sdev,1,size=p) 
post_corr_inv=pm.Wishart("inv_corr",n_obs,prior_corr_inv) 

#post_cov_matrix_inv = pm.Wishart("inv_cov_matrix",n_obs,np.linalg.inv(prior_cov)) 
@pm.deterministic 
def post_cov_matrix_inv(post_sdev=post_sdev,post_corr_inv=post_corr_inv,nobs=n_obs): 
    post_sdev_inv=(post_sdev)**-1 
    return np.diag(post_sdev_inv)*cov2corr(post_corr_inv/nobs)*np.diag(post_sdev_inv) 

obs = pm.MvNormal("observed returns", post_mu, post_cov_matrix_inv, observed = True, value = x) 

model = pm.Model([obs, post_mu, post_sdev ,post_corr_inv]) 
mcmc = pm.MCMC(model) 

mcmc.sample(25000, 15000, 1,progress_bar=False)