裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

PowerDivergenceTest--(5) まとめ

2021年07月07日 | ブログラミング

using HypothesisTests

PowerDivergenceTest() が返すもの

x = [16 12 36
     12  5 20
     15 11 24
      9  2  1];

obj = PowerDivergenceTest(x);

REPL の場合や println(obj) では,検定結果のまとめが出力される。

指定された lambda の値により,検定の名前が 1 行目に表示される。

#=
Pearson's Chi-square Test
-------------------------
Population details:
    parameter of interest:   Multinomial Probabilities
    value under h_0:         [0.125259, 0.0724152, 0.0978584, 0.023486, 0.0722647, 0.041778, 0.0564568, 0.0135496, 0.195115, 0.112801, 0.152433, 0.036584]
    point estimate:          [0.0981595, 0.0736196, 0.0920245, 0.0552147, 0.0736196, 0.0306748, 0.0674847, 0.0122699, 0.220859, 0.122699, 0.147239, 0.00613497]
    95% confidence interval: [(0.0307, 0.1668), (0.0061, 0.1423), (0.0245, 0.1607), (0.0, 0.1239), (0.0061, 0.1423), (0.0, 0.0994), (0.0, 0.1362), (0.0, 0.0809), (0.1534, 0.2895), (0.0552, 0.1914), (0.0798, 0.2159), (0.0, 0.0748)]

Test summary:
    outcome with 95% confidence: reject h_0
    one-sided p-value:           0.0330

Details:
    Sample size:        163
    statistic:          13.713423881146099
    degrees of freedom: 6
    residuals:          [-0.977568, 0.0571418, -0.238096, 2.64327, 0.0643514, -0.693532, 0.592554, -0.140357, 0.744097, 0.376286, -0.169847, -2.03246]
    std. residuals:     [-1.52004, 0.078758, -0.346528, 3.32797, 0.0914118, -0.873259, 0.787863, -0.161439, 1.34615, 0.603412, -0.287607, -2.97724]
=#

PowerDivergenceTest(x) の結果は,PowerDivergenceTest という型を持つ。

typeof(obj) # PowerDivergenceTest

'? obj' で,その内容を見ることができる。

obj は以下の名前の要素を持つ。

#=
lambda       :: Float64
theta0       :: Vector{Float64}
stat         :: Float64
df           :: Int64
observed     :: Matrix{Int64}
n            :: Int64
thetahat     :: Vector{Float64}
expected     :: Matrix{Float64}
residuals    :: Matrix{Float64}
stdresiduals :: Matrix{Float64}
=#

obj.xxx で,その要素を表示することができる。

使用された λ の値; obj.lambda

obj.lambda # 1.0

帰無仮説の下での各セルの確率; 'value under h_0'; obj.theta0

obj.theta0 # 要素数 12 のベクトル
#=
12-element Vector{Float64}:
 0.12525876020926643
 0.07241522074598215
 0.0978584064134894
 0.023486017539237458
 0.07226466935149986
 0.04177801196883586
 0.056456772930859274
 0.013549625503406226
 0.19511460724904964
 0.11280063231585684
 0.15243328691332003
 0.03658398885919681
=#

行列に直して表示すると以下のようになる。

pij = reshape(obj.theta0, size(x))
#=
4×3 Matrix{Float64}:
 0.125259   0.0722647  0.195115
 0.0724152  0.041778   0.112801
 0.0978584  0.0564568  0.152433
 0.023486   0.0135496  0.036584
=#

これは,行和,列和,サンプルサイズから計算される。

行和

rowsum = sum(x, dims=2)
#=
4×1 Matrix{Int64}:
 64
 37
 50
 12
=#

列和

colsum = sum(x, dims=1)
#=
1×3 Matrix{Int64}:
 52  30  81
=#

サンプルサイズ; obj.n

obj.n # 163

n = sum(x) # 163

帰無仮説(二変数は独立)により,各セルの確率は,周辺確率の外積である。

