Ваше второе представление более традиционно для категориальных переменных, таких как день недели.
Это также известно как создание фиктивных переменных и широко используется для кодирования категориальных переменных. Если вы использовали кодирование 1-7, вы говорите модели, что дни 4 и 5 очень похожи, а дни 1 и 7 очень разные. Фактически, дни 1 и 7 аналогичны дням 4 и 5. Та же логика действует для кодирования 0-30 для дней месяца.
День месяца немного сложнее, потому что, хотя каждая неделя имеет одинаковые 7 дней, не каждый месяц имеет одинаковые 30 дней: некоторые месяцы имеют 31 день, а некоторые месяцы имеют 28 дней. Поскольку и недели, и месяцы являются циклическими, вы можете использовать преобразования Фурье для преобразования их в гладкие линейные переменные.
Например ( используя R, мой язык программирования по выбору ):
day_of_month = c(1:31, 1:28, 1:30)
day_of_year <- 1:length(day_of_month)
s = sin((2*pi)/30*day_of_month)
c = cos((2*pi)/30*day_of_month)
plot(day_of_month ~ day_of_year)
lines(15*s+15 ~ day_of_year, col='blue')
lines(15*c+15 ~ day_of_year, col='red')
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))
(Я масштабировал переменные синус / косинус до 0/30, а не -1/1, чтобы график выглядел лучше)
Как вы можете видеть, хотя необработанная «переменная дня месяца» возвращается к нулю в конце каждого месяца, преобразования синуса и косинуса делают плавный переход, позволяющий модели знать, что дни в конце одного месяца похожи на дней в начале следующего месяца.
Вы можете добавить остальные термины Фурье следующим образом:
for(i in 1:3){
s = sin((2*pi)/30*day_of_month + 30 * i/4)
c = cos((2*pi)/30*day_of_month + 30 * i/4)
lines(15*s+15 ~ day_of_year, col='blue')
lines(15*c+15 ~ day_of_year, col='red')
}
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))
Каждая пара волн синус / косинус образует круг:
m <- lapply(1:4, function(i){
as.matrix(
data.frame(
s = sin((2*pi)/30*day_of_month + 30 * i/4),
c = cos((2*pi)/30*day_of_month + 30 * i/4)
)
)
})
m <- do.call(cbind, m)
pairs(m)
На этой странице есть очень удобное объяснение того, как управлять волнами синуса и косинуса.