5 獨立樣本單因子變異數分析
以R語言讀入資料並做獨立樣本單因子變異數分析。
5.1 資料準備
5.1.1 讀入檔案
接續前一單元,以gData3m變數來做分析,或以xlsx套件的read.xlsx()函數或readxl套件的read_xlsx()函數來讀入gData3m.xlsx檔。
## # A tibble: 6 × 3
## 編號 考試 成績
## <chr> <chr> <dbl>
## 1 1 期初考 68
## 2 2 期初考 76
## 3 3 期初考 64
## 4 4 期初考 64
## 5 5 期初考 0
## 6 6 期初考 96
5.1.2 準備可供變異數分析的資料
將考試修改為班別的資料。
cData <- gData3m
names(cData)[2] <- '班別'
將期初、期中、期末考改為A班、B班、C班,並將編號改為1~171,共171名受試者(不改也不影響分析,但還是改一下,符合一般情境)。
##
## Attaching package: 'plyr'
## The following objects are masked from 'package:rstatix':
##
## desc, mutate
## The following object is masked from 'package:ggpubr':
##
## mutate
## The following objects are masked from 'package:Hmisc':
##
## is.discrete, summarize
## # A tibble: 6 × 3
## 編號 班別 成績
## <int> <chr> <dbl>
## 1 1 A 68
## 2 2 A 76
## 3 3 A 64
## 4 4 A 64
## 5 5 A 0
## 6 6 A 96
5.3 獨立樣本變異數分析
確認班別是factor。若不是的話轉為factor。
## tibble [171 × 3] (S3: tbl_df/tbl/data.frame)
## $ 編號: int [1:171] 1 2 3 4 5 6 7 8 9 10 ...
## $ 班別: Factor w/ 3 levels "A","B","C": 1 1 1 1 1 1 1 1 1 1 ...
## $ 成績: num [1:171] 68 76 64 64 0 96 96 40 96 96 ...
5.3.1 變異數同質性檢定
先以leveneTest()函數進行變異數同質性檢定。由結果可知資料並未違反變異數同質假設(F(2,168)=1.46, p=0.23)。
library(car)
leveneTest(成績~班別, data=cData, center=mean)
## Levene's Test for Homogeneity of Variance (center = mean)
## Df F value Pr(>F)
## group 2 1.4619 0.2347
## 168
5.3.2 變異數分析
因變異數同質,可用anova()來做變異數分析。結果顯示三個班級的考試成績有差異,F(2,168)=44.95, p<.001。
## Analysis of Variance Table
##
## Response: 成績
## Df Sum Sq Mean Sq F value Pr(>F)
## 班別 2 25493 12746.6 44.949 2.314e-16 ***
## Residuals 168 47642 283.6
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
也可以用aov()來做。結果同上。
anova1 <- aov(成績~factor(班別),data=cData)
model.tables(anova1, type="means")
## Tables of means
## Grand mean
##
## 65.73684
##
## factor(班別)
## factor(班別)
## A B C
## 82.81 54.95 59.46
summary(anova1)
## Df Sum Sq Mean Sq F value Pr(>F)
## factor(班別) 2 25493 12747 44.95 2.31e-16 ***
## Residuals 168 47642 284
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
5.3.3 事後比較
可用TukeyHSD()來做事後比較。結果顯示A班和B班、A班和C班的成績有差異,B班和C班則無。
TukeyHSD(anova1)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = 成績 ~ factor(班別), data = cData)
##
## $`factor(班別)`
## diff lwr upr p adj
## B-A -27.859649 -35.318779 -20.40052 0.0000000
## C-A -23.350877 -30.810007 -15.89175 0.0000000
## C-B 4.508772 -2.950358 11.96790 0.3281624
或做pairwise t test。結果同上。
library(rstatix)
pairwise_t_test(cData, 成績~班別, paired = FALSE, p.adjust.method = "bonferroni")
## # A tibble: 3 × 9
## .y. group1 group2 n1 n2 p p.signif p.adj p.adj.signif
## * <chr> <chr> <chr> <int> <int> <dbl> <chr> <dbl> <chr>
## 1 成績 A B 57 57 1.32e-15 **** 3.95e-15 ****
## 2 成績 A C 57 57 6.12e-12 **** 1.84e-11 ****
## 3 成績 B C 57 57 1.55e- 1 ns 4.64e- 1 ns
5.3.4 變異數不同質時
若變異數不同質,可用oneway.test()函數,將var.equal設為FALSE來做ANOVA。
oneway.test(成績~班別, data=cData, var.equal=FALSE)
##
## One-way analysis of means (not assuming equal variances)
##
## data: 成績 and 班別
## F = 43.952, num df = 2.00, denom df = 109.09, p-value = 1e-14
可用games_howell_test來做事後比較。games_howell_test()假設變異數不同質。
library(rstatix)
games_howell_test(cData, 成績 ~ 班別, conf.level = 0.95, detailed = FALSE)
## # A tibble: 3 × 8
## .y. group1 group2 estimate conf.low conf.high p.adj p.adj.signif
## * <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 成績 A B -27.9 -35.0 -20.7 4.72e-14 ****
## 2 成績 A C -23.4 -31.5 -15.2 1.66e- 9 ****
## 3 成績 B C 4.51 -2.60 11.6 2.91e- 1 ns