Недавно я изучаю анализ клиентов с помощью пакета BTYDplus. Что-то меня смущает, как вычисляется значение 'litt' в функции 'elog2cbs'. Вот код:
#install.packages('BTYDplus')
library(BTYDplus)
library(tidyverse)
data("groceryElog")
elog2cbs(groceryElog) %>%
filter(cust == 10)
Результаты:
cust x t.x litt first T.cal
10 2 13.85714 2.782741 2006-01-03 103.7143
Примечания: лит = 2.782741.
Как говорит справка (elog2cbs):
лит: сумма логарифмических моментов межоперационных транзакций в течение периода калибровки.
Но согласно этому определению, я действую с пакетом 'tidyverse', получая другое значение:
groceryElog %>%
filter(cust == 10) %>%
mutate(first = min(date),
difftime = as.numeric(difftime(date, first, units = 'week')),
ln_dif = log(difftime))
Результаты:
cust date first difftime ln_dif
1 10 2006-01-03 2006-01-03 0.000000 -Inf
2 10 2006-01-12 2006-01-03 1.285714 0.2513144
3 10 2006-04-10 2006-01-03 13.857143 2.6288008
Литт должен быть 0,2513144 + 2,6288008 = 2,880115 НЕ 2,782741.
Затем я проверил код функции:
....
elog_dt[, `:=`(t, as.numeric(difftime(date, first, units = units))),
by = "cust"]
elog_dt[, `:=`(itt, c(0, diff(t))), by = "cust"]
cbs <- elog_dt[date <= T.cal, list(x = .N - 1, t.x = max(t),
litt = sum(log(itt[itt > 0])), sales = sum(sales)), by = "cust,first"]
....
С пакетом «datatable», все еще
litt = sum(log(itt[itt >0])
результат 2,88.
Любой мог просветить меня, большое спасибо.