傾向性検定(ヨンキー検定)について。
【目次】
Jonckheere-Terpstra trend test(ヨンクヒール-タプストラ検定、またはヨンキー検定)は目的変数が連続値の時に使用できる傾向性検定。
目的変数が割合の場合は Cochran-Armitage trend test(コクラン-アミテージ検定)を使用。
帰無仮説、対立仮設
- 帰無仮説
- 対立仮設
ヨンキー検定は中央値を用いるノンパラメトリックな手法です。
対立仮説が「<」ではなく「<=」であるため、A=B<=CでもA<=B=Cでも有意になる可能性があります。
計算式等
JT統計量は、水準間の総当たり戦(ただし、i < jの組み合わせのみ)。勝ち数と引き分け数(0.5倍)を総和したものが統計量となる。
ただし、タイ(同一順位)を考慮して、分散を次のとおり算出する方法がある。
SAS社のアルゴリズムはこちらのよう(ホームページ見る限り)。
A~Cにある はデータの頻度の総和。
例えば {10,10,11,12,16} であれば、 {,
,
,
} となる。この例では10が2つあるので、
になるのが特徴。
計算例
簡単なデータを使って手順を確認。
今回は簡単のため、グループ1~3に4つずつ、計12個のデータ。
g1{11, 13, 10, 11}
g2{15, 12, 10, 11}
g3{20, 20, 16, 19}
先にExcelにまとめたものを掲載。
JT統計量:
グループの順序が i < j の組み合わせのみで大小比較するため、今回の3グループ(g1、g2、g3)では、g1 vs. g2()、g1 vs. g3(
)、g2 vs. g3(
) の3つが比較対象。
例えば のg1{11} vs. g2{15,12,10,11} では、{勝ち、勝ち、負け、引き分け}になるため、1+1+0+1×0.5=2.5となる(図Excel F2:H6)。
これら個々の勝敗を足し合わせたものが JT統計量(図Excel Q9)。
2.5 + 1 + 3.5 + 2.5 + 4 + 4+ 4 + 4 + 4 + 4+ 4 + 4 = 41.5
タイの補正:
データ全体で、10に2つ、11に3つ、20に2つの同値がある。
タイを補正する場合、分散の式中の が役割を担う(図Excel J9:N16、Q12:Q14)。
なお、図のとおり、タイがない値は d(d-1) = 1×(1-1) = 0 でゼロになるため、タイのみ考慮されることが分かる。
期待値・分散、z値・p値:
公式のとおり計算を行うと次の結果が得られる(図Excel Q11:R18)。
今回の架空データでは、TRT01P=1→2→3の順で観測値(AVAL)が増加する傾向があった(p for trend < 0.01)と結論付けられそう(タイ補正の有無問わず)。
Excelの関数の中身はこちら。
Rでの実行:
PMCMRplusとclinfunの2パッケージを見つけたのでこれらを試す。
> ADS1 <- data.frame(AVAL=c(11,13,10,11,15,12,10,11,20,20,16,19)
+ , TRT01PN=c(1,1,1,1,2,2,2,2,3,3,3,3))
> ADS1$TRT01PF <- factor(ADS1$TRT01PN, levels = c("1","2","3"))
>
> #-- PMCMRplu タイ補正あり
> library(PMCMRplus)
> jonckheereTest(ADS1$AVAL, ADS1$TRT01PF, alternative="greater")
Jonckheere-Terpstra test
data: ADS1$AVAL and ADS1$TRT01PF
z = 2.5915, p-value = 0.004778
alternative hypothesis: greater
sample estimates:
JT
41.5
警告メッセージ:
jonckheereTest.default(ADS1$AVAL, ADS1$TRT01PF, alternative = "greater") で:
Ties are present. Jonckheere z was corrected for ties.
> #-- clinfun タイ補正なし
> library(clinfun)
> jonckheere.test(ADS1$AVAL, ADS1$TRT01PN, alternative="increasing")
Jonckheere-Terpstra test
data:
JT = 41.5, p-value = 0.005207
alternative hypothesis: increasing
警告メッセージ:
jonckheere.test(ADS1$AVAL, ADS1$TRT01PN, alternative = "increasing") で:
Sample size > 100 or data with ties
p-value based on normal approximation. Specify nperm for permutation p-value
両パッケージともJT統計量=41.5で同値だが、
PMCMRplusはタイ補正ありの p=0.004778、
clinfunはタイ補正なしの p=0.005207 と一致(タイがない場合は、p値は同じ)。
SASでの実行:
タイ補正ありの結果が得られる。増減を見たいので片側検定の結果を見る。
data ads;
do AVAL=11,13,10,11; TRT01PN=1; output; end;
do AVAL=15,12,10,11; TRT01PN=2; output; end;
do AVAL=20,20,16,19; TRT01PN=3; output; end;
run;
proc sort data=ads: by TRT01PN AVAL; run;
proc freq data=ads;
tables TRT01PN * AVAL / jt;
exact jt;
output out=OutputDS jt;
run;
プログラムコード
■ Rのコード
library(PMCMRplus) #-- タイ補正あり
jonckheereTest(ADS1$AVAL, ADS1$TRT01PF, alternative=c("greater","less"))
library(clinfun) #-- タイ補正なし
jonckheere.test(ADS1$AVAL, ADS1$TRT01PN, alternative=c("decreasing","increasing"))
■ SASのコード
proc freq data=[InputDS];
tables GROUP * AVAL / jt; /* 群*測定値の順序にする。*/
exact jt; /* 正確検定する場合設定。*/
output out=[OutputDS] jt; /* _JT_,Z_JTを取得。XPR_JTは正確確率(右側)*/
run;
■ Pythonのコード
整備中
ヨンキー検定とケンドールの順位相関
ヨンキー検定はケンドールの順位相関と同じ考え方のよう。
実行してみると、z値、p値ともにタイ補正ありの式と同値だった。
■ ケンドールの順位相関
> cor.test(ADS1$TRT01PN, ADS1$AVAL, method="kendall", alternative="greater")
Kendall's rank correlation tau
data: ADS1$TRT01PN and ADS1$AVAL
z = 2.5915, p-value = 0.004778
alternative hypothesis: true tau is greater than 0
sample estimates:
tau
0.6468186
警告メッセージ:
cor.test.default(ADS1$TRT01PN, ADS1$AVAL, method = "kendall", で:
タイのため正確な p 値を計算することができません
参考
Tao Xu, Jonckheere-Terpstra test
Programming Documentetion, SAS