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