Почему эта иерархическая модель Пуассона не соответствует истинным параметрам сгенерированных данных?

Я пытаюсь подогнать иерархическую регрессию Пуассона для оценки time_delay для каждой группы и в глобальном масштабе. Я не понимаю, применяет ли pymc автоматически функцию ссылки на журнал к mu или мне нужно сделать это явно:

with pm.Model() as model:
    alpha = pm.Gamma('alpha', alpha=1, beta=1)
    beta = pm.Gamma('beta', alpha=1, beta=1)

    a = pm.Gamma('a', alpha=alpha, beta=beta, shape=n_participants)

    mu = a[participants_idx]
    y_est = pm.Poisson('y_est', mu=mu, observed=messages['time_delay'].values)

    start = pm.find_MAP(fmin=scipy.optimize.fmin_powell)
    step = pm.Metropolis(start=start)
    trace = pm.sample(20000, step, start=start, progressbar=True)

На приведенном ниже графике трассировки показаны оценки для a. Вы можете увидеть групповые оценки от 0 до 750.

трассировка

Мое замешательство начинается, когда я строю гамма-распределение гиперпараметров, используя среднее значение для alpha и beta в качестве параметров. В приведенном ниже распределении показана поддержка от 0 до 5 прибл. Это не соответствует моим ожиданиям, когда я смотрю на групповые оценки для a выше. Что представляет собой a? Это log(a) или что-то другое?

введите здесь описание изображения

Спасибо за любые указатели.


Добавление примера с использованием поддельных данных, как запрошено в комментариях: в этом примере есть только одна группа, поэтому должно быть легче увидеть, может ли гиперпараметр правдоподобно создавать распределение Пуассона для группы.

test_data = []
model = []

for i in np.arange(1):
    # between 1 and 100 messages per conversation
    num_messages = np.random.uniform(1, 100)
    avg_delay = np.random.gamma(15, 1)
    for j in np.arange(num_messages):
        delay = np.random.poisson(avg_delay)

        test_data.append([i, j, delay, i])

    model.append([i, avg_delay])

model_df = pd.DataFrame(model, columns=['conversation_id', 'synthetic_mean_delay'])
test_df = pd.DataFrame(test_data, columns=['conversation_id', 'message_id', 'time_delay', 'participants_str'])
test_df.head()

# Estimate parameters of model using test data
# convert categorical variables to integer
le = preprocessing.LabelEncoder()
test_participants_map = le.fit(test_df['participants_str'])
test_participants_idx = le.fit_transform(test_df['participants_str'])
n_test_participants = len(test_df['participants_str'].unique())

with pm.Model() as model:
    alpha = pm.Gamma('alpha', alpha=1, beta=1)    
    beta = pm.Gamma('beta', alpha=1, beta=1)

    a = pm.Gamma('a', alpha=alpha, beta=beta, shape=n_test_participants)

    mu = a[test_participants_idx]

    y = test_df['time_delay'].values
    y_est = pm.Poisson('y_est', mu=mu, observed=y)

    start = pm.find_MAP(fmin=scipy.optimize.fmin_powell)
    step = pm.Metropolis(start=start)
    trace = pm.sample(20000, step, start=start, progressbar=True)

введите здесь описание изображения

Я не понимаю, как приведенный ниже гиперпараметр может давать распределение Пуассона с параметром от 13 до 17.

введите здесь описание изображения


person M. Regan    schedule 11.08.2015    source источник
comment
Можете ли вы создать простой источник тестовых данных с данными от генератора случайных чисел с известным распределением, который отвечает на вопрос, как интерпретировать результаты? Ваш пример, похоже, полагается на внешние данные и, как таковой, недостаточно автономен, чтобы читатели переполнения стека могли легко дублировать или возиться с ним.   -  person Paul    schedule 12.08.2015
comment
Хорошая идея @Paul - только что добавил модель, используя поддельные данные   -  person M. Regan    schedule 12.08.2015
comment
Поместите свой ответ в ответ и примите его как решение.   -  person jonnybazookatone    schedule 12.08.2015
comment
Хотелось бы увидеть блокнот с вашей моделью. Хотя я не уверен, как вы используете дискретное (пуассоновское) распределение для моделирования time_delay. Ваше время сдержанно, или вы хотели использовать экспоненциальное?   -  person volodymyr    schedule 21.12.2015


Ответы (1)


ОТВЕТ: pymc использует параметры, отличные от scipy, для представления гамма-распределений. scipy использует альфа и масштаб, тогда как pymc использует альфа и бета. Следующая модель работает, как и ожидалось:

with pm.Model() as model:
    alpha = pm.Gamma('alpha', alpha=1, beta=1)    
    scale = pm.Gamma('scale', alpha=1, beta=1)

    a = pm.Gamma('a', alpha=alpha, beta=1.0/scale, shape=n_test_participants)

    #mu = T.exp(a[test_participants_idx])
    mu = a[test_participants_idx]

    y = test_df['time_delay'].values
    y_est = pm.Poisson('y_est', mu=mu, observed=y)

    start = pm.find_MAP(fmin=scipy.optimize.fmin_powell)
    step = pm.Metropolis(start=start)
    trace = pm.sample(20000, step, start=start, progressbar=True)

введите здесь описание изображения

введите здесь описание изображения

person M. Regan    schedule 12.08.2015
comment
Я не знаю историю этой модели, но ваши приоры выглядят довольно узкими (например, информативными). Это намеренно? Похоже, это искажает вашу оценку, поскольку Alpha=15 едва достигает 95% HDI. - person volodymyr; 21.12.2015