# 関数定義 # 引数: file データファイル名 # cochran Cochran の方法を採用するとき TRUE に設定 # デフォールトでは Mantel-Haenszel の方法により計算 # Cochran.Mantel.Haenszel <- function(file, cochran = FALSE) { data <- read.table(file, header=TRUE) attach(data) n1 <- n11+n12 n2 <- n21+n22 p1 <- n11/n1 p2 <- n21/n2 n <- n1+n2 p.bar <- (n11+n21)/n if (cochran) { d <- (p1-p2)/(p.bar*(1-p.bar)) w <- p.bar*(1-p.bar)*n1*n2/n } else { d <- (p1-p2)/(p.bar*(1-p.bar))*(n-1)/n w <- p.bar*(1-p.bar)*n1*n2/(n-1) } s.w <- sum(w) s.wd <- sum(w*d) d.bar <- s.wd/s.w SE.d.bar <- 1/sqrt(s.w) cat("標準差(standardized difference)の推定値 =", d.bar, "\n") cat("推定値の標準誤差 =", SE.d.bar, "\n\n") if (cochran == FALSE) { cat("見込み比の推定値 =", sum(n1*n2*p1*(1-p2)/n) / sum(n1*n2*p2*(1-p1)/n), "\n\n") } chi.sq.total <- sum(w*d*d) chi.sq.homog <- chi.sq.total-s.wd^2/s.w chi.sq.assoc <- (d.bar / SE.d.bar)^2 name <- c("total", "homogenity", "association") value <- c(chi.sq.total, chi.sq.homog, chi.sq.assoc) df <- c(length(d), length(d)-1, 1) p <- pchisq(value, df, lower = FALSE) data.frame(source=name, chi.sq.=value, d.f.=df, p.value=p) }
データファイル 各研究ごとに一行ずつ,以下の4つの数値を入力 最初の行は“n11 n12 n21 n22”であること 陽性数 陰性数 群1 n11 n12 群2 n21 n22 ===== データファイル(cmh.data)開始 ===== n11 n12 n21 n22 38 67 33 72 56 136 61 113 43 102 33 112 ===== データファイル(cmh.data)終了 =====
使用例 > Cochran.Mantel.Haenszel("cmh.data") 標準差(standardized difference)の推定値 = 0.04637281 推定値の標準誤差 = 0.1477957 見込み比の推定値 = 1.047385 source chi.sq. d.f. p.value 1 total 3.7588369 3 0.2887105 2 mohogenity 3.6603897 2 0.1603823 3 association 0.0984472 1 0.7537011 > Cochran.Mantel.Haenszel("cmh.data",cochran=TRUE) 標準差(standardized difference)の推定値 = 0.04653455 推定値の標準誤差 = 0.1480532 source chi.sq. d.f. p.value 1 total 3.77149801 3 0.2872188 2 mohogenity 3.67270745 2 0.1593976 3 association 0.09879056 1 0.7532859