Newey–West Estimator: HAC Correction in Python
Fix things when they go wrong.
จากเนื้อหาเกี่ยวกับเรื่องของ Autocorrelation จากตอนก่อนหน้านี้ ทำให้ได้รู้ว่าเมื่อใช้งาน Linear หรือ Multiple linear regression model กับข้อมูลที่เป็น Time-series มักเกิดปัญหาเรื่องของ Autocorrelation ขึ้นกับ Model residual ทำให้ Assumption ของ Model นี้ไม่สามารถผ่านได้ทั้งหมด และไม่สามารถสรุปผลเป็น BLUE (Best Linear Unbiased Estimator) ได้
เนื้อหาของ Blog ตอนนี้จึงเกี่ยวกับการแก้ไขปัญหา Autocorrelation ที่เกิดขึ้นในโมเดลด้วยวิธีการที่เรียกว่า Heteroskedasticity and Autocorrelation Consistent หรืออาจย่อสั้น ๆ ว่า HAC
Newey–West Estimator
Newey–West Estimator เป็นวิธีการทางสถิติที่ใช้แก้ปัญหา เมื่อโมเดลไม่สามารถ Follow standard assumption ได้ ในที่นี้คือ Model residual หรือ Error term ที่เกิดปัญหา Autocorrelation ใน Lags ของข้อมูลตัวเอง
หลักการของ Newey–West Estimator คือการเปลี่ยน Covariance matrix ซึ่งใน OLS ปกติจะคำนวณขึ้นมาจาก Independence variables ของโมเดล แต่ Newey–West Estimator จะสร้าง Error matrix ขึ้นใหม่จาก Error term ที่เกิดขึ้นจากโมเดล จากนั้นใช้ Error matrix นี้คำนวณ Covariance matrix ขึ้นมาใหม่ และจะได้ค่า Standard Error, T-Statistic และ P-Value ใหม่ตามลำดับ
Heteroskedasticity and Autocorrelation Consistent (HAC)
สำหรับขั้นตอนการใช้ Python ในการแก้ไข Autocorrelation สำหรับ Error term สามารถใช้ Library Statsmodels ได้เช่นกัน ก่อนอื่นขอสร้างเป็น DataFrame สำหรับทำ Multiple linear regression model ด้วยข้อมูลเดิมจากตอนก่อนหน้าขึ้นมาก่อน เพราะโมเดลของตอนก่อนหน้านี้ มีปัญหาเรื่อง Autocorrelation เช่นกัน
เพื่อให้ได้ผลลัพธ์เหมือนเดิม ตัวแปร Independence variables ทั้งสองตัวยังคงใช้เป็น GDP_C_lg12
และ MPI_C_lg12
เช่นเดิม
เมื่อพิจารณาที่ Durbin-Watson statistic แล้ว ค่าที่ได้ออกมาคือ 0.324
หากใช้เกณฑ์หลวม ๆ ระหว่าง 1–3 ทำให้สามารถสรุปผลได้ว่าโมเดลนี้เกิด Autocorrelation ขึ้น เพราะค่า DW Statistic ไม่ได้อยู่ในระหว่างช่วง 1–3
วิธีการทำ HAC Adjustment ด้วย Library Statsmodels สามารถ Call .get_robustcov_results
เพื่อเรียกใช้คำสั่งเพิ่มเติมจาก Model object ได้เลย แต่ใน Blog ตอนนี้ขอลองเขียน OLS อีกวิธีที่เริ่มเป็นที่นิยมกันมากขึ้น ด้วยการใช้ Formula API โดยสามารถเขียนเป็นสมการ Multiple linear regression จากตัวแปรที่ต้องการได้เช่น 'logitODR ~ 1 + GDP_C_lg12 + MPI_C_lg12'
โดยที่ให้เครื่องหมาย ~
แทนเครื่องหมายเท่ากับ และผ่าน DataFrame ที่มี Columns เป็นชื่อเดียวกันกับสมการที่เขียนไว้ จากนั้นสามารถใช้ .fit()
ได้ตามปกติ
Define number of lags
TL;DR: สามารถใส่เป็น None เพื่อให้เลือก Optimum lags ได้เลย
ปัญหาต่อมาที่เจอคือการใส่จำนวนของ Lags ใน Covariance matrix เมื่อลองค้นดูอาจเจอหลายวิธีในการ Define จำนวน Lags ที่แตกต่างกัน แต่ใน Blog ตอนนี้ขอเลือกมาให้ดูทั้งหมด 3 วิธีตามสูตรด้านล่าง
สูตรแรกคือจำนวน Observation หารด้วย 100 ทั้งหมดยกกำลัง 2 ส่วน 9 แล้วคูณด้วย 4 คิดผลลัพธ์ให้อยู่ในรูปแบบของ Integer ได้เท่ากับ 3 รูปด้านล่างคือ Regression result ที่ได้จาก HAC Adjustment
สูตรที่ 2 คือจำนวน Observation ยกกำลังด้วย 1 ส่วน 4 คิดผลลัพธ์ให้อยู่ในรูปแบบของ Integer ได้เท่ากับ 2 รูปด้านล่างคือ Regression result ที่ได้จาก HAC Adjustment
และสูตรสุดท้ายคือไม่ระบุจำนวน Lags โดยปล่อยให้ Library หา Lags ที่ดีที่สุดให้อัตโนมัติ ให้ใส่ lags = None
ได้เลย
ผลลัพธ์จากทั้ง 3 วิธีจะเห็นได้ว่าวิธีที่ 1 และวิธีที่ 3 ให้คำตอบที่เหมือนกัน ดังนั้นจึงสรุปได้ว่าใน Library Statsmodels ใช้สูตรในการคิด Optimum lags ด้วยสูตรที่ 1
Conclusion
TL;DR: ถ้ายังได้ P-Value ต่ำกว่า Significant threshold สามารถใช้งานได้
เขียนมาถึงตรงนี้ยังขาดเรื่องวิธีการสรุปผล เพราะผลลัพธ์ที่ต้องการคือโมเดลยังสามารถใช้งานได้หรือไม่ วิธีการสรุปผลต้องเปรียบเทียบ Regression summary จากทั้งสองโมเดลคือ OLS Regression
จากรูปด้านบนคือผลลัพธ์ของ OLS และ HAC ตามลำดับ หลังจากที่ทำ HAC Adjustment แล้วสิ่งที่เปลี่ยนไปจากตาราง Summary คือ Standard error, T-Statistic และ P-Value จากจุดนี้สามารถใช้เพื่อสรุปผลโมเดลได้ว่า สามารถใช้งานได้หรือไม่
จากตัวอย่างจะเห็นได้ว่าที่ Significant value ที่ 5% ค่า P-Value ของแต่ละตัวแปร:
- Intercept: ไม่มีการเปลี่ยนแปลง (อาจเปลี่ยนน้อยมาก ๆ)
- GPD_C_lg12: เพิ่มขึ้น 0.003 → 0.011
- MPI_C_lg12: เพิ่มขึ้น 0.016 → 0.022
โดยที่โมเดลหลังจาก HAC Adjustment ยังให้ค่า P-Value ที่น้อยกว่า 5% ดังนั้นหมายความว่าตัวแปร Independence ยังสามารถใช้งานได้ใน Linear model นี้ ในทางกลับกันถ้า P-Value หลังจาก HAC Adjustment มีค่ามากกว่า 5% ที่เป็น Significant threshold อาจพิจารณาไม่เลือกใช้โมเดลนี้ เป็นต้น
ใน Blog ตอนนี้ใช้ Python เป็น Tool สำหรับการคำนวณ ตอนต่อไปจะใช้ Excel แสดงให้เห็นการคำนวณที่ละเอียดมากขึ้น สำหรับ Colab notebook ของเนื้อหาตอนนี้ สามารถดูได้ที่ Link ด้านบน