2013-10-01 80 views
2

我在PyMC中的模型上运行推理时遇到问题。我想在一个相当复杂的模型上运行MCMC,和我得到约PyMC错误:hasattr():属性名称必须是字符串

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年(传染病)。我们假设麻疹可以通过来自海外的泊松过程(Y变量)以lambda速率输入,或者从某些延迟(d)输入到冰岛其他城市(X)。观察X,每月抽样一次,如果当月有疫情,则为1,否则为0。

对于每个城市我都有X_i和Y_i。我们假设X_i的值是伯努利分布的,具有流行病p_i的概率,这是移民进入该特定城市的函数,具有重要性α_i,并且还具有从其他城市迁移的功能,如果它们具有流行性X_j,j =/= i),系数β_ij以及代表麻疹可能来自哪里的不确定性的背景噪声等级epsilon。我们也施加了一个不应期三角洲,让一个城市中的易感个体重生。

事情我不能确定:

  • 小量可能是不必要的和/或一件好事
  • 我想强加alpha_i + sum_j beta_ij约束,I =/= Ĵ,小于1
  • 我想有增量多分布在以指数的形式,但显然不连续的,因为我们只有月度数据
  • 就发现那d必须DiscreteUniform
  • 当我传球X_j进入确定p_i,我可以平滑它,以允许时间抖动,可能只是使用与汉宁窗口的卷积

我认为,关于发生了什么事情。请让我知道,如果有什么不清楚!再次,任何投入最受欢迎。再次

感谢,

昆汀

+0

你做了哪些修改让它运行?我也面临类似的问题 – turing

回答

5

我可以提供一些建议,并修复您的问题。

包含inline for循环的行应该包含在pymc.Container类中,这使得它们对pymc友好。

同样,您应该区分这些列表中每个变量的名称。例如:

Y = pymc.Container([pymc.Poisson("Y_%d"%i, lambda_[i], size = A.shape[1]) for i in range(num_cities)]) 

这些修复程序应该可以工作。感谢您阅读文本!这个例子看起来不错而且有趣,我会对这个例子的背景感兴趣。

+0

非常感谢卡梅隆!我似乎现在可以运行MCMC。我需要一段时间才能查看参数并确保事情的一致性,所以我现在还不能提供任何结果,但我会很乐意描述模型的内容。任何意见,统计或计算,最受欢迎! 我会在这个问题的答案,空间。 – Quentin

相关问题