--- title: "การประเมินลักษณะมนุษย์: ตัวอย่าง R Code สำหรับคาบเรียนที่ 4" author: "สันทัด พรประเสริฐมานิต" output: html_document date: "`r format(Sys.time(), '%d/%m/%Y')`" --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ``` ## การหาคุณสมบัติของข้อคำถาม อ่านข้อมูลด้วยคำสั่ง `read.table` แล้วใส่ไฟล์ที่ต้องการอ่านลงไป ในที่นี้คือ ` emotionalstability.csv` ```{r openfile} dat <- read.table("emotionalstability.csv", sep = ",", header = TRUE) ``` ข้อมูลนี้จะเป็นข้อคำถามในมาตรวัดความมั่นคงทางอารมณ์ มีทั้งหมด 10 ข้อ โดยข้อที่ 1-5 เป็นข้อทางบวก และข้อที่ 6-10 เป็นข้อทางลบ อันดับแรกให้สร้างเวคเตอร์ที่มีชื่อของตัวแปรทุกตัว ในที่นี้ตั้งชื่อว่า `itemname` ```{r itemname} itemname <- c("EMO01", "EMO02", "EMO03", "EMO04", "EMO05", "EMO06", "EMO07", "EMO08", "EMO09", "EMO10") ``` ใช้คำสั่ง `describe` ในแพ๊คเกจ `psych` เพื่อตรวจสอบค่าสถิติพื้นฐานของตัวแปรแต่ละตัวในข้อมูล ในที่นี้จะได้ค่าเฉลี่ย (ความยากรายข้อ) ของแต่ละตัวแปร ```{r describedat} library(psych) describe(dat) ``` ใช้คำสั่ง `alpha` ในแพ๊คเกจ `psych` เพื่อตรวจสอบค่าอำนาจจำแนกของตัวแปร (เพิ่มเติมจากสัมประสิทธิ์อัลฟ่า) ```{r alpha1, warn=TRUE} alpha(dat[,itemname]) ``` ผลการวิเคราะห์ขึ้นเตือนว่า ข้อคำถามอาจไม่ได้กลับคะแนน (ซึ่งเป็นความจริง) โดยโปรแกรมแนะนำให้ใส่ `check.keys=TRUE` ลงใน `alpha` หากไปใส่ตามโปรแกรมบอก โปรแกรมจะคาดเดาว่าตัวแปรอะไรบ้างที่มีทิศทางลบ แล้วลองกลับทิศข้อคำถามให้ดู แล้วหาค่าสัมประสิทธิ์อัลฟ่าอีกที นักวิเคราะห์พอดูเป็นแนวทางได้ แต่เอาจริง นักวิเคราะห์ย่อมรู้ดีอยู่แล้วว่าข้อใดเป็นข้อทางลบตั้งแต่ต้น นักวิเคราะห์จึงควรกลับคะแนน ก่อนนำมาหาค่าสัมประสิทธิ์อัลฟ่า ดังนั้นจึงกลับคะแนนข้อ 6-10 ที่เป็นข้อทางลบ เนื่องจากคำตอบที่เป็นไปได้ในแต่ละข้อ คือ 1-5 ดังนั้นจึงนำคะแนนไปลบออกจาก 6 เพื่อให้คะแนน 1, 2, 3, 4, 5 กลับด้านเป็น 5, 4, 3, 2, 1 ```{r changedirection} dat[,"EMO06"] <- 6 - dat[,"EMO06"] dat[,"EMO07"] <- 6 - dat[,"EMO07"] dat[,"EMO08"] <- 6 - dat[,"EMO08"] dat[,"EMO09"] <- 6 - dat[,"EMO09"] dat[,"EMO10"] <- 6 - dat[,"EMO10"] ``` ลองหาค่าสัมประสิทธิ์อัลฟ่าอีกครั้ง จะพบว่าคำเตือนหายไป และค่าอัลฟ่ากลับมาสูง ```{r alpha2} alpha(dat[,itemname]) ``` ถ้าดูผลลัพธ์ของฟังก์ชั่นนี้ จะพบว่านอกเหนือค่าอัลฟ่าที่อ่านได้จาก `raw_alpha` แล้ว ยังมีค่าที่น่าสนใจอีกมากมาย - `95% confidence boundaries` เป็นการหาช่วงเชื่อมั่นของค่าสัมประสิทธิ์อัลฟ่า ว่าค่าในประชากรน่าจะมีค่าอยู่ในช่วงใด ถ้าช่วงเชื่อมั่นยิ่งแคบ ค่าอัลฟ่าที่คำนวณได้จะยิ่งแม่นยำ - `Reliability if an item is dropped:` เป็นการตรวจสอบค่าอัลฟ่าเมื่อนำข้อคำถามในแถวนั้นออก โดยดูจาก `raw_alpha` ค่านี้ยิ่งสูงยิ่งดี - `Item statistics` เป็นค่าสถิติของข้อคำถามแต่ละข้อ โดยเน้นที่ 3 คอลัมน์ด้านหลัง คือ `r.drop` ซึ่งเป็นค่าสหสัมพันธ์ระหว่างข้อคำถามและคะแนนรวมของข้ออื่น (Corrected Item Total Correlation; CITC), ค่าเฉลี่ย (`mean`), และส่วนเบี่ยงเบนมาตรฐาน (`sd`) - `Non missing response frequency for each item` เป็นการตรวจสอบตัวเลือกแต่ละตัวเลือกของแต่ละข้อ พร้อมทั้งตรวจสอบด้วยว่าแต่ละข้อมีข้อมูลสูญหายเท่าไร เมื่อตรวจสอบค่า CITC แล้ว จะพบว่าทุกข้อมีค่าสูงกว่า .2 ซึ่งถือว่าทุกข้อในมาตรนี้ ค่อนข้างสอดคล้องไปในทางเดียวกัน ซึ่งสะท้อนให้เห็นในค่าอัลฟ่า ที่มีค่าถึง .88 อย่างไรก็ตาม เพื่อสาธิตการคัดข้อคำถามด้วย CITC จะตัดข้อคำถามในมาตรนี้ออกไป 5 ข้อ ให้เหลือ 5 ข้อ เมื่อตรวจสอบค่า CITC ของทั้ง 10 ข้อ พบว่าข้อที่ 7 มีค่า CITC ต่ำที่สุด จึงตัดข้อคำถามดังกล่าว วิธีการติดตามการตัดข้อคำถามที่ง่ายที่สุด คือ การตัดข้อผ่านคำสั่ง `setdiff` โดยนำชื่อข้อคำถามไปใส่เป็น argument ที่ 1 แล้วนำชื่อข้อคำถามที่จะตัดออกไปใส่ใน argument ที่ 2 ผลลัพธ์จะเป็นรายชื่อข้อคำถามที่คัดข้อทิ้งแล้ว กล่าวคือ จะเหลือข้อ 1, 2, 3, 4, 5, 6, 8, 9, 10 นำผลลัพธ์ทั้ง 9 ข้อไปหา CITC อีกรอบหนึ่ง ```{r citc1} itemname1 <- setdiff(itemname, "EMO07") itemname1 alpha(dat[,itemname1]) ``` ตรวจสอบค่า CITC อีกครั้ง พบว่าข้อที่ 8 ต่ำที่สุด นำข้อดังกล่าวออก แล้วหา CITC ของ 8 ข้อที่เหลือ ```{r citc2} itemname2 <- setdiff(itemname1, "EMO08") alpha(dat[,itemname2]) ``` ตรวจสอบค่า CITC อีกครั้ง พบว่าข้อที่ 6 ต่ำที่สุด นำข้อดังกล่าวออก แล้วหา CITC ของ 7 ข้อที่เหลือ ```{r citc3} itemname3 <- setdiff(itemname2, "EMO06") alpha(dat[,itemname3]) ``` ตรวจสอบค่า CITC อีกครั้ง พบว่าข้อที่ 9 ต่ำที่สุด นำข้อดังกล่าวออก แล้วหา CITC ของ 6 ข้อที่เหลือ ```{r citc4} itemname4 <- setdiff(itemname3, "EMO09") alpha(dat[,itemname4]) ``` ตรวจสอบค่า CITC อีกครั้ง พบว่าข้อที่ 10 ต่ำที่สุด นำข้อดังกล่าวออก แล้วหา CITC ของ 5 ข้อที่เหลือ ```{r citc5} itemname5 <- setdiff(itemname4, "EMO10") alpha(dat[,itemname5]) ``` การตัดข้อออก 5 ข้อเรียบร้อยแล้ว จะเห็นว่าข้อที่เหลือ จะเป็นข้อทางบวกทั้งหมด ข้อทางลบถูกคัดทิ้งออกทั้งหมด ความจริงเป็นคุณลักษณะที่ไม่พึงประสงค์ เพราะว่าความตรงเชิงเนื้อหา (Content Validity) จะตกลง (แม้ความเที่ยงสูงขึ้น) แต่กรณีนี้ทำเพื่อเป็นการสาธิตให้เห็นกระบวนการคัดข้อคำถามผ่าน CITC เท่านั้น