pij = (rowsum ./ n) * (colsum ./ n)
#=
4×3 Matrix{Float64}:
 0.125259   0.0722647  0.195115
 0.0724152  0.041778   0.112801
 0.0978584  0.0564568  0.152433
 0.023486   0.0135496  0.036584
=#

期待値; obj.expected

obj.expected
#=
4×3 Matrix{Float64}:
 20.4172   11.7791   31.8037
 11.8037    6.80982  18.3865
 15.9509    9.20245  24.8466
  3.82822   2.20859   5.96319
=#

期待値はサンプルサイズと各セルの確率を掛けたものである。

eij = n .* pij
#=
4×3 Matrix{Float64}:
 20.4172   11.7791   31.8037
 11.8037    6.80982  18.3865
 15.9509    9.20245  24.8466
  3.82822   2.20859   5.96319
=#

各セルの確率; 'point estimate'; obj.thetahat
観察数をサンプルサイズで割ったものである。

reshape(obj.thetahat, size(x))
#=
4×3 Matrix{Float64}:
 0.0981595  0.0736196  0.220859
 0.0736196  0.0306748  0.122699
 0.0920245  0.0674847  0.147239
 0.0552147  0.0122699  0.00613497
=#

x ./ n
#=
4×3 Matrix{Float64}:
 0.0981595  0.0736196  0.220859
 0.0736196  0.0306748  0.122699
 0.0920245  0.0674847  0.147239
 0.0552147  0.0122699  0.00613497
=#

検定統計量; 'statistic'; obj.stat

obj.stat # 13.713423881146099

sum((x .- eij) .^ 2 ./ eij) # 13.713423881146104

自由度; 'degrees of freedom'; obj.df

obj.df # 6

nrow, ncol = size(x) # (4, 3)
(nrow - 1) * (ncol - 1) # 6

残差; 'residuals'; obj.residuals

obj.residuals
#=
4×3 Matrix{Float64}:
 -0.977568    0.0643514   0.744097
  0.0571418  -0.693532    0.376286
 -0.238096    0.592554   -0.169847
  2.64327    -0.140357   -2.03246
=#

これを,「標準化残差」とする場合もある。

residuals = (x .- eij) ./ sqrt.(eij)
#=
4×3 Matrix{Float64}:
 -0.977568    0.0643514   0.744097
  0.0571418  -0.693532    0.376286
 -0.238096    0.592554   -0.169847
  2.64327    -0.140357   -2.03246
=#

残差の二乗和は検定統計量である。sum((x .- eij) .^ 2 ./ eij) と同じ

sum(residuals .^ 2) # 13.713423881146102

標準化残差(調整された残差); 'std. residuals'; obj.stdresiduals

obj.stdresiduals
#=
4×3 Matrix{Float64}:
 -1.52004    0.0914118   1.34615
  0.078758  -0.873259    0.603412
 -0.346528   0.787863   -0.287607
  3.32797   -0.161439   -2.97724
=#

PowerDivergenceTest では,以下のようにして標準化残差を計算する。

V = [(colsum[j]/n) * (rowsum[i]/n) * (1 - rowsum[i]/n) * (n - colsum[j]) for i in 1:nrow, j in 1:ncol]
#=
4×3 Matrix{Float64}:
 8.44459  5.83748  9.71743
 6.21349  4.29519  7.15004
 7.53029  5.20545  8.66532
 2.41503  1.66943  2.77904
=#

stdresiduals = (x .- eij) ./ sqrt.(V)
#=
4×3 Matrix{Float64}:
 -1.52004    0.0914118   1.34615
  0.078758  -0.873259    0.603412
 -0.346528   0.787863   -0.287607
  3.32797   -0.161439   -2.97724
=#

残差のことを「標準化残差」と呼ぶ場合には,PowerDivergenceTest での標準化残差は,「調整された残差」と呼ぶ。

調整された残差; adjusted residuals

この「調整された残差」と PowerDivergenceTest での標準化残差は同じものである。

