การเป็นตัวแทนครั้งที่สองของคุณเป็นแบบดั้งเดิมสำหรับตัวแปรเด็ดขาดเช่นวันในสัปดาห์
สิ่งนี้เรียกว่าการสร้างตัวแปรจำลองและเป็นวิธีที่ใช้กันอย่างแพร่หลายสำหรับการเข้ารหัสตัวแปรเด็ดขาด ถ้าคุณใช้การเข้ารหัส 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)
หน้านี้มีคำอธิบายที่เป็นประโยชน์อย่างมากเกี่ยวกับวิธีจัดการคลื่นไซน์และโคไซน์