Su segunda representación es más tradicional para variables categóricas como el día de la semana.
Esto también se conoce como crear variables ficticias y es un método ampliamente utilizado para codificar variables categóricas. Si utilizó la codificación 1-7, le está diciendo al modelo que los días 4 y 5 son muy similares, mientras que los días 1 y 7 son muy diferentes. De hecho, los días 1 y 7 son tan similares como los días 4 y 5. La misma lógica es válida para la codificación 0-30 durante los días del mes.
El día del mes es un poco más complicado, porque si bien cada semana tiene los mismos 7 días, no todos los meses tienen los mismos 30 días: algunos meses tienen 31 días, y algunos meses tienen 28 días. Dado que tanto las semanas como los meses son cíclicos, podría usar transformaciones de Fourier para convertirlas en variables lineales suaves.
Por ejemplo ( usando R, mi lenguaje de programación de elección ):
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'))
(Escalé las variables seno / coseno para que sea 0/30, en lugar de -1/1 para que el gráfico se vea mejor)
Como puede ver, mientras que la "variable del día del mes" vuelve a cero al final de cada mes, las transformaciones seno y coseno hacen una transición suave que le permite al modelo saber que los días al final de un mes son similares a días a principios del próximo mes.
Puede agregar el resto de los términos de Fourier de la siguiente manera:
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'))
Cada par de ondas seno / coseno forma un círculo:
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)
Esta página tiene una explicación muy útil de cómo manipular las ondas seno y coseno.