---
title: "การประเมินลักษณะมนุษย์: ตัวอย่าง R Code สำหรับคาบเรียนที่ 2"
author: "สันทัด พรประเสริฐมานิต"
output: html_document
date: "`r format(Sys.time(), '%d/%m/%Y')`"
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## การหาความเที่ยง

อ่านข้อมูลด้วยคำสั่ง `read.table` แล้วใส่ไฟล์ที่ต้องการอ่านลงไป ในที่นี้คือ `bigfive.csv` ถ้าไม่ใส่ directory ของไฟล์ดังกล่าว ให้ไฟล์ข้อมูลอยู่ใน session ที่ R กำลังวิเคราะห์ข้อมูลอยู่ ตรวจสอบโดยพิมพ์คำสั่ง `getwd()` ลงไป 

โดยปกติ ถ้าเปิด RStudio จากไฟล์ `\*.R` ใน Folder หนึ่ง session ที่ R วิเคราะห์ข้อมูลอยู่จะเป็น Folder ที่ไฟล์ที่เปิดนั้นอยู่ ดังนั้นสามารถใส่ไฟล์ข้อมูลลงใน Folder นั้นได้เลย

```{r openfile}
dat <- read.table("bigfive.csv", sep = ",", header = TRUE)
getwd()
```

ใช้คำสั่ง `head` เพื่อคัดเฉพาะแถวแรกๆ ของข้อมูลมาดูว่า ข้อมูลมีลักษณะเป็นอย่างไร

```{r headdat}
head(dat)
```

ใช้คำสั่ง `describe` ในแพ๊คเกจ `psych` เพื่อตรวจสอบค่าสถิติพื้นฐานของตัวแปรแต่ละตัวในข้อมูล

```{r describedat}
library(psych)
describe(dat)
```

หาความสัมพันธ์ระหว่างตัวแปรที่ 1 และ 2 ในข้อมูลด้วยคำสั่ง `cor`

```{r corpair}
cor(dat[,1], dat[,2])
```

สามารถใช้คำสั่ง `cor` เพื่อตรวจสอบความสัมพันธ์ระหว่างตัวแปรทุกตัวในข้อมูลได้

```{r corall}
cor(dat)
```

ลดจำนวนทศนิยมให้เหลือ 3 ตำแหน่งด้วยคำสั่ง `round`

```{r corallround}
round(cor(dat), 3)
```

ตัวแปรที่ 1-6 เป็นตัวแปรในด้านการเปิดรับประสบการณ์ (Openness) หาค่าอัลฟ่าของคะแนนรวมจากคะแนนข้อย่อย 6 ข้อด้วยคำสั่ง `alpha` ที่อยู่ในแพ๊คเกจ `psych` ได้

```{r alpha1}
library(psych)
alpha(dat[,1:6])
```

บุคลิกภาพอีก 4 ด้านที่เหลือเป็นดังนี้

- ตัวแปรที่ 7-12 อยู่ในด้านความรับผิดชอบ (Conscientiousness)
- ตัวแปรที่ 13-18 อยู่ในด้านการเปิดตัว (Extraversion)
- ตัวแปรที่ 19-24 อยู่ในด้านความเข้ากันได้กับผู้อื่น (Agreeableness)
- ตัวแปรที่ 25-30 อยู่ในด้านความอ่อนไหวทางอารมณ์ (Neuroticism)

บุคลิกภาพอีก 4 ด้านที่เหลือสามารถนำไปหาค่าอัลฟ่าได้ดังนี้

```{r alpha2}
alpha(dat[,7:12])
alpha(dat[,13:18])
alpha(dat[,19:24])
alpha(dat[,25:30])
```

ผลการวิเคราะห์จากคำสั่ง `alpha` สามารถบันทึกไว้ได้ ในตัวอย่างนี้บันทึกไว้ในชื่อ `out` ลองมาดูว่าผลการวิเคราะห์ที่บันทึกไว้ มีข้อมูลอะไรอยู่ในนั้นบ้างด้วยคำสั่ง `names`

```{r savealpha}
out <- alpha(dat[,1:6])
names(out)
```

ในข้อมูลที่บันทึก พบว่า `total` เป็นส่วนที่บันทึกตัวเลขอัลฟ่าอยู่ สามารถดึงออกมาได้ด้วยการเขียนชื่อผลที่บันทึกไว้ ตามด้วย `$` เพื่อบอกว่าจะดึงข้อมูลย่อยในนั้น แล้วตามด้วยชื่อข้อมูลย่อย `total`

```{r shownumalpha}
out$total
```

นำอัลฟ่าไปบันทึกไว้ในชื่อ `relia` โดยบันทึกเฉพาะตัวเลขที่ 1 ที่เป็นอัลฟ่า

```{r savenumalpha}
relia <- out$total[1]
```

ต่อไป เป็นการสร้างคะแนนรวมของการเปิดรับประสบการณ์ ที่เกิดจากการรวมคะแนน 6 ข้อเข้าด้วยกัน มีวิธีการทำได้หลายวิธี สามารถดึงตัวแปรแต่ละตัวมาบวกกันก็ได้ ใช้คำสั่ง `with` ช่วย เพื่อนำชื่อตัวแปรมาบวกกันโดยตรงก็ได้ หรือใช้คำสั่ง `apply` เพื่อบวกจะบวกข้อมูลคอลัมน์ 1-6 ในแต่ละแถว (หมายเลข 1 ใน argument ที่ 2)

```{r sum}
openness <- dat[,1] + dat[,2] + dat[,3] + dat[,4] + dat[,5] + dat[,6]
openness <- with(dat, O1 + O2 + O3 + O4 + O5 + O6)
openness <- apply(dat[,1:6], 1, sum)
```

ดูค่าสถิติพื้นฐานของ `openness` ที่คำนวณได้ สามารถใช้คำสั่ง `summary` ก็ได้ หรือคำสั่ง `describe` ก็ได้ ผลลัพธ์ที่ได้จะแตกต่างกัน ผลลัพธ์จากคำสั่ง `describe` จะมีข้อมูลที่สมบูรณ์กว่า

```{r describesum}
summary(openness)
describe(openness)
```

หาความผิดพลาดจากการวัด (Standard Error of Measurement) โดยหาค่าส่วนเบี่ยงเบนมาตรฐานของคะแนนรวมก่อน หลังจากนั้นนำไปเข้าสูตรการคำนวณ

```{r sem}
sigmay <- sd(openness)
sem <- sigmay * sqrt(1 - relia)
```

หาค่าวิกฤต (Critical Value) โดยอ้างอิงจากโค้งปกติ ในการหาช่วงเชื่อมั่น 95% จะต้องมีพื้นที่ทางซ้ายและขวา ด้านละ 2.5% (0.025) จึงใส่ 0.025 ไปในคำสั่ง `qnorm` เพื่อหาค่า z ที่ตรงกับพื้นที่ทางซ้าย 2.5% จะได้ค่าที่ -1.96 จึงใส่เครื่องหมายลบเข้าไป เพื่อกลับให้เป็นค่าบวก

```{r critvalue}
crit <- -qnorm(0.025)
```

หาช่วงเชื่อมั่นของคะแนนที่แท้จริง (True Score) เมื่อคะแนนรวมที่สังเกตได้ (Observed Score) มีค่าเท่ากับ 15

```{r ci}
15 - crit*sem
15 + crit*sem
```