Skip to main content Link Search Menu Expand Document (external link)

Missing Value

อะไรหายไปไหน

Missing Value คือค่าที่สูญหายไปในชุดข้อมูลของเราค่ะ ซึ่งค่าสูญหายนี้มีสาเหตุต่างกัน เช่น สูญหายเพราะ responder ไม่อยากตอบ หรือหายตัวไปกลางครัน (เช่น ถ้าทำแบบสอบถามออนไลน์แล้ว internet หลุดไป) หรือเป็นเพราะผู้วิจัยไม่ได้ให้ตอบคำถามในบางกลุ่ม

Missing value เหล่านี้ทำให้การประมาณค่าของพารามิเตอร์ (see : Distribution in population) ผิดไป และยังส่งผลต่อการยอมรับหรือปฏิเสธสมมติฐานว่าง (null hypothesis) ทำให้เกิด Type I error มากขึ้น

ชนิดการการสูญหาย

  • Missing Completely at Random หรือ MCAR จะเป็นการสูยหายแบบที่เกิดจากการสุ่ม (ใช้คำว่าสุ่มจะดูเหมือนผู้วิจัยสุ่ม แต่ไม่ใช่นะคะ random หรือ สุ่มในที่นี้คือไม่ได้เกิดอย่างเป็นระบบ ไม่มี pattern ในตัวแปรนั้น)

  • Missing at Random (MAR) เกิดค่าสูญหายแบบสุ่มเหมือนกัน แต่มาจากตัวแปรอื่นที่มีผลกับตัวแปรที่ต้องการศึกษา

  • Missing not at Random (or Not Missing at Random; MNAR) เกิดได้หลายกรณีรวมถึงการวาดกรอบการทดลองผิดพลาดแล้วไม่ได้เก็บข้อมูลที่มีผลต่อตัวแปรที่ต้องการศึกษามา

ที่สำคัญ คือ เราจะทราบได้อย่างไรคะว่า ข้อมูลสูญหายใดเป็นแบบ MCAR, MAR or, MNAR?

คือไม่ทราบก็ได้ เพราะบางทีนักวิจัยเองก็ไม่ทราบค่ะ

แต่ว่าเราต้องจัดการกับข้อมูลสูญหายให้เหมาะสม เพราะในกรณี 2 ชนิดหลังจะส่งผลทั้งค่าพารามิเตอร์และค่าความคาดเคลื่อนในกลุ่มตัวอย่าง (SE) เลยค่ะ

ที่นี้ แยกกันนิดนึง

ปกติแล้ว สาย Data analytics เมื่อมีชุดข้อมูลเยอะ ๆ เป็น 1,000 - 10,000 ข้อมูล ก็มักจะใช้วิธีการตัดข้อมูลแถวนั้นทิ้งไปเลย ด้วยวิธีการ na.omit()

แต่ถ้าเป็นงานวิจัยที่เราทุ่มแรงเก็บกลุ่มตัวอย่างและข้อมูล 40 - 500 ข้อมูลด้วยความพยายาม จะตัดข้อมูลทิ้งก็อาจจะเสียดายได้ แต่ถ้าเราจะเอาข้อมูลแถวนั้นคงไว้ ก็ต้องเลือกจัดการมันอย่างเหมาะสมค่ะ

การจัดการข้อมูลที่ศูนย์หาย (missing value analysis)

เราจะใช้ข้อมูล coronavirus จาก package coronavirus

library(coronavirus)
data("coronavirus")
head(coronavirus)

##         date province country     lat      long      type cases   uid iso2 iso3
## 1 2020-01-22  Alberta  Canada 53.9333 -116.5765 confirmed     0 12401   CA  CAN
## 2 2020-01-23  Alberta  Canada 53.9333 -116.5765 confirmed     0 12401   CA  CAN
## 3 2020-01-24  Alberta  Canada 53.9333 -116.5765 confirmed     0 12401   CA  CAN
## 4 2020-01-25  Alberta  Canada 53.9333 -116.5765 confirmed     0 12401   CA  CAN
## 5 2020-01-26  Alberta  Canada 53.9333 -116.5765 confirmed     0 12401   CA  CAN
## 6 2020-01-27  Alberta  Canada 53.9333 -116.5765 confirmed     0 12401   CA  CAN
##   code3    combined_key population continent_name continent_code
## 1   124 Alberta, Canada    4413146  North America             NA
## 2   124 Alberta, Canada    4413146  North America             NA
## 3   124 Alberta, Canada    4413146  North America             NA
## 4   124 Alberta, Canada    4413146  North America             NA
## 5   124 Alberta, Canada    4413146  North America             NA
## 6   124 Alberta, Canada    4413146  North America             NA

จากการดูข้อมูลคร่าวๆ ค่าสูญหาย (NA) ดันไปอยู่ในจังหวัด (province) ไม่เป็นไรนะ สมมติว่าเราสร้าง missing value เอง

