Ihre zweite Darstellung ist traditioneller für kategoriale Variablen wie Wochentag.
Dies wird auch als Erstellen von Dummy-Variablen bezeichnet und ist eine weit verbreitete Methode zum Codieren von kategorialen Variablen. Wenn Sie die Codierung 1-7 verwendet haben, sagen Sie dem Modell, dass die Tage 4 und 5 sehr ähnlich sind, während die Tage 1 und 7 sehr unterschiedlich sind. Tatsächlich sind die Tage 1 und 7 genauso ähnlich wie die Tage 4 und 5. Dieselbe Logik gilt für die 0-30-Kodierung für die Tage des Monats.
Der Tag des Monats ist etwas kniffliger, denn während jede Woche die gleichen 7 Tage hat, hat nicht jeder Monat die gleichen 30 Tage: Einige Monate haben 31 Tage und einige Monate haben 28 Tage. Da sowohl Wochen als auch Monate zyklisch sind, können Sie Fourier-Transformationen verwenden , um sie in glatte lineare Variablen umzuwandeln.
Zum Beispiel ( mit R, der Programmiersprache meiner Wahl ):
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'))
(Ich habe die Sinus / Cosinus-Variablen auf 0/30 skaliert und nicht auf -1/1, damit das Diagramm besser aussieht.)
Wie Sie sehen, springt die rohe "Tag-des-Monats-Variable" am Ende jedes Monats auf Null zurück. Die Sinus- und Cosinus-Transformationen bilden jedoch einen reibungslosen Übergang, mit dem das Modell erkennt, dass die Tage am Ende eines Monats ähnlich sind Tage zu Beginn des nächsten Monats.
Sie können den Rest der Fourier-Terme wie folgt hinzufügen:
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'))
Jedes Sinus / Cosinus-Wellenpaar bildet einen Kreis:
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)
Auf dieser Seite finden Sie eine praktische Erklärung zum Manipulieren von Sinus- und Cosinuswellen.