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

Moderation Analysis

Simple Moderation Analysis หรือ การมีตัวแปรต้น (IV) อีก 1 ตัว (หรือ W) ที่สามารถทำให้ผลของตัวแปรตาม (DV) เปลี่ยนไป

การมีตัวแปร Moderation (M or W) หรือ ตัวแปรกำกับ จะแตกต่างจากเมื่อเราศึกษา two-way ANOVA ตรงที่ตัวแปรกำกับจะเป็นแบบ interval scale (หรือตัวแปรต่อเนื่อง) หรือแบบจัดกลุ่ม (factor) ก็ได้ ซึ่งเราจะสามารถใช้ตัวแปรกำกับในคำถามการวิจัยอย่างเช่น

ความสามารถในการสร้างรายได้ใน SME ธรรมดา และ Start up Tech “จะเปลี่ยนไปหรือไม่” เมื่อ Circle of Friends เพื่อนฝูงมีมากขึ้น

คำว่า “จะเปลี่ยนไปหรือไม่” คือเมื่อเปรียบเทียบระดับกลุ่ม IV แล้ว W ทำให้ DV ต่างออกไปจากเดิมไหม

เราจะลองสร้างชุดข้อมูลกันค่ะ

DATA (based on my work)

type <- c(rep("SMEs", 120), rep("StartUp", 120))
income <- c(abs(rnorm(120, 303.321, sd = 2.6)), abs(rnorm(120, 300.111, sd = 3.1)))
friends <- c(round(abs(rnorm(120, 5, sd = 2.8))), round(abs(rnorm(120, 12, sd = 1.8))))
data <- data.frame(type, income, friends)
summary(data)
##      type               income         friends      
##  Length:240         Min.   :292.1   Min.   : 0.000  
##  Class :character   1st Qu.:299.3   1st Qu.: 5.000  
##  Mode  :character   Median :301.4   Median : 9.000  
##                     Mean   :301.3   Mean   : 8.425  
##                     3rd Qu.:303.5   3rd Qu.:12.000  
##                     Max.   :308.9   Max.   :16.000
psych::describe(data)
##         vars   n   mean   sd median trimmed  mad    min   max range  skew
## type*      1 240   1.50 0.50   1.50    1.50 0.74   1.00   2.0  1.00  0.00
## income     2 240 301.31 3.24 301.43  301.41 3.12 292.15 308.9 16.75 -0.21
## friends    3 240   8.43 4.28   9.00    8.55 5.93   0.00  16.0 16.00 -0.21
##         kurtosis   se
## type*      -2.01 0.03
## income     -0.15 0.21
## friends    -1.16 0.28
    table(data$type)
## 
##    SMEs StartUp 
##     120     120

โมเดลสมการเส้นตรง

model <- lm(income ~ type * friends, data)
# or
model_aov <- aov(income ~ type * friends, data)
summary(model)
## 
## Call:
## lm(formula = income ~ type * friends, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -9.2456 -1.7510  0.0981  1.7816  7.7832 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         302.92130    0.50448 600.457   <2e-16 ***
## typeStartUp          -2.42632    1.62658  -1.492    0.137    
## friends               0.02414    0.08897   0.271    0.786    
## typeStartUp:friends  -0.10003    0.15577  -0.642    0.521    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.753 on 236 degrees of freedom
## Multiple R-squared:  0.2864, Adjusted R-squared:  0.2773 
## F-statistic: 31.57 on 3 and 236 DF,  p-value: < 2.2e-16

ผลวิเคราะห์จะพบว่า จำนวนเพื่อไม่มีนัยสำคัญในการทำนายโมเดลนี้ ในขณะที่เมื่อเปรียบเทียบกับ SMEs แล้ว StartUp มีความแตกต่างจาก SMEs ในการทำนายความสามารถในการสร้างรายได้ -2.42 (แปลว่าน้อยกว่า SMEs) และการเปลี่ยนแปลงของความชันที่จำนวนกลุ่มเพื่อน = 1, และอยู่ในกลุ่ม StartUp จะพบว่ามีค่าน้อยกว่าเหมือนกัน (-0.1) แต่ไม่มีนัยสำคัญทางสถิติ

การมองแบบระดับในตัวแปร Moderation ที่เป็นมาตรระดับหรือมีความต่อเนื่อง

ด้วยการมองภาพจำนวนเพื่อนเป็น scale มีความต่อเนื่อง เราจึงสามารถอธิบายได้เพียงว่า เมื่อจำนวนวงของเพื่อนเพิ่มขึ้น ความสามารถในการสร้างรายได้ไม่ได้มีความแตกต่างทางสถิติ

