【統計】マンテル・ヘンツェルの検定(Mantel-Haenszel test, Cochran-Mantel-Haenszel test)

マンテル・ヘンツェルの検定(Mantel-Haenszel test)について。

【目次】

 

マンテル・ヘンツェルの検定は、 \chi^{2} 検定やFisher's Exact testと同じく、カテゴリーデータの独立性を評価する手法であり、多層のクロス表の層別解析を行うことができる。

この検定は、Mantel and Haenszel (1959) が開発した手法。
同様の方法を Cochran (1954) も提案しており、彼らの名前から Cochran-Mantel-Haenszel test(CMH検定)とも呼ばれる。
本記事では、マンテル・ヘンツェルの検定と呼称。

 

帰無仮説、対立仮設


 ※OR=Odds Rate(オッズ比)、k=Subgroup(層別因子)

 

計算式等


次のクロス表が k層あると仮定して考える。

■ 観測度数

  Outcome Total
(+) (-)
Factor 1 a b AB
2 c d CD
Total AC BD N

  

 \chi _{MH}^{2} 統計量(CMH統計量とも言う) :

\quad \chi _{MH}^{2}=\dfrac{\left(| \sum \left( a_{i}-\dfrac{AB_{i}×AC_{i}}{N_{i}}\right)| - Correct \right) ^{2}}{\sum \left( \dfrac{AB_{i}×CD_{i}×AC_{i}×BD_{i}}{N_{i}^{3} - N_{i}^{2}}\right) }

 

共通オッズ比(Common OR) :

\quad \widehat{OR}_{MH}=\dfrac{\sum \left( \dfrac{a_{i}× d_{i}}{Ni}\right) }{\sum \left( \dfrac{b_{i} × c_{i}}{Ni}\right) }

 

共通オッズ比の信頼区間 :

\quad \widehat{OR_{MH}}\times{ exp \left(±1 \times z_{1 - \alpha/2} \times \sqrt{Var\left( logOR_{MH} \right)}\ \right)}

\quad \widehat{OR_{MH}}\times{ exp \left(±1 \times 1.96 \times \sqrt{Var\left( logOR_{MH} \right)}\ \right)} ※95%信頼区間

 ただし、

\quad Var\left( logOR_{MH} \right) = \dfrac{\sum \left( A_{i}×C_{i} \right)}{2\left( \sum C_{i}\right) ^{2}} + \dfrac{\sum \left( A_{i}\times D_{i}+B_{i}\times C_{i}\right) }{2\left( \sum C_{i}\right) \left( \sum D_{i}\right)} + \dfrac{\sum \left( B_{i}\times D_{i}\right) }{2\left( \sum D_{i}\right) ^{2}}

\quad A = \dfrac{a + d}{n},\ B = \dfrac{b + c}{n},\ C = \dfrac{a \times d}{n},\ D = \dfrac{b \times c}{n}

 \chi _{MH}^{2} 統計量や共通オッズ比は、交絡因子で層別解析した結果を統計学的に併合したもの。この併合手法をマンテル・ヘンツェル法と言う。

  

計算例


簡単なデータで計算方法を確認。
年齢で層別化した遺伝子Xと病気Yのクロス集計表(架空データ)を用いる。
(年齢を交絡因子として扱う)

■ 観測度数 

年齢 遺伝子X 病気Y Total
(+) (-)
< 40 10 40 50
  50 100 150
  Total 60 140 200
40-59 150 50 200
  50 20 70
  Total 200 70 270
60 < 50 50 100
  50 50 100
  Total 100 100 200
All 210 140 350
  150 170 320
  Total 360 310 670

 

今回の架空データの全体表について単純に  χ^{2} 検定を行うと、  χ^{2}=11.0612,\ p=0.000882 となり、遺伝子Xと病気Yの間に有意な関係がありそうだという結論になる。 

マンテル・ヘンツェルの検定を行ってみる。
Excel でデータを横持ちにして、層別解析したものが次の図。

f:id:cochineal19:20201209221310p:plain

マンテル・ヘンツェルの検定(CMH検定)

 \chi _{MH}^{2} 統計量および  \chi^{2} 検定(自由度=1)による p値:

\quad \chi_{MH}^{2} = 0.2301 \left( p=0.63142 \right)(連続修正あり)
\quad \chi_{MH}^{2} = 0.3252 \left( p=0.56847 \right)(連続修正なし)

共通オッズ比、およびその95%信頼区間

\quad \widehat{OR}_{MH} = 0.900875 [ 0.6296054,\ 1.2890219]

 

