主要参考http://www.gcf.dkf.unibe.ch/BCB/files/BCB_10Jan12_Alexander.pdf
当方差分析发现组间均值的显著性差异之后,我们会进一步需要知道哪几组有显著性差异,这就要用到多重比较(Multiple comparisons)
但是我们不能使用传统的t检验来进行多重比较,因为传统的t检验犯第一类错误的概率为a,若用t检验进行多重比较,会把犯第一类错误概率提升到1-(1-a)^(n(n-1)/2),其中n是组数,n越大多重比较结果犯第一类错误概率越大。
因此需要使用其他的多重比较方法,一般会用到以下4种:
1.Fisher LSD ,但是需要校正
2.Tukey HSD ,但是仅限等样本量的条件下
3.Duncan’s test, 但是仅限等样本量的条件下
4.Games-Howell , 可以用于不等样本量、组间方差不同的情况下
可见,在实际研究中最适用的还是Games-Howell方法,
具体方法发表在这里
Paul A. Games and John F. Howell Pairwise Multiple Comparison Procedures with Unequal N's and/or Variances: A Monte Carlo Study Journal of Educational Statistics,Vol.1, No. 2, 1976, pp. 113-125
这个方法怎么实施呢?
如果你有SPSS,就不用担心了,里面有这个功能。
而至今没有一个R包能实现这个功能。
但是,这里有份日本人写的代码(代码链接,说明链接)完成了这个功能,
具体用法是这样的,先用以下命令读入代码:
source("http://aoki2.si.gunma-u.ac.jp/R/src/tukey.R", encoding="euc-jp")
或者直接拷贝以下内容:
# Tukey の方法による多重比較
# Games-Howell の方法も選択できるように拡張 2009/08/03
tukey <- function( data, # 観察値ベクトル
group, # 群変数ベクトル
method=c("Tukey", "Games-Howell")) # 手法の選択
{
OK <- complete.cases(data, group) # 欠損値を持つケースを除く
data <- data[OK]
group <- factor(group[OK])
n <- tapply(data, group, length) # 各群のケース数
a <- length(n) # 群の数
phi.e <- sum(n)-a # 誤差分散(群内不偏分散)の自由度
Mean <- tapply(data, group, mean) # 各群の平均値
Variance <- tapply(data, group, var) # 各群の不偏分散
result1 <- cbind(n, Mean, Variance) # 各群の統計量
rownames(result1) <- paste("Group", 1:a, sep="")
method <- match.arg(method)
if (method == "Tukey") { # Tukey の方法
v.e <- sum((n-1)*Variance)/phi.e # 誤差分散(群内不偏分散)
t <- combn(a, 2, function(ij) # 対比較
abs(diff(Mean[ij]))/sqrt(v.e*sum(1/n[ij])) )
p <- ptukey(t*sqrt(2), a, phi.e, lower.tail=FALSE) # 有意確率を計算する
Tukey <- cbind(t, p) # 対比較の結果
rownames(Tukey) <- combn(a, 2, paste, collapse=":")
return(list(result1=result1, Tukey=Tukey, phi=phi.e, v=v.e))
}
else { # Games-Howell の方法
t.df <- combn(a, 2, function(ij) { # 対比較
t <- abs(diff(Mean[ij]))/sqrt(sum(Variance[ij]/n[ij]))
df <- sum(Variance[ij]/n[ij])^2/sum((Variance[ij]/n[ij])^2/(n[ij]-1))
return(c(t, df))} )
t <- t.df[1,]
df <- t.df[2,]
p <- ptukey(t*sqrt(2), a, df, lower.tail=FALSE) # 有意確率を計算する
Games.Howell <- cbind(t, df, p) # 対比較の結果
rownames(Games.Howell) <- combn(a, 2, paste, collapse=":")
return(list(result1=result1, Games.Howell=Games.Howell))
}
}
当然也可以把代码下载到本地再读取。
若要使用Games-Howell方法进行多重比较,调用函数
<code>tukey(data, group, method="G") </code>
即可,其中data为值,即连续变量;group为名义变量,即分类变量;method=”G”告诉函数使用Games-Howell方法进行多重比较。
分析结果跟SPSS结果差异不大,这份代码用起来没什么大问题。
tukey(data, group, method=”G”),data是指dataframe,group是IV分组,不用DV嘛?我跑不出来说找不到group55