在 PyMC3 中为 VAR(p) 生成随机矩阵
Generating random matrices for VAR(p) in PyMC3
我正在尝试使用 pymc3 构建一个简单的 VAR(p) 模型,但我遇到了一些关于不兼容维度的神秘错误。我怀疑问题是我没有正确生成随机矩阵。这是对 VAR(1) 的尝试,欢迎任何帮助:
# generate some data
y_full = numpy.zeros((2,100))
t = numpy.linspace(0,2*numpy.pi,100)
y_full[0,:] = numpy.cos(5*t)+numpy.random.randn(100)*0.02
y_full[1,:] = numpy.sin(6*t)+numpy.random.randn(100)*0.01
y_obs = y_full[:,1:]
y_lag = y_full[:,:-1]
with pymc3.Model() as model:
beta= pymc3.MvNormal('beta',mu=numpy.ones((4)),cov=numpy.ones((4,4)),shape=(4))
mu = pymc3.Deterministic('mu',beta.reshape((2,2)).dot(y_lag))
y = pymc3.MvNormal('y',mu=mu,cov=numpy.eye(2),observed=y_obs)
最后一行应该是
y = pm.MvNormal('y',mu=mu.T, cov=np.eye(2),observed=y_obs.T)
MvNormal
将最后一个维度解释为 mvnormal 向量。这是因为 numpy 索引的行为意味着 y_obs
是一个长度为 2 的向量,其中包含长度为 100 (y_lag[i].shape == (100,)
)
的向量
我正在尝试使用 pymc3 构建一个简单的 VAR(p) 模型,但我遇到了一些关于不兼容维度的神秘错误。我怀疑问题是我没有正确生成随机矩阵。这是对 VAR(1) 的尝试,欢迎任何帮助:
# generate some data
y_full = numpy.zeros((2,100))
t = numpy.linspace(0,2*numpy.pi,100)
y_full[0,:] = numpy.cos(5*t)+numpy.random.randn(100)*0.02
y_full[1,:] = numpy.sin(6*t)+numpy.random.randn(100)*0.01
y_obs = y_full[:,1:]
y_lag = y_full[:,:-1]
with pymc3.Model() as model:
beta= pymc3.MvNormal('beta',mu=numpy.ones((4)),cov=numpy.ones((4,4)),shape=(4))
mu = pymc3.Deterministic('mu',beta.reshape((2,2)).dot(y_lag))
y = pymc3.MvNormal('y',mu=mu,cov=numpy.eye(2),observed=y_obs)
最后一行应该是
y = pm.MvNormal('y',mu=mu.T, cov=np.eye(2),observed=y_obs.T)
MvNormal
将最后一个维度解释为 mvnormal 向量。这是因为 numpy 索引的行为意味着 y_obs
是一个长度为 2 的向量,其中包含长度为 100 (y_lag[i].shape == (100,)
)