4 相依樣本單因子變異數分析

以R語言讀入資料並做相依樣本單因子變異數分析。

4.1 資料準備

4.1.1 讀入檔案

以xlsx套件的read.xlsx()函數或readxl套件的read_xlsx()函數來讀入上個單元中所存出的gData1.xlsx檔

library(readxl)
gData1 <- read_xlsx("gData1.xlsx")
head(gData1)
## # A tibble: 6 × 8
##   學號      性別   組別  出席  影片 期中考 期末考 總成績
##   <chr>     <chr> <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>
## 1 102368014 M         9   8.5  82.6     32   28     56.0
## 2 102368018 M        10   9.5  82.9     66   59     78.8
## 3 102368024 F         9   8    82.6     69   68     81.2
## 4 102368027 F         9   8    82.6     68   83.5   86.0
## 5 102368030 F        11   0    66.5     39   30     45.2
## 6 100368033 M         4  12    73.3     58   79     82.1

4.1.2 準備可供變異數分析的資料

新增一假設的期初考成績,以做為變異數分析之用。

library(tibble)
gData1 <- add_column(gData1, 期初考=gData1$出席*8, .after = 5)
head(gData1)
## # A tibble: 6 × 9
##   學號      性別   組別  出席  影片 期初考 期中考 期末考 總成績
##   <chr>     <chr> <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 102368014 M         9   8.5  82.6     68     32   28     56.0
## 2 102368018 M        10   9.5  82.9     76     66   59     78.8
## 3 102368024 F         9   8    82.6     64     69   68     81.2
## 4 102368027 F         9   8    82.6     64     68   83.5   86.0
## 5 102368030 F        11   0    66.5      0     39   30     45.2
## 6 100368033 M         4  12    73.3     96     58   79     82.1

選擇期初考、期中考和期末考進來分析,並加入編號(亦可使用學號,這邊方便起見加入編號來做)。

gData3 <- subset(gData1, select = c(期初考, 期中考, 期末考))
gData3 <- add_column(gData3, id = c(1:nrow(gData3)), .after = 0)
head(gData3)
## # A tibble: 6 × 4
##      id 期初考 期中考 期末考
##   <int>  <dbl>  <dbl>  <dbl>
## 1     1     68     32   28  
## 2     2     76     66   59  
## 3     3     64     69   68  
## 4     4     64     68   83.5
## 5     5      0     39   30  
## 6     6     96     58   79

用reshape2套件的melt()函數,將期初、期中、期末考合併為一行。

library(reshape2)
gData3m <- melt(gData3, id = c("id"), measured = c("期初考", "期中考", "期末考"))
head(gData3m)
##   id variable value
## 1  1   期初考    68
## 2  2   期初考    76
## 3  3   期初考    64
## 4  4   期初考    64
## 5  5   期初考     0
## 6  6   期初考    96

更改column的名稱。

names(gData3m) <- c('編號', '考試', '成績')
head(gData3m)
##   編號   考試 成績
## 1    1 期初考   68
## 2    2 期初考   76
## 3    3 期初考   64
## 4    4 期初考   64
## 5    5 期初考    0
## 6    6 期初考   96

以上資料格式即為變異數分析所需的格式。

在執行相依樣本單因子變異數分析時,要注意的是,資料必須如此例這般,不同組的資料以「接續」的方式排列。若拿到的資料是一般相依樣本的資料輸入方式(即不同組在不同的columns),需先進行資料的處理,將wide data轉為long data,再做相依樣本單因子變異數分析。

4.2 描述統計

檢視三次考試的平均數和標準差。

library(vtable)
st(gData3m, group='考試')
Table 4.1: Summary Statistics
考試
期初考
期中考
期末考
Variable N Mean SD N Mean SD N Mean SD
編號 57 29 16.598 57 29 16.598 57 29 16.598
成績 57 82.807 18.485 57 54.947 13.313 57 59.456 18.216

以boxplot來看作圖。

boxplot(成績~考試, data=gData3m)

以ggpubr套件的ggline函數來作圖,畫平均數和標準差。

