マクネマー検定の多重比較

pairwise.prop.test関数やpairwise.t.test関数、pairwise.wilcox.test関数みたいなことをマクネマー検定でやりたい。
クラスカル・ウォリス検定フリードマン検定からの多重比較については群馬大の青木先生の関数が存在するけど、マクネマー検定版は無いみたいだ。
となれば、自分で作るしかない。

pairwise.mcnemar.test <- function(X, p.adjust.method=p.adjust.methods){
	method <- "Pairwise comparisons using McNemar's Chi-squared Tests"
	p.adjust.method <- match.arg(p.adjust.method)
	X <- subset(X, complete.cases(X))	# 欠損値を持つケースを除く
	cols <- ncol(X)				#刺激の数
	nop <- choose(cols, 2)		#対の数(number of pairs)
	p.value <- numeric(nop)		#P値の容器を用意する
	ap <- combn(1:cols, 2)		#全ての対の数字(all pairs)
	for (i in 1:nop) p.value[i] <- mcnemar.test(X[, ap[1, i]], X[, ap[2, i]])$p.value
	p.value <- round(p.adjust(p.value, p.adjust.method), 6)	#P値の調整
	names(p.value) <- combn(colnames(X), 2, paste, collapse=":")#組み合わせ名
	p.value <- data.frame(p.value)
	ans <- list(method=method, p.value=p.value, p.adjust.method = p.adjust.method)
	ans
}


使い方はこんな調子で。実用本位なのでアウトプットが無愛想なのは御勘弁を。

# 実験用データ準備 ここから
YN <- c("Yes","No")
N <- 200
P <-sample(YN, N, replace=TRUE, prob=c(0.1, 0.9))
Q <-sample(YN, N, replace=TRUE, prob=c(0.2, 0.8))
R <-sample(YN, N, replace=TRUE, prob=c(0.3, 0.7))
S <-sample(YN, N, replace=TRUE, prob=c(0.4, 0.6))
T <-sample(YN, N, replace=TRUE, prob=c(0.5, 0.5))
X <- data.frame(P, Q, R, S, T)
# 実験用データ準備 ここまで

pairwise.mcnemar.test(X) #デフォルトはHolmの方法
pairwise.mcnemar.test(X, p.adj="none") #調整無し