สอนทำ Anderson-Darling Test แบบทั้งใน SAS, Python และ Excel
Tutorial for Anderson-Darling Test in SAS, Python and Excel
ก่อนหน้านี้ได้รู้จักการทดสอบ Normality ด้วยวิธีการต่าง ๆ กันแล้ว Blog ตอนนี้เลยอยากหยิบ Statistical test ที่เอาไว้ใช้ทดสอบ Normality ของข้อมูลที่นิยมใช้งานกันมาคือ Anderson-Darling Test
เนื้อหาของ Blog ตอนนี้คือการใช้งานเครื่องมือที่หลากหลาย ในการทำ Anderson-Darling ใน Software อย่าง SAS หรือ Library ใน Python คงไม่ใช่เรื่องยากอะไร แต่ใน Software อย่าง Microsoft Excel อย่างมีขั้นตอนที่เพิ่มขึ้นมา Blog ตอนนี้จะนำเสนอเนื้อหากึ่ง ๆ Tutorial เพื่อนำไปใช้งานได้จริง
Model
ยังคงใช้ Model เดิม เพราะต้องการเปรียบเทียบผลลัพธ์ของ Anderson-Darling Test statistic ว่าเหมือนกันหรือไม่ ดังนั้นรายละเอียดของ Linear regression model สามารถย้อนอ่านได้ที่ Link ด้านล่าง
SAS
- ขั้นตอนแรกต้องสร้าง Linear regression model ก่อนเป็นอย่างแรก ใน SAS ใช้เป็น
proc reg
จากนั้นกำหนดmodel
ตัวแปร y และ X ตามลำดับ output
คือ SAS Dataset ให้ชื่อว่าoutTest
โดยมี Residual หรือ Error ของ Model อยู่ด้วย ในที่นี้ให้ชื่อว่าr
- สำหรับการทดสอบ Anderson-Darling ให้ใช้
proc univariate
โดยใส่data
คือผลลัพธ์จากproc reg
ด้านบนคือoutTest
- จากนั้นประกาศ Option
normaltest;
เพื่อเป็นการทดสอบ Normality - ตัวแปรที่ต้องการทดสอบ
var
คือ Residual จาก Model คือr
- หากต้องการเก็บผลลัพธ์ไว้เป็น Dataset format สามารถใช้
ods output TestsforNormality
จากนั้นตั้งชื่อ Table ตามที่ต้องการได้
ผลลัพธ์ที่ได้ออกมาเป็น Normality tests ด้วยวิธีก่ารต่าง ๆ ซึ่งสำหรับ Anderson-Darling Test ได้ค่า Test statistic ที่ 0.61482
และ p-value ที่ 0.1088
Python
ใน Python เริ่มจาก Fitting linear regression model จากนั้น Call array residual ของ Model ออกมาด้วย .resid
ใช้ anderson()
ผ่านค่าที่ Call จาก .resid
เข้าไป ผลลัพธ์ที่ออกมาคือ Anderson-Darling Test statistic
Anderson-Darling statistic: 0.6105
หากต้องการหาค่าเป็น p-value สามารถใช้วิธีการเดิมจากตอนก่อนหน้านี้ เพื่อทำการคำนวณได้ ซึ่งรายละเอียดสามารถดูได้ที่ Paper ของ
R.B. D’Augostino and M.A. Stephens, Eds., 1986, Goodness-of-Fit Techniques, Marcel Dekker.
Anderson-Darling p-value: 0.1074
Excel
สำหรับ Microsoft Excel ให้เริ่มจากสร้าง Linear regression model ขึ้นมาด้วย Data Analysis → Regression จากนั้นให้เลือก Option ในการสร้าง Residual จาก Model ตามรูปด้านบน
ขั้นตอนแรกเริ่มต้นที่การ Sort residual จากน้อยไปมาก ถ้าเป็น Excel เวอร์ชั่นใหม่อย่าง 365 อาจใช้ฟังก์ชั่น =SORT()
หรือถ้าเป็นเวอร์ชั่นที่เก่าลงมา อาจสร้างเป็น Column แยกขึ้นมาด้วย =RANK.EQ()
จากนั้นใช้ =VLOOKUP()
เพื่อสร้างเป็น Sorted column อีกที ทั้ง 2 วิธีให้ผลลัพธ์ออกมาเท่ากัน
ต่อมาเป็นการหา Cumulative value ของ Normal distribution ใช้ฟังก์ชั่น =NORM.DIST()
โดยผ่าน Parameters ตามตัวอย่างด้านล่าง
=NORM.DIST(Sorted residual, Residual's mean, Residual's SD, TRUE)
- Sorted residual ที่ได้มาจาก Step ก่อนหน้านี้
- Residual’s mean ใช้
=AVERAGE()
เพื่อหา Mean ออกมาได้ตรง ๆ - Residual’s SD ใช้
=STDEV.S()
เพื่อหา SD ของ Residual - TRUE คือให้ Return ค่าเป็น Cumulative
F(Yn+1-i) เป็นการ Sort cumulative value ของ Normal distribution กลับด้าน อาจใช้ฟังก์ชั่น =VLOOKUP()
ตามสูตรในรูปด้านบน หรือใช้ =SORT()
หรือ =RANK.EQ()
หรือฟังก์ชั่นอื่นนอกจากนี้ แต่ทั้งหมดเพื่อให้ได้ผลลัพธ์คือ Column ใหม่ที่เรียงกลับด้านจาก Step ก่อนหน้านี้
AD (S) สามารถหาได้ตามสูตรด้านบน โดยที่ i
คือลำดับของ Observation ของ Residual
เมื่อรวมผลลัพธ์จาก Column AD (S) จะได้เป็นค่าของ S ที่เป็น 1 ในตัวแปรของสมการ Anderson-Darling
Anderson-Darling Test statistic หาได้จาก (-) ของจำนวน Observation ทั้งหมด ลบด้วย S ที่ได้จาก Step ก่อนหน้านี้ ผลลัพธ์ที่ได้คือ 0.6105
สำหรับการคำนวณหาค่า p-value ต้องทำการปรับ Anderson-Darling Test statistic ด้วยสูตรตามด้านล่าง
หลังจากที่ได้ AD* แล้ว ให้ใช้เงื่อนไขตามล่างในการคำนวณหา p-value ต่อไป
If AD* => 0.6, then p = exp(1.2937 - 5.709(AD*) + 0.0186(AD*)^2)
If 0.34 < AD* < .6, then p = exp(0.9177 - 4.279(AD*) - 1.38(AD*)^2)
If 0.2 < AD* < 0.34, then p = 1 - exp(-8.318 + 42.796(AD*)- 59.938(AD*)^2)
If AD* <= 0.2, then p = 1 - exp(-13.436 + 101.14(AD*)- 223.73(AD*)^2)
p-value ที่ออกได้คือ 0.1074
ตามเงื่อนไขแรกที่ AD* มีค่ามากกว่าหรือเท่ากับ 0.6 สังเกตได้ว่าผลลัพธ์จากทั้ง Python และ Excel ไม่เท่ากับผลลัพธ์จาก SAS ทั้งนี้เป็นเพราะว่าใน SAS ใช้การ Round up เป็นทศนิยม 2 ตำแหน่งในการคำนวณหา p-value ดังนั้นเมื่อลอง Round up เป็นทศนิยม 2 ตำแหน่งให้เหมือน SAS
=EXP(1.30-5.70*0.6186+0.02*0.6186^2)
ผลลัพธ์ที่ได้คือ 0.1088
ซึ่งเท่ากันแล้ว
Conclusion
ขั้นตอนใน Excel ถือว่ามีรายละเอียดเยอะพอสมควร เมื่อเทียบกับการทดสอบ Model assumption อื่น ๆ แต่ก็มีความเป็นไปได้ที่จะใช้ Excel ในการทำงานในลักษณะ เพราะการเขียน Code อาจไม่เป็นเรื่องของทุกคน การมี Excel เป็น 1 ในตัวเลือกอาจทำให้การทำงานสะดวกมากขึ้น