Я попытался решить модель логистической регрессии с помощью PyMC. Однако диагностические графики показывают очень высокие автокорреляции, и после повторной выборки из заднего распределения я иногда получаю очень разные результаты, поэтому, возможно, я не использую PyMC правильно.Код PyMC дает необычные результаты
Модель выглядит следующим образом:
Y_i = Bernoulli(p_i)
logit(p_i) = b0 + b1*x1 + b2*x2
Реализация заключается в следующем:
import pymc as pm
import numpy as np
b0 = pm.Normal('b0', 0., 1e-6, value=0.)
b1 = pm.Normal('b1', 0., 1e-6, value=0.)
b2 = pm.Normal('b2', 0., 1e-6, value=0.)
x1 = np.array([31, 31, 36, 30, 32, 33, 31, 33, 32])
x2 = np.array([31, 16, 35, 42, 19, 37, 29, 23, 15])
value = np.array([1, 1, 1, 1, 0, 1, 1, 1, 0])
@pm.deterministic
def p(b0=b0, b1=b1, b2=b2, x1=x1, x2=x2):
return np.exp(b0 + b1*x1 + b2*x2)/(1.0 + np.exp(b0 + b1*x1 + b2*x2))
obs = pm.Bernoulli('obs', p=p, value=value, observed=True)
m = pm.MCMC([obs, b0, b1, b2])
Когда я сэмплирую m.sample(500000, 200000, 50)
и построить полученное распределение задний, я получаю это:
Во второй попытке получить лучшие результаты, я использовал @ pm.observed:
import pymc as pm
import numpy as np
b0 = pm.Normal('b0', 0., 1e-6, value=0.)
b1 = pm.Normal('b1', 0., 1e-6, value=0.)
b2 = pm.Normal('b2', 0., 1e-6, value=0.)
x1 = np.array([31, 31, 36, 30, 32, 33, 31, 33, 32])
x2 = np.array([31, 16, 35, 42, 19, 37, 29, 23, 15])
value = np.array([1, 1, 1, 1, 0, 1, 1, 1, 0])
p = b0 + b1*x1 + b2*x2
@pm.observed
def obs(p=p, value=value):
return pm.bernoulli_like(value, pm.invlogit(p))
m = pm.MCMC([obs, p, b0, b1, b2])
Но она также производит высокие автокорреляции.
Я увеличил размер выборки без особого успеха. Что мне не хватает?
благодарственных вы за свой ответ. Вы правы, теперь результаты выглядят намного лучше. В этом случае я должен заключить, что переменные 'x1' и' x2' не имеют прогностической мощности по отношению к переменной 'value'? (Предполагая, что это лучшая модель для доступных данных). Кстати, когда я пытался чтобы использовать ваш код, я получил сообщение о том, что M не обладает свойством «бета». Вместо этого я использовал это: 'M.use_step_method (pm.AdaptiveMetropolis, beta)' –
Дополнительный вопрос: я заметил, что когда я запускаю 'M = pm.MCMC ([obs, beta])' и закладываю с 'pm.Matplot. plot (M) ', я получаю задние распределения для каждого параметра. Однако, если я изменю его на 'M = pm.MCMC ([obs, p, beta])', построение приводит к множеству дополнительных параметров с именем p_1, p_2 и т. Д. Что это? Детерминированные переменные не нужно включать в MCMC? Если я правильно помню, использование @ pm.observed вместо этого не создавало эти дополнительные графики. –
Детерминированные переменные не подлежат выборке MCMC, но нас часто интересуют их задние распределения, поэтому мы сохраняем их как следы. Однако вы можете отключить это с помощью флага 'trace = False', если вы действительно этого не хотите. Значение наблюдаемых переменных не меняется на каждой итерации, поэтому для них нет следов. –