เราจะใช้การ subset ข้อมูลที่ต้องการเพียง date country และจำนวน case

coronavirus <- coronavirus[, c("date", "country", "cases")]
head(coronavirus[coronavirus$cases == 0,]) #เดี๋ยวเราจะให้จำนวนเคสที่เป็น 0 เป็นข้อมูลสูญหาย
##         date country cases
## 1 2020-01-22  Canada     0
## 2 2020-01-23  Canada     0
## 3 2020-01-24  Canada     0
## 4 2020-01-25  Canada     0
## 5 2020-01-26  Canada     0
## 6 2020-01-27  Canada     0
coronavirus$cases[coronavirus$cases == 0] <- NA #ใส่ข้อมูลสูญหายด้วย NA
#which(!complete.cases(coronavirus$case), arr.ind = TRUE) #เรียกดูสักหน่อย

จะดูข้อมูลทั่วโลกก็อาจจะเยอะไป เราจะ subset ให้เหลือแค่ UK และ Thailand เพื่อความสะดวก ทีนี้ เรามาดู pattern ของข้อมูลสูญหายที่เราใส่เข้าไป

    Covid_th_UK <- coronavirus[coronavirus$country == "United Kingdom" | coronavirus$country == "Thailand", ] #subset
    head(Covid_th_UK)
##           date        country cases
## 632 2020-01-22 United Kingdom    NA
## 633 2020-01-23 United Kingdom    NA
## 634 2020-01-24 United Kingdom    NA
## 635 2020-01-25 United Kingdom    NA
## 636 2020-01-26 United Kingdom    NA
## 637 2020-01-27 United Kingdom    NA

เมื่อได้ data ที่ทำการ subset ให้เหลือแค่ประเทศ UK และ Thailand แล้ว เราจะใช้คำสั่ง md.pattern()จาก package mice ในการดู pattern ของค่าสูญหาย

library(mice)
## 
## Attaching package: 'mice'

## The following object is masked from 'package:stats':
## 
##     filter

## The following objects are masked from 'package:base':
## 
##     cbind, rbind
md.pattern(Covid_th_UK)

##       date country cases      
## 5652     1       1     1     0
## 18957    1       1     0     1
##          0       0 18957 18957

เนื่องจากสูญหาย ที่เราใส่ไปมีโอกาสที่จะเป็นแบบ intentionally missed ถ้า dataset ของเรามีขนาดใหญ่พอ เราสามารถที่จะเรียกคำสั่ง na.omit() สำหรับ dataset นั้นได้เลย

Covid_th_UK_omit <- na.omit(Covid_th_UK)
md.pattern(Covid_th_UK_omit)

##  /\     /\
## {  `---'  }
## {  O   O  }
## ==>  V <==  No need for mice. This data set is completely observed.
##  \  \|/  /
##   `-----'

##      date country cases  
## 5652    1       1     1 0
##         0       0     0 0

แมวบอกเราว่าไม่มี missing value แล้ววววว~

อย่างไรก็ตาม หาก dataset มีขนาดเล็ก โดยเฉพาะกับจากการเก็บข้อมูลแบบทดลองหรือ survey เล็ก ๆ เราอาจจะไม่สามารถตัดค่าสูญหายไปได้ ในกรณีนี้เราสามารถที่จะดูสัดส่วนของข้อมูลที่ศูนย์หายและแทนค่าข้อมูลที่ศูนย์หายนั้น ๆ โดยวิธีการต่างกัน

เช่น

-   แทนที่ด้วยค่า Mean : วิธีนี้จะยังทำให้เกิด bias อยู่มากโดยเฉพาะการสูญหายแบบ MAR

-   แทนที่ด้วยค่า Mode : วิธีที่ก็ยังจะทำให้เกิด bias ได้กรณที่ scale เป็นมาตรระดับ
   
-   แทนที่ด้วยค่า Median : วิธีนี้ถ้ามีค่าสุดโต่งมาก ๆ ก็ต้องกำจัดค่าสุดโต่งออกก่อน (ด้วยต่างวิธีการมากมาย) แต่ก็ยังทำให้เกิด bias ได้

แล้วทีนี้ หมดที่เรียนมาแล้ว ควรจะทำอย่างไรดี

ทำแบบ 3 วิธีด้านบนได้ค่ะ ถ้าเราเล่าเรียนมาแบบนั้น มันไม่มีผิดนะ แต่ว่ามันจะมี bias ในค่าข้อมูลเกิดขึ้น

แต่เราก็สามารถแทนที่ค่าสูญหายด้วยวิธีอื่นได้ แต่จะมาต่อภาค 2 นะคะ เพราะว่าเริ่มจะเป็นการวิเคราะห์แบบขั้นสูงขึ้นมานิดนึงแล้ว


กลับไปที่ Datastist.com