我在PyMC中对模型进行推断时遇到问题。我试图在一个相当复杂的模型上运行MCMC,我收到一个关于
的错误hasattr(): attribute name must be string
我在这段代码的最后一行得到了这个(道歉,它很复杂,但我真的不确定问题出在哪里)。
import pymc
from matplotlib import pyplot as plt
import numpy as np
# a is a temp variable
# A is the data : a (2, 779)-shaped array of 0 and 1 only
a = np.loadtxt("PLOM3/data/stoch.csv")
A = np.zeros((2, len(a)-1))
A[0, :] = a[:-1]
A[1, :] = a[1:]
num_cities = 2
# Time
t = range(len(A) - 1)
# Noise term on p
epsilon = pymc.Uniform("epsilon", 0, 1)
# Exponential parameter
gamma = 1. / A.mean(axis = 1)
# Rate of imports
lambda_ = pymc.Exponential("lambda_", gamma, size=num_cities)
# Importations
Y = [pymc.Poisson("Y", lambda_[i], size = A.shape[1]) for i in range(num_cities)]
# Coefficients
alpha = [pymc.Uniform("alpha", 0, 1) for i in range(num_cities)]
beta = [pymc.Uniform("beta", 0, 1) for i in range(num_cities)]
# Refactory Period
delta = pymc.Exponential("delta", 0.2)
# Delay
d = pymc.Uniform("d", 0, 12, size = num_cities)
# Time since last epidemic
tau = np.zeros_like(A)
tmp = np.where(A[i, :] == 1)[0]
for i in range(2) :
for j in range(len(tmp)-1) :
tau[i, tmp[j]:tmp[j+1]] = tmp[j]
tau[i, tmp[-1]:] = tmp[-1]
# Bernoulli probabilities
@pymc.deterministic
def p(delta = delta, tau = tau, alpha = alpha, Y = Y, beta = beta, epsilon = epsilon, t = t) :
out = np.zeros((2, 1))
for i in range(2) :
if t > (tau[i, t] + delta) :
out[i] = alpha[i] * Y[i] + beta[~1] * A[~1, t - d[i]] + epsilon
# Time Series
X = [pymc.Bernoulli("X", p, size = A.shape[1], value = A[i, :], observed = True) for i in range(num_cities)]
model = pymc.Model([X, p, delta, alpha, beta, Y, lambda_, gamma, epsilon])
mcmc = pymc.MCMC(model)
任何帮助都会非常感激。 PyMC上很少有很好的教程。我正在关注Cameron Davidson-Pilon的优秀书籍,但到目前为止,我找不到任何关于为什么这会给我这个错误的信息。
再次感谢。
回应Cam.Davidson.Pilon:
该模型描述了小群体中的麻疹。重要的因素是人口规模小于麻疹的承载能力,因此,麻疹在每次流行病后都会灭绝,而不是一直流行。然后通过移民重新引入,并在该国发生流行病时通过该国城市之间的国家级迁移。
背景是冰岛,1900年至1964年(preaccination)。我们假设麻疹可以通过泊松过程从海外(Y变量)以及λ(或其他冰岛(X)城市)进行延迟(d)。观察X,每月采样,如果当月有流行病则为1,否则为0。
我们每个城市都有X_i和Y_i。我们假设X_i的值是伯努利分布的,具有流行病p_i的概率,该流量p_i是迁移到该特定城市的函数,具有重要性alpha_i,并且如果它们具有流行病,则还是来自其他城市的迁移的函数( X_j,j = / = i),系数β_ij,以及噪声epsilon的背景水平,代表麻疹病例可能来自的不确定性。我们还施加了一个不应期的三角洲,以允许城市中的易感个体重生。
我不确定的事情:
我认为这涵盖了正在发生的事情。如果有什么不清楚的地方请告诉我!同样,任何输入都是最受欢迎的。
再次感谢,
昆汀
答案 0 :(得分:5)
我可以提供一些建议,并解决您的问题。
包含内联for循环的行应该包含在pymc.Container
类中,这使得它们对pymc友好。
同样,您应该区分这些列表中每个变量的名称。例如:
Y = pymc.Container([pymc.Poisson("Y_%d"%i, lambda_[i], size = A.shape[1]) for i in range(num_cities)])
这些修复应该有效。感谢您阅读文字!这个例子看起来很有趣,我很想听听这个例子的上下文。