La tua seconda rappresentazione è più tradizionale per variabili categoriche come il giorno della settimana.
Questo è anche noto come creazione variabili fittizie ed è un metodo ampiamente utilizzato per la codifica di variabili categoriali. Se hai usato la codifica 1-7 stai dicendo al modello che i giorni 4 e 5 sono molto simili, mentre i giorni 1 e 7 sono molto diversi. In effetti, i giorni 1 e 7 sono simili ai giorni 4 e 5. La stessa logica regge per la codifica 0-30 per i giorni del mese.
Il giorno del mese è un po 'più complicato, perché mentre ogni settimana ha gli stessi 7 giorni, non tutti i mesi hanno gli stessi 30 giorni: alcuni mesi hanno 31 giorni e alcuni mesi hanno 28 giorni. Poiché sia le settimane che i mesi sono ciclici, è possibile utilizzare trasformazioni di Fourier per convertirle in variabili lineari regolari.
Ad esempio ( usando R, il mio linguaggio di programmazione preferito ):
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'))
(Ho ridimensionato le variabili seno / coseno in modo che siano 0/30, anziché -1/1 in modo che il grafico appaia migliore)
Come puoi vedere, mentre la "variabile del giorno del mese" grezza torna a zero alla fine di ogni mese, le trasformazioni seno e coseno effettuano una transizione graduale che consente al modello di sapere che i giorni alla fine di un mese sono simili a giorni all'inizio del mese successivo.
Puoi aggiungere il resto dei termini di Fourier come segue:
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'))
Ogni coppia di onde seno / coseno fa un cerchio:
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)
Questa pagina ha una spiegazione davvero utile su come manipolare le onde sinusoidali e coseno.