全体表の  χ^{2} 検定で有意だった結果から一変して、マンテル・ヘンツェルの検定(年齢で調整したデータ全体の独立性検定)では p値が0.05を上回り、統計学的に有意ではないという結論になった。
共通オッズ比も1を下回り、95%信頼区間も1を挟んでいるため、遺伝子Xと病気Yの間に有意な関係性を見出すことはできない。

今回の場合、例えば40-59歳は遺伝子Xの有無問わず病気Yの発生が多いと見られるため、遺伝子Xに直接の要因はなく、年齢やそれに伴う生活習慣などが要因にあたるのかもしれない。

このように、コントロール可能な交絡因子が考えられる場合、単に  \chi^{2} 検定やFisher's exact 検定をするのでなく、層別解析を行うことはとても有用。

 

Rでの実行:

> mymtx1 <- matrix(c( 10, 40, 50, 100), nrow=2, byrow=TRUE)
> mymtx2 <- matrix(c(150, 50, 50,  20), nrow=2, byrow=TRUE)
> mymtx3 <- matrix(c( 50, 50, 50,  50), nrow=2, byrow=TRUE)
> mymtx  <- array(c(mymtx1, mymtx2, mymtx3), dim=c(2,2,3))
> 
> mantelhaen.test(mymtx, correct=T)

	Mantel-Haenszel chi-squared test with continuity correction

data:  mymtx
Mantel-Haenszel X-squared = 0.23013, df = 1, p-value = 0.6314
alternative hypothesis: true common odds ratio is not equal to 1
95 percent confidence interval:
 0.6296054 1.2890219
sample estimates:
common odds ratio 
        0.9008746 

> mantelhaen.test(mymtx, correct=F)

	Mantel-Haenszel chi-squared test without continuity correction

data:  mymtx
Mantel-Haenszel X-squared = 0.32524, df = 1, p-value = 0.5685
alternative hypothesis: true common odds ratio is not equal to 1
95 percent confidence interval:
 0.6296054 1.2890219
sample estimates:
common odds ratio 
        0.9008746 


SASでの実行:

data ads;
input AGEGR1N GENOTYPE OUTCOME CNT @@;
datalines;
1 0 0 10 1 1 0 50 1 0 1 40 1 1 1 100
2 0 0 150 2 1 0 50 2 0 1 50 2 1 1 20
3 0 0 50 3 1 0 50 3 0 1 50 3 1 1 50
;
run;
proc freq data=ads;
  table AGEGR1N * GENOTYPE * OUTCOME / cmh nocol nopercent;
  weight CNT / zeros;
run;

 f:id:cochineal19:20201219122514p:plain

 

プログラムコード


■ Rのコード

mantelhaen.test(mymtx, correct=T) #-- correct T:連続修正あり、F:連続修正なし

 

SASのコード

proc freq data=[InputDS];
  table Subgroup * Factor * Outcome / cmh nocol nopercent;
  weight Count / zeros;
output out=[OutputDS] cmh; run;
 

 

Pythonのコード

整備中

 

CochranとMantel and Haenszelの違い


Cochran (1954) の方法と Mantel and Haenszel (1959) の方法は統計量の計算に違いがあり、若干数値が異なるようだった。気にするレベルではない?
なお、RもSASも Mantel and Haenszelの統計量のようだった。

Mantel and Haenszelの統計量( \chi _{MH}^{2} 統計量)
<再掲>

\quad \chi _{MH}^{2}=\dfrac{\left(| \sum \left( a_{i}-\dfrac{AB_{i}×AC_{i}}{N_{i}}\right)| - Correct \right) ^{2}}{\sum \left( \dfrac{AB_{i}×CD_{i}×AC_{i}×BD_{i}}{N_{i}^{3} - N_{i}^{2}}\right) }

Cochranの統計量

\quad \chi _{cochran}^{2}=\dfrac{\sum \left( \dfrac{a_{i} \times d_{i} - b_{i} \times c_{i}}{N_{i}}\right) ^{2}}{\sum \left( \dfrac{AB_{i}×CD_{i}×AC_{i}×BD_{i}}{\left( N_{i} - 1 \right) \times N_{i}^{2}}\right) } 

 

参考


https://support.sas.com/documentation/onlinedoc/stat/121/freq.pdf

https://www.pharmasug.org/proceedings/2020/SA/PharmaSUG-2020-SA-051.pdf

https://www.annualreviews.org/doi/pdf/10.1146/annurev.pu.09.050188.001011

Cochran-Mantel-Haenszel Test with Breslow-Day & Tarone Correction

コクラン-マンテル-ヘンツェル検定とは - Minitab

 


サイトマップ

cochineal19.hatenablog.com

本ブログは個人メモです。 本ブログの内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。