--- title: "การประเมินลักษณะมนุษย์: ตัวอย่าง R Code สำหรับคาบเรียนที่ 5" author: "สันทัด พรประเสริฐมานิต" output: html_document date: "`r format(Sys.time(), '%d/%m/%Y')`" --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ``` ```{r xx, include=FALSE} library(vegan) library(psych) library(mvtnorm) ``` ## การวิเคราะห์ความซ้ำซ้อน (Redundancy Analysis; RDA) อ่านข้อมูลด้วยคำสั่ง `read.table` แล้วใส่ไฟล์ที่ต้องการอ่านลงไป ในที่นี้คือ ` leadership.csv` ```{r openfile} dat <- read.table("leadership.csv", sep=",", header=TRUE) ``` ข้อมูลนี้เป็นข้อมูลจากลูกน้องจำนวน 201 คน ประเมินหัวหน้าตนเองด้วยมาตร Multifactor Leadership Questionnaire (MLQ) โดยคะแนนจากมาตรนี้จะแบ่งออกเป็นลักษณะของผู้นำ 9 ด้าน ซึ่งจะใช้เป็นตัวแปรทำนาย และตัวแปรผลลัพธ์จะเป็นการประเมินตนเองของลูกน้อง โดยจะประเมินเรื่องประสิทธิภาพในการทำงาน การใช้พยายามพิเศษในการทำงาน และความพึงพอใจในงาน ดูค่าสถิติพื้นฐานของข้อมูลได้โดยคำสั่ง `describe` จาก `psych` package ```{r describe} library(psych) describe(dat) ``` ในการทำ RDA จะใช้คำสั่ง `rda` ในแพ๊คเกจ `vegan` แต่การวิเคราะห์ RDA จะเกี่ยวข้องกับตัวแปรจำนวนมาก เพื่อให้ง่ายต่อการวิเคราะห์ ให้สร้างข้อมูลใหม่ ที่ข้อมูลหนึ่งมีเฉพาะตัวแปรทำนาย และอีกข้อมูลหนึ่งมีเฉพาะตัวแปรผลลัพธ์ ```{r sepdata} predictors <- dat[,c("idealattributed", "idealbehavior", "individualconsideration", "inspiremotive", "intelstimulation", "contingentreward", "managebyexceptactive", "managebyexceptpassive", "laissezfaire")] outcomes <- dat[,c("effectiveness", "extraeffort", "satisfaction")] ``` จากนั้น ใช้ฟังก์ชั่น `rda` โดยใส่ข้อมูลผลลัพธ์ (`outcomes`) ไว้ทางซ้ายของ `~` และใส่ `.` ทางด้านขวา เพื่อแสดงว่าใช้ทุกตัวแปรในข้อมูลในการทำนาย แล้วใส่ข้อมูลตัวแปรต้นใน `data` จากนั้นใช้คำสั่ง `scale=TRUE` เพื่อเปลี่ยนตัวแปรตามให้เป็นคะแนนมาตรฐาน จะทำให้น้ำหนักของตัวแปรตามแต่ละตัวเท่ากัน ในการแสดงผลจะใช้คำสั่ง `summary` แต่เนื่องจากข้อมูลผลลัพธ์ที่ให้มีจำนวนมาก จึงใส่ `display=c("sp", "bp", "cn")` เพื่อคัดเลือกเฉพาะผลลัพธ์ที่สำคัญ ```{r rda} library(vegan) out <- rda(outcomes ~ ., data=predictors, scale=TRUE) summary(out, display=c("sp", "bp", "cn")) ``` ส่วนต่างๆ ของผลลัพธ์เป็นดังนี้ - `Partitioning of correlations: ` เป็นการแบ่งความแปรปรวนของตัวแปรตาม ว่าทั้งหมดมีสัดส่วน 100% (เทียบเท่ากับตัวแปร 3 ตัว) แบ่งเป็นส่วนที่อธิบายได้ 48.3% (เทียบเท่ากับตัวแปร 1.449 ตัว) และส่วนที่อธิบายไม่ได้ 51.7% (เทียบเท่ากับ 1.551 ตัว) - `Eigenvalues, and their contribution to the correlations` จะบอกค่า Eigenvalues ของผลรวมแต่ละตัว จำนวนผลรวมที่เป็นไปได้จะเท่ากับจำนวนตัวแปรตาม 3 ตัว ผลรวมทั้ง 3 ตัวมีค่า Eigenvalues คือ 1.404, 0.024, และ 0.021 เทียบเท่ากับสัดส่วนความแปรปรวนรวมของตัวแปรตามทั้งหมดเท่ากับ 46.8%, 0.8% และ 0.7% ตามลำดับ และหากมองเฉพาะความแปรปรวนที่อธิบายได้ ผลรวมแต่ละตัวคิดเป็นสัดส่วน 96.9%, 1.7% และ 1.4% ตามลำดับ - `Species scores` จะบอกความหมายของผลรวมแต่ละตัว เมื่อเทียบกับตัวแปรตาม เมื่อผลรวมที่ 1 จะแสดงให้เห็นว่าเมื่อผลรวมนี้มีค่าสูงขึ้น ค่าของตัวแปรตามทั้ง 3 ตัวมีค่าน้อยลง เมื่อตรวจดูผลรวมที่ 2 จะพบว่าเมื่อผลรวมมีค่าสูง ค่าของประสิทธิภาพสูงขึ้น แต่ค่าความพยายามพิเศษ และความพึงพอใจจะน้อยลง และเมื่อดูผลรวมที่ 3 จะพบว่าเมื่อผลรวมมีค่าสูง ค่าของประสิทธิภาพ และความพึงพอใจมีค่าสูงขึ้น แต่ค่าความพยายามพิเศษจะมีค่าน้อยลง - `Biplot scores for constraining variables` จะบ่งบอกค่าสหสัมพันธ์ระหว่างผลรวมทั้งสาม กับตัวแปรทำนายแต่ละตัว (คล้ายกับความหมายน้ำหนักองค์ประกอบ) ค่าสหสัมพันธ์เหล่านี้จะช่วยในการแปลความหมายผลรวมแต่ละตัว ในตัวอย่างนี้ผลรวมที่ 1 จะหมายถึงลักษณะของผู้นำในผู้นำที่ส่งผลทางบวกกับลูกน้อง สามารถหาค่าสัมประสิทธิ์การทำนายที่ปรับแล้ว (Adjusted $R^2$) ได้ดังนี้ ```{r rsquared} RsquareAdj(out) ``` การทดสอบนัยสำคัญสามารถตรวจสอบได้ทั้งหมด 3 รูปแบบ แบบแรกคือทดสอบว่าตัวแปรอิสระทั้งหมด สามารถสร้างผลรวมใดผลรวมหนึ่งแล้วทำนายตัวแปรตามได้อย่างมีนัยสำคัญหรือไม่ ซึ่งการทดสอบนี้พบผลนัยสำคัญ ```{r anovarda} anova.cca(out) ``` ต่อไป สามารถตรวจสอบได้ว่าผลรวมแต่ละตัว สามารถอธิบายตัวแปรตามได้อย่างมีนัยสำคัญหรือไม่ พบว่ามีเพียงผลรวมแรกที่ถึงระดับนัยสำคัญ ```{r anovaeachrda} anova.cca(out, by="axis") ``` นอกจากนี้ สามารถตรวจสอบได้ว่า ตัวแปรอิสระแต่ละตัว หากลดออกจากโมเดลแล้ว จะทำให้การทำนายตัวแปรตามเปลี่ยนแปลงไปอย่างมีนัยสำคัญหรือไม่ ซึ่งถึงระดับนัยสำคัญ แสดงว่าตัวแปรทำนายดังกล่าว สามารถทำนายตัวแปรตามได้เพิ่มเติมจากตัวแปรอื่น การแปลความหมายคล้ายกับสัมประสิทธิ์ถดถอย ```{r anovaeachpredictor} anova.cca(out, by="margin") ``` นอกจากนี้ สามารถนำค่า Eigenvalues ของผลรวมต่างๆ ไปสร้างเป็นกราฟเพื่อตรวจสอบการตกลงของค่า Eigenvalues จากผลรวมลำดับต่างๆ เรียกว่า Scree Plot การแปลความหมายคล้ายๆ กับการวิเคราะห์องค์ประกอบเชิงสำรวจ (Exploratory Factor Analysis) ที่ผลรวมท้ายๆ จะเป็นค่าที่ทำนายตัวแปรเดียวโดดๆ แต่ผลรวมแรกๆ จะเป็นการทำนายตัวแปรมากกว่า 1 ตัว เมื่อไรก็ตามที่เห็นการตกลงของค่า Eigenvalues ในกราฟ เหมือนการตกหน้าผา ด้านซ้ายของหน้าผา คือจำนวนผลรวมที่ควรเก็บไว้ ```{r screeplot} screeplot(out) ``` จากข้อมูลนี้ พบว่าผลรวมแรกเพียงอย่างเดียวน่าจะเพียงพอในการอธิบายความสัมพันธ์ระหว่างตัวแปรทำนายและตัวแปรผลลัพธ์ ซึ่งหากอ่านผลรวมกับการทดสอบนัยสำคัญของผลรวมแต่ละตัว พบว่ามีเพียงผลรวมแรกที่ถึงระดับนัยสำคัญ และผลรวมแรกเป็นเพียงตัวเดียวที่มีความสามารถในการทำนายตัวแปรตามเกิน 1% จากเหตุผลเหล่านี้ จึงสนใจเพียงเฉพาะผลรวมแรกเท่านั้น ในการสร้างค่าที่ทำนายได้ (Predicted Values) โดยใช้คำสั่ง `predict` สามารถสร้างค่าทำนายได้ 2 แบบ แบบแรกคือค่าของตัวแปรตามที่ทำนายได้จากผลรวม 3 ตัว ใส่ `type="response"` เพื่อหาค่าที่ทำนายได้ของตัวแปรตาม ```{r predictresponses3} predictedresponse <- predict(out, type="response") head(predictedresponse) ``` อย่างไรก็ตาม ผลรวมที่น่าสนใจมีเพียงผลรวมแรกเพียงอย่างเดียว ดังนั้นจึงอาจเลือกหาค่าที่ทำนายได้ของตัวแปรตาม เมื่อใช้ผลรวมเพียงแค่ตัวแปรเดียว โดยใส่ `rank=1` ```{r predictresponses1} predictedresponse2 <- predict(out, type="response", rank=1) head(predictedresponse2) ``` นอกจากนี้ ยังสามารถหาของผลรวม ซึ่งก็คือค่าดัชนี ในการวัดแบบก่อรูป (Formative Measurement) โดยใส่ `type="lc"` เพื่อหาค่าที่ทำนายได้ของตัวแปรตาม ```{r predictlc} predictedlc <- predict(out, type="lc") head(predictedlc) ``` สมมติว่ามีค่าของตัวแปรทำนายใหม่ 2 ชุด ชุดแรก ตัวแปรทำนาย 6 ตัวแรกมีค่าสูงสุด (20) และ 3 ตัวหลังมีค่าต่ำสุด (4) ส่วนชุดที่สอง ตัวแปรทำนาย 6 ตัวแรกมีค่าต่ำสุด (4) และ 3 ตัวหลังมีค่าสูงสุด (20) สร้างชุดข้อมูลในรูปแบบ `data.frame` ```{r newdata} predictvarnames <- c("idealattributed", "idealbehavior", "individualconsideration", "inspiremotive", "intelstimulation", "contingentreward", "managebyexceptactive", "managebyexceptpassive", "laissezfaire") predictorvalues <- c(20, 20, 20, 20, 20, 20, 4, 4, 4) predictorvalues2 <- c(4, 4, 4, 4, 4, 4, 20, 20, 20) predval <- rbind(predictorvalues, predictorvalues2) colnames(predval) <- predictvarnames predval <- data.frame(predval) ``` จากนั้น นำข้อมูลใหม่ที่ได้มา เอาไปสร้างค่าที่ทำนายได้ ```{r predictnewdata} predict(out, type="response", newdata=predval) predict(out, type="response", newdata=predval, rank=1) predict(out, type="lc", newdata=predval) ``` สุดท้ายนี้ นักวิจัยสามารถที่จะลดจำนวนตัวแปรทำนายได้ เหมือนกับการวิเคราะห์ถดถอย ในที่นี้อาจใช้วิธี Stepwise ในการคัดเลือกตัวแปรทำนาย สามารถทำได้ผ่านคำสั่ง `ordiR2step` โดยค่าแรก ให้ใส่โมเดลเริ่มต้น ซึ่งเป็นโมเดลที่มีแต่จุดตัด ไม่มีตัวแปรต้นเลย (ใส่แค่ 1 ในการทำนาย) ส่วนค่าที่สอง `scope` คือโมเดลสูงที่สุดที่ทำได้ ซึ่งก็คือดึงมาจากโมเดลเดิม ที่ตัวแปรทำนายทั้ง 9 ตัวอยู่ในโมเดล ค่าที่ 3 `direction` คือวิธีการคัดเลือกโมเดล ในที่นี้เลือกวิธี `stepwise` ส่วนค่าที่ 4 `R2scope` เป็นการสร้างเงื่อนไขว่า ค่า Adjusted $R^2$ ของโมเดลสุดท้าย ต้องไม่มากกว่าโมเดลสูงสุดที่เป็นไปได้ หากการใส่ตัวแปรทำให้ Adjusted $R^2$ สูงกว่าโมเดลสุดท้าย ให้ตัดจบ และค่าที่ 5 `trace` คือการแสดงลำดับการคัดเลือก หากผู้ใช้ต้องการลดการแสดงผล ให้เปลี่ยนตัวนี้เป็น `FALSE` ได้ ```{r stepwise} minmodel <- rda(outcomes ~ 1, data = predictors, scale=TRUE) stepwise <- ordiR2step(minmodel, scope = formula(out), direction = "stepwise", R2scope = TRUE, trace = TRUE) stepwise ``` ## การคำนวณอัตราการเจอคนที่ใช่ (Hit Rate) ด้วยแนวคิดของ Taylor & Russell (1939) ส่วนนี้จะแสดง code ที่ใช้ในการคำนวณผลที่อยู่ในตารางของ Taylor & Russell (1939) โดยท่านต้องกำหนดค่า 3 ค่า ดังนี้ - `sr` คือ อัตราส่วนของคนที่จะเลือกต่อคนที่รับสมัคร (Selection Ratio) กล่าวคือ สัดส่วนของตำแหน่งที่ว่างต่อจำนวนคนสมัครทั้งหมด เช่น การคัดเลือกข้าราชการ มีคนมาสมัคร 10,000 คน ต้องการ 200 คน แสดงว่า `sr=0.02` โดย `sr` มีค่าได้ตั้งแต่ 0 ถึง 1 - `br` คือ อัตราส่วนของคนที่ใช่ (Base Rate) ในประชากรทั้งหมด เช่น จากคนไทยทั้งหมด มีโอกาสเจอคนที่เข้าเกณฑ์ 10% หมายความว่าค่า `br = 0.1` โดย `br` มีค่าเป็นไปได้ตั้งแต่ 0 ถึง 1 - `r` คือ ค่าสหสัมพันธ์ (Correlation) ระหว่างคะแนนที่ใช้คัดเลือก และเกณฑ์ที่ใช้ในการตัดสินว่าคนไหนใช่หรือไม่ เช่น บริษัทใช้แบบทดสอบเชาวน์ปัญญาในการคัดเลือกพนักงาน โดยมีความสัมพันธ์กับผลการปฏิบัติงานเท่ากับ .35 แสดงว่า `r=0.35` โดยแม้ `r` จะมีค่าติดลบได้ ให้เอาเครื่องหมายลบออก แล้วเหมาเป็นค่าบวกให้หมด ค่าที่เป็นไปได้คือตั้งแต่ 0 ถึง 1 **ตัวอย่างที่ 1** อัตราส่วนของคนที่จะเลือกต่อคนที่รับสมัครเท่ากับ 20% อัตราส่วนในการเจอคนที่ใช้เท่ากับ 30% และค่าสหสัมพันธ์ของแบบทดสอบเท่ากับ .25 สามารถแทนค่าใน code ได้ดังข้างล่าง พบว่าโอกาสในการเจอคนที่ใช่เท่ากับ 43% ```{r taylor1} sr <- 0.2 br <- 0.3 r <- 0.25 library(mvtnorm) zx <- qnorm(1 - sr) zy <- qnorm(1 - br) r <- matrix(c(1, r, r, 1), 2, 2) q1 <- pmvnorm(lower = c(zx, zy), mean=c(0,0), corr=r) q1q4 <- pmvnorm(lower = c(zx, -Inf), mean=c(0,0), corr=r) q1/q1q4 ``` **ตัวอย่างที่ 2** อัตราส่วนของคนที่จะเลือกต่อคนที่รับสมัครเท่ากับ 60% อัตราส่วนในการเจอคนที่ใช้เท่ากับ 70% และค่าสหสัมพันธ์ของแบบทดสอบเท่ากับ .5 สามารถแทนค่าใน code ได้ดังข้างล่าง พบว่าโอกาสในการเจอคนที่ใช่เท่ากับ 82% ```{r taylor2} sr <- 0.6 br <- 0.7 r <- 0.5 library(mvtnorm) zx <- qnorm(1 - sr) zy <- qnorm(1 - br) r <- matrix(c(1, r, r, 1), 2, 2) q1 <- pmvnorm(lower = c(zx, zy), mean=c(0,0), corr=r) q1q4 <- pmvnorm(lower = c(zx, -Inf), mean=c(0,0), corr=r) q1/q1q4 ``` ## การคำนวณค่าเฉลี่ยของเกณฑ์เมื่อใช้แบบวัด ด้วยแนวคิดของ Naylor & Shines (1965) ส่วนนี้จะแสดง code ที่ใช้ในการคำนวณผลที่อยู่ในตารางของ Naylor & Shines (1965) โดยท่านต้องกำหนดค่า 2 ค่า คือ `sr` และ `r` ซึ่งมีความหมายเหมือนกับการกำหนดตาราง Taylor & Russell **ตัวอย่างที่ 1** อัตราส่วนของคนที่จะเลือกต่อคนที่รับสมัครเท่ากับ 20% และค่าสหสัมพันธ์ของแบบทดสอบเท่ากับ .25 สามารถแทนค่าใน code ได้ดังข้างล่าง พบว่าค่าเฉลี่ยของคนที่ถูกคัดเลือกมา จะมีค่าเท่ากับคะแนนมาตรฐาน 0.35 ```{r naylor1} sr <- 0.2 r <- 0.25 zx <- qnorm(1 - sr) lambda <- dnorm(zx) r * lambda / sr ``` **ตัวอย่างที่ 2** อัตราส่วนของคนที่จะเลือกต่อคนที่รับสมัครเท่ากับ 60% และค่าสหสัมพันธ์ของแบบทดสอบเท่ากับ .5 สามารถแทนค่าใน code ได้ดังข้างล่าง พบว่าค่าเฉลี่ยของคนที่ถูกคัดเลือกมา จะมีค่าเท่ากับคะแนนมาตรฐาน 0.32 ```{r naylor2} sr <- 0.6 r <- 0.5 zx <- qnorm(1 - sr) lambda <- dnorm(zx) r * lambda / sr ```