Druga reprezentacja jest bardziej tradycyjna dla zmiennych jakościowych, takich jak dzień tygodnia.
Jest to również znane jako tworzenie zmiennych zastępczych i jest szeroko stosowaną metodą kodowania zmiennych kategorialnych. Jeśli użyłeś kodowania 1-7, mówisz modelowi, że dni 4 i 5 są bardzo podobne, podczas gdy dni 1 i 7 są bardzo odmienne. W rzeczywistości dni 1 i 7 są tak samo podobne jak dni 4 i 5. Ta sama logika obowiązuje dla kodowania 0-30 dla dni miesiąca.
Dzień miesiąca jest nieco trudniejszy, ponieważ chociaż każdy tydzień ma te same 7 dni, nie każdy miesiąc ma te same 30 dni: niektóre miesiące mają 31 dni, a niektóre miesiące 28. Ponieważ zarówno tygodnie, jak i miesiące są cykliczne, można użyć transformacji Fouriera do przekształcenia ich w gładkie zmienne liniowe.
Na przykład ( używając R, mojego wybranego języka programowania ):
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'))
(Przeskalowałem zmienne sinus / cosinus do 0/30, zamiast -1/1, więc wykres wygląda lepiej)
Jak widać, podczas gdy surowa „zmienna dnia miesiąca” przeskakuje z powrotem na zero na koniec każdego miesiąca, transformacje sinus i cosinus tworzą płynne przejście, które pozwala modelowi wiedzieć, że dni na koniec jednego miesiąca są podobne do dni na początku następnego miesiąca.
Możesz dodać resztę czterech terminów w następujący sposób:
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'))
Każda para fal sinusoidalnych / cosinusowych tworzy koło:
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)
Ta strona zawiera naprawdę przydatne wyjaśnienie, jak manipulować falami sinusoidalnymi i cosinusowymi.