adjresiduals = residuals ./ sqrt.((1 .- rowsum/n) * (1 .- colsum/n))
#=
4×3 Matrix{Float64}:
 -1.52004    0.0914118   1.34615
  0.078758  -0.873259    0.603412
 -0.346528   0.787863   -0.287607
  3.32797   -0.161439   -2.97724
=#

それぞれは標準正規分布に従うので,両側確率を求める。

using Rmath
2pnorm.(abs.(adjresiduals), false)
#=
4×3 Matrix{Float64}:
 0.1285      0.927165  0.178255
 0.937225    0.382522  0.546235
 0.728946    0.430777  0.773648
 0.00087482  0.871748  0.00290857
=#

p 値は obj に含まれないが,pvalue(obj) によって求める。

p = pvalue(obj) # 0.03300644487225656

なお,検定結果の表示においては 'one-sided p-value' とされているが,これは単に 'p-value' とすべきものである。

他に confint(obj) により各セルの確率の信頼限界を求めることができる。'point estimate' の '95% confidence interval'

reshape(confint(obj), size(x))
#=
4×3 Matrix{Tuple{Float64, Float64}}:
 (0.0306748, 0.166838)   (0.00613497, 0.142298)  (0.153374, 0.289537)
 (0.00613497, 0.142298)  (0.0, 0.0993534)        (0.0552147, 0.191378)
 (0.0245399, 0.160703)   (0.0, 0.136163)         (0.0797546, 0.215918)
 (0.0, 0.123893)         (0.0, 0.0809485)        (0.0, 0.0748135)
=#

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PowerDivergenceTest--(4) 尤度比検定,多項尤度比検定,MultinomialLRTest

2021年07月07日 | ブログラミング

尤度比検定 MultinomialLRTest

using HypothesisTests

output(obj) = println("statistic = $(obj.stat),  df = $(obj.df),  p value = $(pvalue(obj))")

MultinomialLRTest(x[, y][, theta0 = ones(length(x))/length(x)])

PowerDivergenceTest(x[, y]; lambda = 1.0, theta0 = ones(length(x))/length(x))
と同じである。

★ 独立性の検定

x = [11 6; 7 14];

☆ いわゆる χ2 検定

obj1 = PowerDivergenceTest(x); # lambda=1.0 はデフォルト
output(obj1) # statistic = 3.708932461873637,  df = 1,  p value = 0.05412199588766715

obj2 = ChisqTest(x);
output(obj2) # statistic = 3.708932461873637,  df = 1,  p value = 0.05412199588766715

☆ いわゆる G2 検定

lambda=0.0 と指定する(lamda=0 とするとエラーになる)

obj3 = PowerDivergenceTest(x; lambda=0.0);
output(obj3) # statistic = 3.7658347787910724,  df = 1,  p value = 0.052309741049692396

obj4 = MultinomialLRTest(x);
output(obj4) # statistic = 3.7658347787910724,  df = 1,  p value = 0.052309741049692396

★ 適合度検定

☆ 一様分布の適合度検定

y = [6, 2, 8, 5, 7, 4];

obj5 = MultinomialLRTest(y);
output(obj5) # statistic = 4.837751371341344,  df = 5,  p value = 0.4360006012340746

PowerDivergenceTest で lambda=0.0 と指定する(lambda=0 とするとエラーになる)

obj6 = PowerDivergenceTest(y, lambda=0.0);
output(obj6) # statistic = 4.837751371341344,  df = 5,  p value = 0.4360006012340746

☆ 理論比を指定する適合度検定

z = [61, 22, 17, 8];

obj7 = MultinomialLRTest(z, [9, 3, 3, 1]./16);
output(obj7) # statistic = 0.9184597355286179,  df = 3,  p value = 0.8209709190369885

PowerDivergenceTest で lambda=0.0 と指定する(lambda=0 とするとエラーになる)

obj8 = PowerDivergenceTest(z, theta0=[9, 3, 3, 1]./16, lambda=0.0);
output(obj8) # statistic = 0.9184597355286179,  df = 3,  p value = 0.8209709190369885

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村