---
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 เท่านั้น


