Медленный, лежащий в основе тренд со случайным блужданием или гауссовским процессом - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь приспособить модель PyMC3 к некоторым данным, касающимся продаж с течением времени.Вот краткое описание:

  • N каждый продавец продает определенное количество виджетов в неделю
  • Мы предполагаем, что каждый продавец продает виджеты с разной средней скоростью в неделю, и называем это beta_i для продавцаi
  • Предполагается, что наши наблюдаемые данные равны ~ Пуассону (бета_i).

Средненедельные данные о продажах приведены здесь в гистограмме, с логарифмически нормальным соответствием сверху, додать вам представление о распределении еженедельных продаж виджетов по продавцам.enter image description here

В этом первом сценарии я получаю, как мне кажется, разумный набор бета-версий, хотя они не выглядят особенно логично-нормальными: enter image description here

Поскольку мы надеемся сделать вывод о базовой тенденции, которую разделяют все продавцы (что-то аналогичное «экономике»), мы попытались что-то добавить.В нашей первой попытке «экономия» представляла собой просто линейную функцию времени, начиная с значения перехвата 1 и производной гаммы> 0 (гамма была полунормальной с sd=0.5).Затем у нас были данные ~ Пуассона (бета_i * (1 + гамма)).В этом сценарии бета-версии не сильно изменились, и мы сделали вывод об «экономике», хотя это был довольно слабый эффект.enter image description here

Я надеюсь заменить это случайным блужданием или гауссовским процессом, чтобы позволить "экономике" изменяться несколько плавно во времени, но иметь произвольную форму.В идеале он должен начинаться со значения 0, а затем идти туда, куда нужно, чтобы зафиксировать основную тенденцию, разделяемую всеми продавцами, с данными еще раз ~ Пуассоном (бета_i * (1 + гамма)).Вот наша модель.

with pm.Model() as model:

    # Salesperson base rate of selling widgets
    beta_ = pm.Lognormal("beta", mu=mu_hat, sd=sd_hat, shape=(1, n_salespeople))
    # mu_hat and sd_hat were estimated by fitting a log-normal to weekly sales data

    # Economy
    gamma_ = pm.GaussianRandomWalk("gamma", mu=0, sd=1e-6, shape=(n_weeks, 1))


    # Effects
    base_rate = beta_
    economy = 1 + gamma_

    # Observed
    lambda_ = base_rate * economy
    y = pm.Poisson("y", mu=lambda_, observed=observed_sales + 1e-7)

, где observed_sales - целочисленный массив количества совершенных продаж, формы (n_weeks, n_salespeople).

Во-первых, я не уверен, что яуказав эту модель правильно.Без «экономики» я делаю разумный набор бета-версий (хотя он не выглядит логарифмически нормальным, как на втором скриншоте).Тогда случайное блуждание, которое мы получаем, не совсем гладкое, независимо от того, насколько маленьким становится SD;чаще всего по причинам, в которых я не уверен, я получаю сообщение «Массовая матрица содержит нули на диагонали».Наконец, даже в начале я получал бесконечные вероятности, если бы я не добавил небольшой фактор к наблюдаемым данным ... Почему это так?

Итак, TL;ДР: Я довольно новичок в вероятностном программировании, и я уверен, что что-то идет не так, но я не уверен, что именно.Любой вклад очень, очень ценится!

...