Медленный, лежащий в основе тренд со случайным блужданием или гауссовским процессом

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

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

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

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

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

Я надеюсь заменить это случайным блужданием или гауссовским процессом, чтобы позволить "экономике" несколько плавно изменяться во времени, но иметь произвольную форму. В идеале он должен начинаться со значения 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; ДР: Я довольно новичок в вероятностном программировании и уверен, что что-то идет не так, но я не уверен, что именно. Любой вклад очень, очень ценится!

0 ответов

Другие вопросы по тегам