2

我在 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 年(预防接种)。我们假设麻疹可以通过泊松过程从海外(Y 变量)以 lambda 率输入,或者从冰岛的其他城市(X)以一定的延迟(d)输入。X 是观察的,每月采样一次,如果当月有流​​行病,则为 1,否则为 0。

每个城市 i 都有 X_i 和 Y_i。我们假设 X_i 的值是伯努利分布的,流行病的概率 p_i 是该特定城市的移民的函数,重要性为 alpha_i,如果其他城市有流行病,也是从其他城市迁移的函数( X_j, j =/= i ),具有系数 beta_ij 以及噪声 epsilon 的背景水平,它表示麻疹病例可能来自何处的不确定性。我们还强加了不应期增量,以允许城市中的易感个体重生。

我不确定的事情:

  • epsilon 可能不是必需的和/或一件好事
  • 我想施加约束 alpha_i + sum_j beta_ij, i =/= j, 小于 1
  • 我希望增量以指数形式分布更多,但显然是离散的,因为我们只有月度数据
  • 刚刚发现 d 需要是 DiscreteUniform
  • 当我将 X_j 传递给确定 p_i 时,我可能会对其进行平滑处理以允许时间抖动,可能只是使用带有汉宁窗的卷积

我认为这涵盖了正在发生的事情。如果有任何不清楚的地方,请告诉我!同样,欢迎任何意见。

再次感谢,

昆汀

4

1 回答 1

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)])

这些修复应该有效。感谢您阅读文字!这个例子看起来不错,很有趣,我很想听听这个例子的上下文。

于 2013-10-01T22:55:49.940 回答