Я пытаюсь подогнать иерархическую регрессию Пуассона для оценки 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.