Рассмотрим данные двух клиентов с данными за период в 1000 дней. total_purchases
накапливаются заказчиком, и размер каждой покупки составляет ~ pois (5).
set.seed(1)
customers <- data.frame(
id = factor(rep(1:2, length.out = 100)),
date = seq(Sys.Date(), Sys.Date() + 1000, length.out = 100)
) %>%
group_by(id) %>%
mutate(
total_purchases = cumsum(rpois(n(), lambda = 5))
)
При использовании вычисления регрессии в скользящем окне убедитесь, что вы обрабатываете ошибки, возникающие из-за недостаточной степени свободы, особенности et c. - вот почему я поставил tryCatch
вокруг вызова rlm
- если есть ошибка, функция возвращает NA для сбойного окна. Данные ниже сгруппированы по id
, что означает, что модель рассчитана для каждого клиента. Ежегодная скользящая регрессия должна сходиться к slope = 5
(+/- случайная ошибка).
customers %>%
group_by(id) %>%
mutate(
slope = runner(
x = .,
f = function(x) {
tryCatch(
rlm(x$total_purchases ~ seq_len(nrow(x)))$coefficients[2],
error = function(e) NA
)
},
idx = "date",
k = "year"
)
)
График уклона во времени для клиентов
ggplot(customers, aes(x = date, y = slope, color = id, group = id)) +
geom_line() +
geom_hline(yintercept = 5, color = "red")
введите описание изображения здесь