2013-10-01 4 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 есть несколько хороших учебных пособий. Я слежу за превосходной книгой Камерона Дэвидсона-Пилона, но до сих пор я ничего не могу найти, почему это может дать мне эту ошибку.

Еще раз спасибо.


В ответ на Cam.Davidson.Pilon:

Модель описывает корь в небольших популяциях. Важным фактором является то, что размер популяций меньше, чем пропускная способность кори, и поэтому, вместо того, чтобы постоянно быть эндемичными, корь исчезает после каждой эпидемии. Затем он вновь вводится через иммиграцию и через миграцию на уровне страны между городами в стране, когда там происходит эпидемия.

Контекст - Исландия, 1900 - 1964 (prevaccination). Мы предполагаем, что корь может быть импортирована через процесс Пуассона из-за границы (переменная Y) со скоростью лямбда или из других городов Исландии (X) с некоторой задержкой (d). Х наблюдается, отбирается ежемесячно, с 1, если была эпидемия в этом месяце и 0 в противном случае.

У нас есть X_i и Y_i для каждого города i. Мы предполагаем, что значения X_i являются Бернулли-распределенными с вероятностью эпидемии p_i, которая является функцией иммиграции в этот конкретный город со значением alpha_i, а также функцией миграции из других городов, если у них есть эпидемии (X_j, j =/= i), с коэффициентом бета_ij, а также фоновый уровень шума epsilon, который представляет собой неопределенность, из которой мог произойти случай кори. Мы также налагаем дельту рефрактерного периода, чтобы позволить восприимчивым людям в городе родиться заново.

вещи, которые я не уверен:

  • эпсилон не может быть необходимым и/или хорошая вещь
  • Я хотел бы, чтобы наложить ограничение, что alpha_i + sum_j beta_ij, я =/= J может быть меньше 1
  • Я хотел бы иметь дельту распределена более в экспоненциальной форме, но, очевидно, дискретно, так как у нас есть только ежемесячные данные
  • Просто пятнистые, что d должно быть DiscreteUniform
  • Когда я прохожу X_j в определяя p_i, я могу сгладить его, чтобы разрешить временный джиттер, возможно, просто используя свертку с окном Ханнинга.

Я думаю, что об обложках, что происходит. Пожалуйста, дайте мне знать, если что-то неясно! Опять же, любой вход приветствуется.

Еще раз спасибо,

Квентин

+0

Какие изменения вы решите предпринять? Я также сталкиваюсь с аналогичной проблемой – turing

ответ

5

Я могу предложить несколько предложений и исправление вашей проблемы.

Линии, которые содержат встроенный цикл, должны быть завернуты в класс 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