library(ggpubr)
ggline(gData3m,x="考試",y="成績",add=c("mean_sd"))

4.3 變異數分析

先將編號的格式改為factor。

gData3m$編號 <- factor(gData3m$編號)
head(gData3m)
##   編號   考試 成績
## 1    1 期初考   68
## 2    2 期初考   76
## 3    3 期初考   64
## 4    4 期初考   64
## 5    5 期初考    0
## 6    6 期初考   96

4.3.1 球型檢定與變異數分析

用rstatix package中的anova_test()來做變異數分析,將結果儲存為res。並以res來看檢驗的結果。

因本資料違反球型檢定,需要看sphericity correction的表。Sphericity Corrections以Greenhouse-Geisser (GG)和Huynh-Feldt (HF) epsilon values來做校正。校正後的值 p[GG] 和 p[HF] 皆小於.001,表示不同考試成績有顯著差異。

library(rstatix)
res <- anova_test(data = gData3m, dv = 成績, wid = 編號, within = 考試)
res
## ANOVA Table (type III tests)
## 
## $ANOVA
##   Effect DFn DFd      F        p p<.05   ges
## 1   考試   2 112 73.704 3.74e-21     * 0.349
## 
## $`Mauchly's Test for Sphericity`
##   Effect    W     p p<.05
## 1   考試 0.84 0.008     *
## 
## $`Sphericity Corrections`
##   Effect   GGe      DF[GG]   p[GG] p[GG]<.05   HFe      DF[HF]   p[HF]
## 1   考試 0.862 1.72, 96.57 1.4e-18         * 0.887 1.77, 99.36 4.8e-19
##   p[HF]<.05
## 1         *

最後,用get_anova_table()來看校正後的結果。校正的結果顯示,F(1.72, 96.57) = 73.704, p < .001。三次考試的成績顯著不同。

## ANOVA Table (type III tests)
## 
##   Effect  DFn   DFd      F       p p<.05   ges
## 1   考試 1.72 96.57 73.704 1.4e-18     * 0.349

4.3.2 多重比較

可用pairwise_t_test()來做兩兩比較,看差異來自於哪裡。結果顯示期中和期末考沒有差異,其餘兩兩比較都有差異。

pairwise_t_test(gData3m, 成績 ~ 考試, paired = TRUE, p.adjust.method = "bonferroni")
## # A tibble: 3 × 10
##   .y.   group1 group2    n1    n2 statistic    df        p    p.adj p.adj.signif
## * <chr> <chr>  <chr>  <int> <int>     <dbl> <dbl>    <dbl>    <dbl> <chr>       
## 1 成績  期初考 期中考    57    57     10.4     56 1.11e-14 3.33e-14 ****        
## 2 成績  期初考 期末考    57    57      8.60    56 8.06e-12 2.42e-11 ****        
## 3 成績  期中考 期末考    57    57     -2.36    56 2.2 e- 2 6.5 e- 2 ns

4.3.3 若未違反球型檢定

若是球型檢定沒有違反,也可以用aov()來做變異數分析。在aov()中,以y~factor(x)+Error(factor(Subj)/factor(x))來執行變異數分析。

ANOVAData <- aov(成績~factor(考試)+Error(factor(編號)/factor(考試)), data=gData3m)

以model.tables()來看各組的邊緣平均數(marginal mean)和總平均數(ground mean)。總平均數為65.74,期初、期中和期末考的平均數分別為82.81、54.95與59.46。

model.tables(ANOVAData,type="means")
## Tables of means
## Grand mean
##          
## 65.73684 
## 
##  factor(考試) 
## factor(考試)
## 期初考 期中考 期末考 
##  82.81  54.95  59.46

以summary()來看ANOVA table。可得到F(2,112)=73.7,p<.001,表示三次考試的成績有顯著差異。

summary(ANOVAData,type="means")
## 
## Error: factor(編號)
##           Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 56  28272   504.9               
## 
## Error: factor(編號):factor(考試)
##               Df Sum Sq Mean Sq F value Pr(>F)    
## factor(考試)   2  25493   12747    73.7 <2e-16 ***
## Residuals    112  19370     173                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1