Я пытаюсь использовать пакет Caret для настройки параметра «df» игровой модели для моего когортного анализа.
Со следующими данными:
cohort = 1:60
age = 1:26
grid = data.frame(expand.grid(age = age, cohort = cohort))
size = data.frame(cohort = cohort, N = sample(100:150,length(cohort), replace = TRUE))
df = merge(grid, size, by = "cohort")
log_k = -3 + log(df$N) - 0.5*log(df$age) + df$cohort*(df$cohort-30)*(df$cohort-50)/20000 + runif(nrow(df),min = 0, max = 0.5)
df$conversion = rpois(nrow(df),exp(log_k))
Объяснение данных: номер когорты — это время прибытия потенциального клиента. N — количество потенциальных клиентов, пришедших в это время. Конверсия — это число тех потенциальных клиентов, которые «конвертировали» (купили что-то). Возраст — это возраст (время, прошедшее с момента прибытия) когорты, когда произошла конверсия. Для данной когорты с возрастом происходит меньше конверсий. Этот эффект подчиняется степенному закону. Но общий коэффициент конверсии каждой когорты также может медленно меняться во времени (номер когорты). Таким образом, мне нужен сглаживающий сплайн временной переменной в моей модели.
Могу подобрать игровую модель из пакета gam
library(gam)
fit = gam(conversion ~ log(N) + log(age) + s(cohort, df = 4), data = df, family = poisson)
fit
> Call:
> gam(formula = conversion ~ log(N) + log(age) + s(cohort, df = 4),
> family = poisson, data = df)
> Degrees of Freedom: 1559 total; 1553 Residual
> Residual Deviance: 1869.943
Но если я попытаюсь обучить модель с помощью пакета CARET
library(caret)
fitControl = trainControl(verboseIter = TRUE)
fit.crt = train(conversion ~ log(N) + log(age) + s(cohort,df),
data = df, method = "gamSpline",
trControl = fitControl, tune.length = 3, family = poisson)
Я получаю эту ошибку:
+ Resample01: df=1
model fit failed for Resample01: df=1 Error in as.matrix(x) : object 'N' not found
- Resample01: df=1
+ Resample01: df=2
model fit failed for Resample01: df=2 Error in as.matrix(x) : object 'N' not found .....
Пожалуйста, кто-нибудь знает, что я делаю неправильно здесь?
Спасибо