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 変数 ) からラムダ率で輸入されるか、アイスランドの他の都市 ( X ) から若干の遅延 ( d ) で輸入されると仮定します。X は観測され、毎月サンプリングされ、その月に流行があった場合は 1、そうでない場合は 0 になります。

すべての都市 i に対して X_i と Y_i があります。X_i の値は、その特定の都市への移民の関数である流行 p_i の確率でベルヌーイ分布されていると仮定します。これは、重要度が alpha_i であり、他の都市からの移民の関数でもあります。 X_j, j =/= i )、係数 beta_ij、およびはしかの症例がどこから来た可能性があるかを表す不確実性を表すノイズ イプシロンのバックグラウンド レベル。また、不応期デルタを課して、都市の影響を受けやすい個人が生まれ変わることを可能にします。

私が確信していないこと:

  • イプシロンは必要ないか、および/または良いことかもしれません
  • 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 に答える