在R语言中进行Games-Howell检验

主要参考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结果差异不大,这份代码用起来没什么大问题。

1 thought on “在R语言中进行Games-Howell检验”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.