เพื่อความละเอียดและง่ายต่อการดูระดับของจำนวนกลุ่มของเพื่อน (") เราสามารถแบ่งกลุ่ม โดยใช้ค่า SD ที่ (+1SD) , กลาง (Mean), และต่ำ (-1SD)

# ใช้ library emmeans = estimated marginal means

library(emmeans)

Sdm1 <- mean(data$friends) - sd(data$friends)
Mean <- mean(data$friends)
Sdp1 <- mean(data$friends) + sd(data$friends)

# build emmeans objects
data.emm <- emmeans(model, ~ type | friends, at = list(friends = c(Sdm1, Mean, Sdp1)))
data.sum <- summary(data.emm)
data.sum
## friends =  4.147:
##  type    emmean     SE  df lower.CL upper.CL
##  SMEs     303.0 0.2605 236    302.5    303.5
##  StartUp  300.2 1.0268 236    298.2    302.2
## 
## friends =  8.425:
##  type    emmean     SE  df lower.CL upper.CL
##  SMEs     303.1 0.4007 236    302.3    303.9
##  StartUp  299.9 0.5142 236    298.8    300.9
## 
## friends = 12.703:
##  type    emmean     SE  df lower.CL upper.CL
##  SMEs     303.2 0.7370 236    301.8    304.7
##  StartUp  299.5 0.2699 236    299.0    300.1
## 
## Confidence level used: 0.95

พอเราจัดแยกกลุ่ม สูง กลาง และต่ำด้วยค่า SD แล้วจะพบค่าเฉลี่ยในกลุ่มของ SMEs และ StartUp ในแต่ละระดับของ friends ด้วย

ทดสอบรายคู่ และ สร้างกราฟด้วย emmeans::emmip()

# compare group using method == pairwise == every group regardless
emmeans::contrast(data.emm, "pairwise", by = "friends")
## friends =  4.15:
##  contrast       estimate    SE  df t.ratio p.value
##  SMEs - StartUp     2.84 1.059 236 2.682   0.0078 
## 
## friends =  8.43:
##  contrast       estimate    SE  df t.ratio p.value
##  SMEs - StartUp     3.27 0.652 236 5.015   <.0001 
## 
## friends = 12.70:
##  contrast       estimate    SE  df t.ratio p.value
##  SMEs - StartUp     3.70 0.785 236 4.711   <.0001

และเมื่อเราวิเคราะห์แบบ pairwise comparison ในแต่ละระดับ จะพบว่า SMEs และ StartUp แตกต่างกันอย่างมีนัยสำคัญทุกระดับ

#seeing data by emmip()
emmip(model, friends ~ type, at = list(friends = c(Sdm1, Mean, Sdp1)), CIs = TRUE)

จากกราฟจะเห็นว่า เมื่อแบ่งกลุ่ม friends เป็น สูง กลาง และต่ำแล้ว ค่าของแต่ละกลุ่ม SMEs vs. StartUp

ลองสร้างกราฟด้วย ggplot2 แล้วมองอีกมุมหนึ่ง

เราสามารถปรับมุมมองที่ใช้ในการมอง IV and W ได้ เพราะอย่าลืมว่า การพบกันของทั้งสองเป็นแบบ IV*W or W*IV

library(ggplot2)
ggplot(data.sum, aes(x = friends, y = emmean, color = type)) +
      geom_line(aes(color = type)) +
      geom_errorbar(aes(ymin = lower.CL, ymax = upper.CL), width = .5) +
      theme_classic() +
      xlab("Numbers of Friends") +
      ylab("Effectiveness of Making Income (M:millionTHB)")

อย่าให้แกน y จกตาเราค่ะ เพิ่ม ylim() ลงไปเพื่อให้เห็นภาพกว้างขึ้น

ggplot(data.sum, aes(x = friends, y = emmean, color = type)) +
      geom_line(aes(color = type )) +
      geom_errorbar(aes(ymin = lower.CL, ymax = upper.CL), width = .5) +
      theme_classic() +
      ylim(280, 310) +
      xlab("Numbers of Friends") +
      ylab("Effectiveness of Making Income (M:millionTHB)")

ประมาณนี้ค่า
จริงๆ ต้องขอบพระคุณ @kris-ariya มากๆๆๆ เพราะว่า แมวพยายามทำความเข้าใจในมิติของ moderation ตัวเดียวมานานมาก (เคยทำแต่ซับซ้อน) เพราะ simple มากก็ไปไม่เป็นเหมือนกัน


Back to Datastist.com