比率の差の多重比較(対比較) Last modified: Apr 15, 2004
目的
比率の差の多重比較(Ryan 法,Tukey 法)を行う
使用法
p.multi.comp(n, r, alpha=0.05, method=c("ryan", "tukey"))
引数
n 各群の例数
r 各群の陽性数
alpha 有意水準
method 方法(省略時は Ryan 法)
ソース
インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/p_multi_comp.R", encoding="euc-jp")
# ライアンの方法とチューキーの方法による比率の対比較
p.multi.comp <- function( n, # 標本サイズ
r, # 陽性サイズ
alpha=0.05, # 有意水準
method=c("ryan", "tukey")) # 方法
{
printf <- function(fmt, ...)
{
cat(sprintf(fmt, ...))
}
check <- function(s, b) # 検定しようとしている二群が,それまでに有意でないとされた二群に挟まれているか
{
if (ns.n > 1) {
for (i in 1:ns.n) {
if (ns.s[i] <= s && s <= ns.b[i] && ns.s[i] <= b && b <= ns.b[i]) {
return(FALSE) # 検定するまでもなく有意でないとする
}
}
}
return(TRUE) # 検定しなくてはならない
}
k <- length(n) # 群の数
stopifnot(k == length(r), k == length(n), n > 0, r >= 0, r <= n, floor(n) == n, floor(r) == r)
method <- match.arg(method) # 引数の補完
o <- order(r/n) # 標本比率の大きさの順位
sr <- r[o]
sn <- n[o]
sr.sn <- sr/sn # 割合
num.significant <- ns.n <- 0
ns.s <- ns.b <- numeric(k*(k-1)/2) # 有意でない群の記録用
for (m in k:2) {
for (small in 1:(k-m+1)) {
big <- small+m-1
if (check(small, big)) {
prop <- sum(sr[small:big]) / sum(sn[small:big]) # 推定母比率
se <- sqrt(prop*(1-prop)*(1/sn[small]+1/sn[big])) # 標準誤差
diff <- sr.sn[big]-sr.sn[small] # 比率の差
if (method == "ryan") { # Ryan の方法
nominal.alpha <- 2*alpha/(k*(m-1)) # 名義的有意水準
rd <- se*qnorm(nominal.alpha/2, lower.tail=FALSE) # 差があると見なせる差の大きさ
z <- if (se == 0) 0 else diff/se
p <- pnorm(z, lower.tail=FALSE)*2
result <- p <= nominal.alpha
}
else { # Tukey の方法
if (m == k) { # 最大群と最小群の比較のとき
qq <- q <- qtukey(alpha, k, Inf, lower.tail=FALSE)
}
else { # 上記以外の群の比較のとき
qq <- (q+qtukey(alpha, m, Inf, lower.tail=FALSE))/2
}
WSD <- se*qq/sqrt(2)
result <- diff != 0 && diff >= WSD
}
if (result) { # 有意であるとき
num.significant <- 1
printf("p[%2i]=%7.5f vs. p[%2i]=%7.5f : diff.= %7.5f, ",
o[small], sr.sn[small], o[big], sr.sn[big], diff)
if (method == "ryan") {
printf("RD=%7.5f : P=%7.5f, alpha'=%7.5f\n", rd, p, nominal.alpha)
}
else {
printf("WSD=%7.5f\n", WSD)
}
}
else { # 有意でないとき
ns.n <- ns.n+1
ns.s[ns.n] <- small
ns.b[ns.n] <- big
}
}
}
}
if (num.significant == 0) { # 有意差のある群は一つもなかった
print("Not significant at all.")
}
}
使用例
p.multi.comp(c(30, 35, 47, 21, 45), c(2, 4, 14, 13, 39), method="ryan")
p.multi.comp(c(30, 35, 47, 21, 45), c(2, 4, 14, 13, 39), method="tukey")
出力結果例
> p.multi.comp(c(30, 35, 47, 21, 45), c(2, 4, 14, 13, 39), method="ryan")
p[ 1]=0.06667 vs. p[ 5]=0.86667 : diff.= 0.80000, RD=0.32472 : P=0.00000, alpha'=0.00500
p[ 1]=0.06667 vs. p[ 4]=0.61905 : diff.= 0.55238, RD=0.33341 : P=0.00001, alpha'=0.00667
p[ 2]=0.11429 vs. p[ 5]=0.86667 : diff.= 0.75238, RD=0.30528 : P=0.00000, alpha'=0.00667
p[ 1]=0.06667 vs. p[ 3]=0.29787 : diff.= 0.23121, RD=0.23054 : P=0.00979, alpha'=0.01000
p[ 2]=0.11429 vs. p[ 4]=0.61905 : diff.= 0.50476, RD=0.32612 : P=0.00007, alpha'=0.01000
p[ 3]=0.29787 vs. p[ 5]=0.86667 : diff.= 0.56879, RD=0.26479 : P=0.00000, alpha'=0.01000
p[ 3]=0.29787 vs. p[ 4]=0.61905 : diff.= 0.32118, RD=0.29877 : P=0.01239, alpha'=0.02000
> p.multi.comp(c(30, 35, 47, 21, 45), c(2, 4, 14, 13, 39), method="tukey")
p[ 1]=0.06667 vs. p[ 5]=0.86667 : diff.= 0.80000, WSD=0.31555
p[ 1]=0.06667 vs. p[ 4]=0.61905 : diff.= 0.55238, WSD=0.32546
p[ 2]=0.11429 vs. p[ 5]=0.86667 : diff.= 0.75238, WSD=0.29800
p[ 1]=0.06667 vs. p[ 3]=0.29787 : diff.= 0.23121, WSD=0.22695
p[ 2]=0.11429 vs. p[ 4]=0.61905 : diff.= 0.50476, WSD=0.32104
p[ 3]=0.29787 vs. p[ 5]=0.86667 : diff.= 0.56879, WSD=0.26067
p[ 3]=0.29787 vs. p[ 4]=0.61905 : diff.= 0.32118, WSD=0.30102
解説ページ
直前のページへ戻る
E-mail to Shigenobu AOKI