การทดสอบ Autocorrelation ใน Linear regression model ด้วย Python
Scatter plot, ACF Plot, Durbin-Watson and Ljung-Box
มาถึงสมตติฐานข้อสุดท้ายของ Linear regression model แล้ว อาจเป็นข้อที่ “ผ่านยากที่สุด” ของสมการเส้นตรงก็ว่าได้ สมมติฐานที่ว่าคือ No autocorrelation in residual term หรือ Error ของ Model ไม่มีความเกี่ยวข้องกันเอง
จากที่ประสบการณ์ที่ได้ใช้งาน Linear regression model อยู่บ้าง พบว่า Residual ของ Model มักเกิด Autocorrelation กันเอง ซึ่งในบางครั้ง (หลายครั้ง) ก็เลือกที่จะตัดการทดสอบสมมติฐานข้อนี้ไป เพราะไม่เช่นนั้นอาจไม่สามารถสร้างโมเดลได้เลย เนื้อหาของ Blog ตอนนี้เป็นการนำเสนอวิธีการทดสอบ Autocorrelation ในรูปแบบต่าง ๆ
Autocorrelation
Autocorrelation ภาษาไทยคือ สหสัมพันธ์อัตโนมัติ หรือ สหสัมพันธ์เชิงอนุกรม (Series correlation) เป็นความสัมพันธ์ของ Series กับ Series ของตัวเองในช่วงเวลาก่อนหน้า หรือที่เรียกว่า n-lag โดยที่ 1 ใน Linear regression model assumption คือ Residual ของ Model ต้องไม่มี Autocorrelation เกิดขึ้น (No autocorrelation)
ปัญหาของการมีอยู่ของ Autocorrelation คือค่า Significant p-value ของ Regression model อาจขาดความน่าเชื่อถือ ดังนั้นการทดสอบ Autocorrelation test จึงเป็นการยืนยันว่า Linear model ยังสามารถ Perform เป็น BLUE (Best Linear Unbiased Estimator) ได้
Model
เช่นเดิม Model ที่ใช้งานเป็นตัวอย่างคือ Linear regression model ที่เคยใช้ทดสอบ Normality และทดสอบ Heteroscedasticity ในทั้งสองตอนก่อนหน้านี้ (สามารถกดย้อนดูได้ทั้ง Link ทั้งสอง)
Graphical method
Scatter plot
เมื่อทราบแล้วว่า Autocorrelation คืออะไร ก็สามารถใช้ Graphical method เพื่อ Plot ข้อมูลที่ต้องการทดสอบ Autocorrelation ซึ่งในที่นี้คือ Residual ของ Model
วิธีทำที่ง่ายที่สุดคือ Fix แกน X ของ Scatter plot ไว้ให้เป็นค่า Raw residual จากนั้นเปลี่ยนแกน Y เป็น Lag n ของ Residual
เมื่อมองด้วยตาแล้ว เห็นได้ว่าที่รูปแรก (ซ้ายบน) ค่าที่ได้ออกมาเป็นเส้นตรง เพราะเป็นการ Plot ค่าของ Residual กับตัวของมันเอง รูปถัดมาเป็นรูปที่ Plot กับ Lag ของ Residual อาจสังเกตได้ว่าที่ Lag 1 และ Lag 2 อาจมี Positive correlation อยู่บ้าง แต่ใน Lag อื่น ๆ อาจมองผลลัพธ์ยาก
ข้อจำกัดอีกเรื่องข้อคือ ในกรณีที่ข้อมูลเป็น Series ที่มีความยาวมาก ๆ อาจไม่สามารถใช้ Scatter plot เพื่อแสดงผลลัพธ์ทั้งหมดได้ เช่นจากตัวอย่างด้านบนแสดงเพียงแค่ 7 Lags เท่านั้น โดยที่ข้อมูลจริงมีทั้งหมด 58 Lags
ACF Plot
เนื่องจากข้อจำกัดดังกล่าว วิธี Graphical method ถัดมาที่นิยมใช้คือ AutoCorrelation Function Plot (AFC Plot) ที่เป็นการแสดงค่า Correlation ของ Lag พร้อมกับช่วง Confidence intervals
ใช้ Library plot_acf()
จาก Statsmodels เพื่อทำ ACF Plot ออกมา Option lags
ให้ใส่เป็นจำนวนของ Residual ทั้งหมดลบด้วย 1 เพื่อแสดง Correlation ของทุก ๆ Lags
จากรูปผลลัพธ์เห็นได้ว่าที่ Lag 0 จะต้องมีค่าเท่ากับ 1 เสมอ เพราะว่าเป็นการหา Correlation กับข้อมูลของตัวเอง แต่ใน Lags อื่น ๆ จะมีค่าที่เปลี่ยนแปลงไป
อาจเคยผ่านตาเกี่ยวกับ Plot ที่คล้ายรูปแบบนี้ชื่อว่า PACF Plot หรือ Partial AutoCorrelation Function ที่ให้ผลลัพธ์ที่คล้ายกัน แต่ PACF เป็นการ Plot residual ของข้อมูล ดังนั้นใน Context นี้จึงหมายความว่าการใช้ PACF จึงเป็นการ Plot residual of residual ซึ่งอาจไม่ได้ตรงกับ Objective ของ Model assumption ใน Linear regression ที่ต้องการทดสอบ Autocorrelation ของ Residual term
Statistical method
Durbin-Watson test
วิธีการทดสอบ Autocorrelation ด้วย Statistical method ที่เห็นกันมากที่สุดคงเป็นอะไรไปไม่ได้ นอกจาก Durbin-Watson test ใน Python สามารถใช้ Library durbin_watson()
จาก Statsmodels ด้วยการผ่าน Residual เข้าไปในฟังก์ชั่น
ค่าที่ Return ออกมาคือ DW Statistic ที่มีค่าอยู่ระหว่างช่วง 0–4 โดยที่เมื่อค่าเข้าใกล้ 0 หมายถึง Positive autocorrelation และเมื่อค่าเข้าใกล้ 4 หมายถึง Negative autocorrelation และเมื่อค่าอยู่ที่ 2 หมายถึง No autocorrelation ในความเป็นจริงคงไม่มีแบบจำลองไหนที่ให้ผลลัพธ์เท่ากับ 2 พอดี (Rare มาก ๆ)
ดังนั้นการสรุปผลลัพธ์ของ Durbin-Watson จึงสามารถใช้เป็นช่วงตัวเลข โดยอาจกำหนดว่า ถ้า DW Statistic อยู่ในช่วงตั้งแต่ 1.5–2.5 ว่า No autocorrelation ทั้งนี้ความกว้างแคบของช่วงดังกล่าว อาจขึ้นกับว่าต้องการ Relax หรือ Stress แบบจำลองมากน้อยแค่ไหน จากตัวอย่างถ้าใช้ช่วงที่ 1.5–2.5 ผลลัพธ์ที่ออกมาคือ Model นี้มี Autocorrelation อยู่ เพราะ DW Statistic มีค่าเท่ากับ 0.3237 เป็นต้น
Autocorrelation DW Statistic: 0.3237
Ljung-Box test
หากต้องการ Statistic test ที่ Return ค่าเป็น p-value เพื่อการแปลผลที่สะดวกคือ อาจพิจารณาใช้เป็น Ljung-Box test ที่สามารถใช้ Library acorr_ljungbox()
ของ Statsmodels ด้วยการผ่าน Residual เข้าไปในฟังก์ชั่น และกำหนด lags
สำหรับการทดสอบ
จากตัวอย่างเป็นการทดสอบจำนวน Lasg ทั้งหมดที่เป็นไปได้ใน Model โดยมีค่าเท่ากับจำนวน Observation ของ Residual ทั้งหมดลบด้วย 1 (n-1) ค่าที่ Return ออกมาคือ p-value ตามจำนวน Lags โดยที่ Hypothesis testing คือ
- H0: The data are independently distributed. (No autocorrelation)
- H1: The data not are independently distributed. (Autocorrelation)
เพราะฉะนั้นถ้า
- p-value ≤ 0.05: Rejected null hypothesis → Autocorrelation
- p-value > 0.05: Failed to reject null hypothesis → No autocorrelation
เนื่องมีค่า p-value มากกว่า 1 ค่า (เกิดขึ้นตามจำนวน Lags) ดังนั้นจึงสามารถสรุปผลเป็น Overall ได้โดยการหาว่ามี p-value > 0.05 หรือไม่ใน Array ของผลลัพธ์จาก acorr_ljungbox()
ผลลัพธ์ที่ออกมาจากการทดสอบ สามารถสรุปได้ว่ามี Autocorrelation เกิดขึ้นใน Model เพราะค่า p-value ที่มากที่สุด ยังมีค่าเข้าใกล้ 0 ดังนั้นจึง Failed to reject H0
Autocorrelation with max p-value: 0.0000
Conclusion
ถ้าติดตามมาถึงตอนนี้ จะพบว่าสามารถทดสอบสมมติฐานของ Linear regression model ได้ครบทุกข้อแล้ว ในความเป็นจริงอาจไม่จำเป็นต้องทดสอบสมมติฐานกับทุก Statistical tests ที่ได้นำเสนอไป เพียงพิจารณาแค่บาง Test ต่อ 1 สมมติฐานก็สามารถสรุปผลได้แล้ว
สำหรับ Colab notebook ของเนื้อหาตอนนี้สามารถดูได้ที่ Link ด้านบน