Up

有意水準と期待効用

 

有意水準を、検定力との関係で決めるときは、統計的結論の効用は考慮されていない。結論の効用を考えた有意水準の検討を、期待効用の観点から試みる。

期待効用算出のために、以下の設定を行う。

 

: 帰無仮説が正しい確率

 第一種の誤りの確率、すなわち有意水準

 帰無仮説が正しいときに、効果有りと判断することの効用

 帰無仮説が正しいときに、効果無しと判断することの効用

 

: 対立仮説が正しい確率

 第二種の誤りの確率、すなわち: 検定力

 対立仮説が正しいときに、効果有りと判断することの効用

 対立仮説が正しいときに、効果無しと判断することの効用

 

簡単のために、検定統計量は正規分布に従うものとする(図1)。その後、F分布t分布カイ二乗分布の場合についても扱う。

 

図1

 

このとき、期待効用は有意水準の関数として、次式で表すことができる。

 

 

パラメータの幾つかのパターンについて、以下のように計算してみた。スクリプトは、リスト1に示すものである。スクリプトファイルなどは、まとめて圧縮ファイルoptalphafiles.zipとした。期待効用の合理的な観点からは、最適な有意水準としてパターン1では30.9%、パターン2では1.4%が得られた。

 

 

パターン1 最適な有意水準が30.9%となった例

 

図2に、使用した入力データファイルを示す。

 

図2

 

入力データファイルは、CSV形式のファイルで、表1に示す形式で用意されている。

 

表1

 

mu

sigma

Prob

Yes

No

帰無仮説

帰無仮説の

正規分布の

平均値

帰無仮説の

正規分布の

標準偏差

帰無仮説が

正しい確率

帰無仮説が

正しいときに

有意になった効用

帰無仮説が

正しいときに

有意でない効用

対立仮設

対立仮設の

正規分布の

平均値

対立仮設の

正規分布の

標準偏差

対立仮設が

正しい確率

対立仮設が

正しいときに

有意になった効用

対立仮設が

正しいときに

有意でない効用

 

2行目が帰無仮説についてのパラメータであり、3行目が対立仮設についてのパラメータである。

2列目に仮説に対応する正規分布の平均値を、3列目に標準偏差を書く。4列目にそれぞれの仮説が正しい(成り立っている)確率を書く。

5列目に、有意な結果が得られたときの効用、6列目に有意でない結果が得られたときの効用を設定する。

 

リスト1のスクリプトを実行すると、入力データファイル名の設定が求められる。

次の例では、図2のファイルsample.csvが設定されている。データファイルとスクリプトファイルは同じフォルダ内に置かれているものとする。

 

= RESTART: C:\*****\optalphafiles\utility_curve.py

Input data file (*.csv) = sample.csv

 

データファイル名を設定してEnterキーを押すと計算が始まり、計算結果が表示される(図3)。

 

図3

 

左側のグラフに期待効用値のグラフが最大値を与える値とともに表示されている。期待効用を最大にする有意水準は、であると示されている。

この有意水準の値は、通常用いられているものより高い値である。次のパターン2では、帰無仮説が正しいにもかかわらず有意差が認められたときの効用を高い負の効用として設定してみる。

 

 

パターン2 最適な有意水準が1.4%となった例

 

帰無仮説が正しいときに有意な差が出たときの効用を、大きい負の値に設定した(図4)。

 

図4

 

リスト1のスクリプトを実行して、図4のファイルを入力データファイルとすると、図5のグラフを得た。

 

図5

 

期待効用が最大となる有意水準が、であることが示されている。

 

 

 

F分布の場合

 

F分布の場合のグラフは、図6のようである。

 

図6

 

帰無仮説は非心度0のF分布で表されるが、対立仮設は非心度が正の値である非心F分布で表される。

 

このとき、期待効用は有意水準の関数として、次式で表すことができる(再掲)。

 

 

パラメータの幾つかのパターンについて、以下のように計算してみた。スクリプトは、リスト2に示すものである。スクリプトファイルなどは、まとめて圧縮ファイルoptalphafiles.zipとした。期待効用の合理的な観点からは、最適な有意水準としてパターン3では27.2%、パターン4では2.3%が得られた。

 

 

パターン3 最適な有意水準が27.2%となった例

 

図7に、使用した入力データファイルを示す。

 

図7

 

入力データファイルは、CSV形式のファイルで、表2に示す形式で用意されている。

 

表2

 

非心度

Prob

Yes

No

帰無仮説

このセルの値は用いない。空セルでよい

帰無仮説が

正しい確率

帰無仮説が

正しいときに

有意になった効用

帰無仮説が

正しいときに

有意でない効用

対立仮設

対立仮設の

非心度

対立仮設が

正しい確率

対立仮設が

正しいときに

有意になった効用

対立仮設が

正しいときに

有意でない効用

分子の自由度

df1

 

 

 

分母の自由度

df2

 

 

 

 

2行目が3列目以降に帰無仮説についてのパラメータが設定されている。

3行目が対立仮設についてのパラメータであり、2列目に非心度が設定されている。

2行目、3行目とも、3列目にそれぞれの仮説が正しい確率、4列目に有意な結果が得られたときの効用、5列目に有意な結果が得られなかったときの効用が設定されている。

4行目、5行目の2列目に自由度df1df2が設定されている。

る。

 

リスト2のスクリプトを実行すると、入力データファイル名の設定が求められる。

次の例では、図7のファイルFsample.csvが設定されている。データファイルとスクリプトファイルは同じフォルダ内に置かれているものとする。

 

= RESTART: C:\*****\optalphafiles\utility_curve.py

Input data file (*.csv) = Fsample.csv

 

データファイル名を設定してEnterキーを押すと計算が始まり、計算結果が表示される(図8)。

 

図8

 

左側のグラフに期待効用値のグラフが最大値を与える値とともに表示されている。期待効用を最大にする有意水準は、であると示されている。

この有意水準の値は、通常用いられているものより高い値である。次のパターン4では、帰無仮説が正しいにもかかわらず有意差が認められたときの効用を高い負の効用として設定してみた。

 

 

 

パターン4 最適な有意水準が2.3%となった例

 

帰無仮説が正しいときに有意な結果が得られたときの効用をとした設定を用意した(図9)。

 

図9

 

図9のファイルを入力データファイルとしてリスト2のスクリプトを実行すると、図10の結果を得た。

 

10

 

最適な有意水準としてを得た。

 

 

 

t分布の場合

 

t分布の場合のグラフは、図T1のようである。

 

T1

 

帰無仮説は非心度0のt分布で表されるが、対立仮設は非心度が正の値である非心t分布で表される。

 

このとき、期待効用は有意水準の関数として、次式で表すことができる(再掲)。

 

 

パラメータの幾つかのパターンについて、以下のように計算してみた。スクリプトは、リスト3に示すものである。スクリプトファイルなどは、まとめて圧縮ファイルoptalphafiles.zipとした。期待効用の合理的な観点からは、最適な有意水準としてパターンT1では31.8%、パターンT2では1.1%が得られた。

 

 

 

パターンT1 最適な有意水準が31.8%となった例

 

T2に、使用した入力データファイルを示す。

 

T

 

入力データファイルは、CSV形式のファイルで、表T1に示す形式で用意されている。

 

T1

 

パラメータ

Prob

Yes

No

帰無仮説

このセルの値は用いない。空セルでよい

帰無仮説が

正しい確率

帰無仮説が

正しいときに

有意になった効用

帰無仮説が

正しいときに

有意でない効用

対立仮設(nc)

対立仮設の

非心度

対立仮設が

正しい確率

対立仮設が

正しいときに

有意になった効用

対立仮設が

正しいときに

有意でない効用

自由度

df

 

 

 

 

2行目が3列目以降に帰無仮説についてのパラメータが設定されている。

3行目が対立仮設についてのパラメータであり、2列目に非心度が設定されている。

2行目、3行目とも、3列目にそれぞれの仮説が正しい確率、4列目に有意な結果が得られたときの効用、5列目に有意な結果が得られなかったときの効用が設定されている。

4行目の2列目に自由度dfが設定されている。

 

リスト3のスクリプトを実行すると、入力データファイル名の設定が求められる。

次の例では、図T2のファイルt_sample.csvが設定されている。データファイルとスクリプトファイルは同じフォルダ内に置かれているものとする。

 

= RESTART: C:\*****\optalphafiles\t_utility_curve.py

Input data file (*.csv) = t_sample.csv

 

データファイル名を設定してEnterキーを押すと計算が始まり、計算結果が表示される(図T3)。

 

T3

 

左側のグラフに期待効用値のグラフが最大値を与える値とともに表示されている。期待効用を最大にする有意水準は、であると示されている。

この有意水準の値は、通常用いられているものより高い値である。次のパターンT2では、帰無仮説が正しいにもかかわらず有意差が認められたときの効用を高い負の効用として設定してみた。

 

 

 

パターンT2 最適な有意水準が1.1%となった例

 

帰無仮説が正しいときに有意な結果が得られたときの効用をとした設定を用意した(図T4)。

 

T4

 

T4のファイルを入力データファイルとしてリスト3のスクリプトを実行すると、図T5の結果を得た。

 

T5

 

最適な有意水準としてを得た。

 

 

カイ二乗分布

 

カイ二乗分布の場合のグラフは、図C1のようである。

 

C1

 

帰無仮説は非心度0のカイ二乗分布(上のグラフ)で表されるが、対立仮設は非心度が正の値である非心カイ二乗分布(下のグラフ)で表される。

 

このとき、期待効用は有意水準の関数として、次式で表すことができる(再掲)。

 

 

パラメータの幾つかのパターンについて、以下のように計算してみた。スクリプトは、リスト4に示すものである。スクリプトファイルなどは、まとめて圧縮ファイルoptalphafiles.zipとした。期待効用の合理的な観点からは、最適な有意水準としてパターンC1では23.4%、パターンC2では2.5%が得られた。

 

 

パターンC1 最適な有意水準として23.4%を得た例

 

C2に、使用した入力データファイルを示す。

 

C

 

入力データファイルは、CSV形式のファイルで、表C1に示す形式で用意されている。

 

C1

 

パラメータ

Prob

Yes

No

帰無仮説

このセルの値は用いない。空セルでよい

帰無仮説が

正しい確率

帰無仮説が

正しいときに

有意になった効用

帰無仮説が

正しいときに

有意でない効用

対立仮設(nc)

対立仮設の

非心度

対立仮設が

正しい確率

対立仮設が

正しいときに

有意になった効用

対立仮設が

正しいときに

有意でない効用

自由度

df

 

 

 

 

2行目が3列目以降に帰無仮説についてのパラメータが設定されている。

3行目が対立仮設についてのパラメータであり、2列目に非心度が設定されている。

2行目、3行目とも、3列目にそれぞれの仮説が正しい確率、4列目に有意な結果が得られたときの効用、5列目に有意な結果が得られなかったときの効用が設定されている。

4行目の2列目に自由度dfが設定されている。

 

リスト4のスクリプトを実行すると、入力データファイル名の設定が求められる。

次の例では、図C2のファイルchi2_sample.csvが設定されている。データファイルとスクリプトファイルは同じフォルダ内に置かれているものとする。

 

= RESTART: C:\*****\optalphafiles\chi_utility_curve.py

Input data file (*.csv) = chi2_sample.csv

 

データファイル名を設定してEnterキーを押すと計算が始まり、計算結果が表示される(図C3)。

 

C3

 

左側のグラフに期待効用値のグラフが最大値を与える値とともに表示されている。期待効用を最大にする有意水準は、であると示されている。

この有意水準の値は、通常用いられているものより高い値である。次のパターンC2では、帰無仮説が正しいにもかかわらず有意差が認められたときの効用を高い負の効用として設定してみた。

 

 

パターンC2 最適な有意水準として2.5%を得た例

 

帰無仮説が正しいときに有意な結果が得られたときの効用をとした設定を用意した(図C4)。

 

C4

 

C4のファイルを入力データファイルとしてリスト4のスクリプトを実行すると、図C5の結果を得た。

 

C5

 

最適な有意水準としてを得た。

 

 

 

参考文献

岡本安晴「いまさら聞けないPythonでデータ分析」、2019、丸善出版

 

 

 

リスト1  正規分布の場合のスクリプト

 

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import scipy.stats as ss

 

 

class ExpectedUtil():

    """

            期待効用値算出クラス

    """

    def __init__(self, p_H0, p_H1, U0sig, U0nsig, U1sig, U1nsig,

                 mu0, sgm0, mu1, sgm1):

        self.p_H0 = p_H0

        self.p_H1 = p_H1

        self.U0sig = U0sig

        self.U0nsig = U0nsig

        self.U1sig = U1sig

        self.U1nsig = U1nsig

        self.mu0 = mu0

        self.sgm0 = sgm0

        self.mu1 = mu1

        self.sgm1 = sgm1

 

    def calc_criterion(self, a):

        return ss.norm.ppf(1.0-a, self.mu0, self.sgm0)

 

    def expectedU(self, p):

        a = p

        c = self.calc_criterion(a)

        b = ss.norm.cdf(c, self.mu1, self.sgm1)

        exp_util = self.p_H0 * (a * self.U0sig + (1 - a) * self.U0nsig) + \

                    self.p_H1 * ((1 - b) * self.U1sig + b * self.U1nsig)

        return exp_util

 

    def calc_beta(self, a):

        c = self.calc_criterion(a)

        return ss.norm.cdf(c, self.mu1, self.sgm1)

 

 

pd_df = pd.read_csv(input('Input data file (*.csv) = '))

print(pd_df)

vals = pd_df.values

print(vals)

 

mu0 = vals[0][1]

sgm0 = vals[0][2]

mu1 = vals[1][1]

sgm1 = vals[1][2]

p_H0 = vals[0][3] / (vals[0][3] + vals[1][3])

p_H1 = vals[1][3] / (vals[0][3] + vals[1][3])

U0sig = vals[0][4]

U0nsig = vals[0][5]

U1sig = vals[1][4]

U1nsig = vals[1][5]

 

 

plt.figure(figsize=(12,5))

 

plt.subplot(1,3,(1,2))      #   左2区画に期待効用曲線を描画

 

e_u = ExpectedUtil(p_H0, p_H1, U0sig, U0nsig, U1sig, U1nsig,

                   mu0, sgm0, mu1, sgm1)

 

ps = np.linspace(0.0001, 0.9999, 10000)

expected_utils = e_u.expectedU(ps)

 

ck_idx = np.argsort(-expected_utils)    #   最大値を与えるインデックス

opt_a = ps[ck_idx[0]]                   #   最大期待効用を与える有意水準

 

print('opt_a =\n', opt_a)

 

plt.plot(ps, expected_utils, label=f'Exp.U')

plt.plot([opt_a], [expected_utils[ck_idx[0]]], 'ro', markersize=16, lw=0,

         label=fr'opt-$\alpha$={opt_a:.3f}')

plt.xlabel(r'$\alpha$', fontsize= 18)

plt.ylabel('Expect.Utility', fontsize=18)

plt.legend()

plt.title(fr'$\mu0$={mu0}, $\sigma0$={sgm0}, p0={p_H0:.3f},' +

          f'U0sig={U0sig}, U0nsig={U0nsig}' + '\n' +

          fr'$\mu1$={mu1}, $\sigma1$={sgm1}, p1={p_H1:.3f},' +

          f'U1sig={U1sig}, U1nsig={U1nsig}', fontsize=16)

plt.tight_layout()

 

 

plt.subplot(1, 3, 3)                       #   αに対するβと検出力のグラフ

alphas = np.linspace(0.0001, 0.9999, 1000)

betas = e_u.calc_beta(alphas)

pwrs = 1.0 - betas

plt.plot(alphas, betas, label=r'$\beta$')

plt.plot(alphas, pwrs, label='power')

plt.plot(opt_a, e_u.calc_beta(opt_a), 'ro', markersize=12,

         label=fr'$\beta$={e_u.calc_beta(opt_a):.3f}')

plt.xlabel(r'$\alpha$', fontsize=18)

plt.ylabel(r'$\beta$, power', fontsize=14)

plt.legend()

plt.tight_layout()

 

plt.show()

 

 

 

リスト2 F分布の場合のスクリプト

 

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import scipy.stats as ss

import scipy.special as sspec

 

 

class ExpectedUtil():

    """

            期待効用値算出クラス、F分布対応

    """

    def __init__(self, p_H0, p_H1, U0sig, U0nsig, U1sig, U1nsig,

                 df1, df2, nc):

        self.p_H0 = p_H0

        self.p_H1 = p_H1

        self.U0sig = U0sig

        self.U0nsig = U0nsig

        self.U1sig = U1sig

        self.U1nsig = U1nsig

        self.df1 = df1

        self.df2 = df2

        self.nc = nc

 

    def calc_criterion(self, a):

        c = sspec.fdtri(self.df1, self.df2, 1.0 - a)

        return c

 

    def expectedU(self, p):

        a = p

        c = self.calc_criterion(a)

        b = sspec.ncfdtr(self.df1, self.df2, self.nc, c)

        exp_util = self.p_H0 * (a * self.U0sig + (1 - a) * self.U0nsig) + \

                    self.p_H1 * ((1 - b) * self.U1sig + b * self.U1nsig)

        return exp_util

 

    def calc_beta(self, a):

        c = sspec.fdtri(self.df1, self.df2, 1.0 - a)

        return sspec.ncfdtr(self.df1, self.df2, self.nc, c)

 

 

pd_df = pd.read_csv(input('Input data file (*.csv) = '))

print(pd_df)

vals = pd_df.values

print(vals)

 

nc = vals[1][1]

df1 = vals[2][1]

df2 = vals[3][1]

p_H0 = vals[0][2] / (vals[0][2] + vals[1][2])

p_H1 = vals[1][2] / (vals[0][2] + vals[1][2])

U0sig = vals[0][3]

U0nsig = vals[0][4]

U1sig = vals[1][3]

U1nsig = vals[1][4]

 

 

print('nc =', nc) 

print('df1 =', df1) 

print('df2 =', df2) 

print('p_H0 =', p_H0)

print('p_H1 =', p_H1)

print('U0sig =', U0sig) 

print('U0nsig =', U0nsig) 

print('U1sig =', U1sig)

print('U1nsig =', U1nsig) 

 

plt.figure(figsize=(12,5))

 

plt.subplot(1,3,(1,2))                  #   左2区画に期待効用曲線を描画

 

e_u = ExpectedUtil(p_H0, p_H1, U0sig, U0nsig, U1sig, U1nsig,

                 df1, df2, nc)

 

ps = np.linspace(1.0e-9, 1.0 - 1.0e-9, 10000)

expected_utils = e_u.expectedU(ps)

 

ck_idx = np.argsort(-expected_utils)    #   最大値を与えるインデックス

opt_a = ps[ck_idx[0]]                   #   最大期待効用を与える有意水準

 

print('opt_a =\n', opt_a)

 

plt.plot(ps, expected_utils, label=f'Exp.U')

plt.plot([opt_a], [expected_utils[ck_idx[0]]], 'ro', markersize=16, lw=0,

         label=fr'opt-$\alpha$={opt_a:.3f}')

plt.xlabel(r'$\alpha$', fontsize= 18)

plt.ylabel('Expect.Utility', fontsize=18)

plt.legend()

plt.title(fr'nc={nc}, df1={df1}, df2={df2}' + '\n' +

          fr'U0sig={U0sig}, U0nsig={U0nsig}, p0={p_H0:.3f}' + '\n' +

          fr'U1sig={U1sig}, U1nsig={U1nsig}, p1={p_H1:.3f}', fontsize=16)

plt.tight_layout()

 

plt.subplot(1, 3, 3)                       #   αに対するβと検出力のグラフ

alphas = np.linspace(1.0e-9, 1.0 - 1.0e-9, 10_000)

betas = e_u.calc_beta(alphas)

pwrs = 1.0 - betas

plt.plot(alphas, betas, label=r'$\beta$')

plt.plot(alphas, pwrs, label='power')

plt.plot(opt_a, e_u.calc_beta(opt_a), 'ro', markersize=12,

         label=fr'$\beta$={e_u.calc_beta(opt_a):.3f}')

plt.xlabel(r'$\alpha$', fontsize=18)

plt.ylabel(r'$\beta$, power', fontsize=14)

plt.legend()

plt.tight_layout()

 

plt.show()

 

 

 

リスト3 t分布の場合のスクリプト

 

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import scipy.stats as ss

import scipy.special as sspec

 

 

class ExpectedUtil():

    """

            期待効用値算出クラス、t分布対応

    """

    def __init__(self, p_H0, p_H1, U0sig, U0nsig, U1sig, U1nsig,

                 df, nc):

        self.p_H0 = p_H0

        self.p_H1 = p_H1

        self.U0sig = U0sig

        self.U0nsig = U0nsig

        self.U1sig = U1sig

        self.U1nsig = U1nsig

        self.df = df

        self.nc = nc

 

    def calc_criterion(self, a):

        c = sspec.stdtrit(self.df, 1.0 - a)

        return c

 

    def expectedU(self, p):

        a = p

        c = self.calc_criterion(a)

        b = sspec.nctdtr(self.df, self.nc, c)

        exp_util = self.p_H0 * (a * self.U0sig + (1 - a) * self.U0nsig) + \

                    self.p_H1 * ((1 - b) * self.U1sig + b * self.U1nsig)

        return exp_util

 

    def calc_beta(self, a):

        c = sspec.stdtrit(self.df, 1.0 - a)

        return sspec.nctdtr(self.df, self.nc, c)

 

 

pd_df = pd.read_csv(input('Input data file (*.csv) = '))

print(pd_df)

vals = pd_df.values

print(vals)

 

nc = vals[1][1]

df = vals[2][1]

p_H0 = vals[0][2] / (vals[0][2] + vals[1][2])

p_H1 = vals[1][2] / (vals[0][2] + vals[1][2])

U0sig = vals[0][3]

U0nsig = vals[0][4]

U1sig = vals[1][3]

U1nsig = vals[1][4]

 

 

print('nc =', nc) 

print('df =', df) 

print('p_H0 =', p_H0)

print('p_H1 =', p_H1)

print('U0sig =', U0sig) 

print('U0nsig =', U0nsig) 

print('U1sig =', U1sig)

print('U1nsig =', U1nsig)

 

import sys

#sys.exitc()

 

plt.figure(figsize=(12,5))

 

plt.subplot(1,3,(1,2))                  #   左2区画に期待効用曲線を描画

 

e_u = ExpectedUtil(p_H0, p_H1, U0sig, U0nsig, U1sig, U1nsig,

                 df, nc)

 

ps = np.linspace(1.0e-9, 1.0 - 1.0e-9, 10000)

expected_utils = e_u.expectedU(ps)

 

ck_idx = np.argsort(-expected_utils)    #   最大値を与えるインデックス

opt_a = ps[ck_idx[0]]                   #   最大期待効用を与える有意水準

 

print('opt_a =\n', opt_a)

 

plt.plot(ps, expected_utils, label=f'Exp.U')

plt.plot([opt_a], [expected_utils[ck_idx[0]]], 'ro', markersize=16, lw=0,

         label=fr'opt-$\alpha$={opt_a:.3f}')

plt.xlabel(r'$\alpha$', fontsize= 18)

plt.ylabel('Expect.Utility', fontsize=18)

plt.legend()

plt.title(fr'nc={nc}, df={df}' + '\n' +

          fr'U0sig={U0sig}, U0nsig={U0nsig}, p0={p_H0:.3f}' + '\n' +

          fr'U1sig={U1sig}, U1nsig={U1nsig}, p1={p_H1:.3f}', fontsize=16)

plt.tight_layout()

 

plt.subplot(1, 3, 3)                       #   αに対するβと検出力のグラフ

alphas = np.linspace(1.0e-9, 1.0 - 1.0e-9, 10_000)

betas = e_u.calc_beta(alphas)

pwrs = 1.0 - betas

plt.plot(alphas, betas, label=r'$\beta$')

plt.plot(alphas, pwrs, label='power')

plt.plot(opt_a, e_u.calc_beta(opt_a), 'ro', markersize=12,

         label=fr'$\beta$={e_u.calc_beta(opt_a):.3f}')

plt.xlabel(r'$\alpha$', fontsize=18)

plt.ylabel(r'$\beta$, power', fontsize=14)

plt.legend()

plt.tight_layout()

 

plt.show()

 

 

 

 

リスト4 カイ二乗分布の場合のスクリプト

 

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import scipy.stats as ss

import scipy.special as sspec

 

 

class ExpectedUtil():

    """

            期待効用値算出クラス、カイ二乗分布対応

    """

    def __init__(self, p_H0, p_H1, U0sig, U0nsig, U1sig, U1nsig,

                 df, nc):

        self.p_H0 = p_H0

        self.p_H1 = p_H1

        self.U0sig = U0sig

        self.U0nsig = U0nsig

        self.U1sig = U1sig

        self.U1nsig = U1nsig

        self.df = df

        self.nc = nc

 

    def calc_criterion(self, a):

        c = ss.chi2.ppf(1.0 - a, self.df) # sspec.stdtrit(self.df, 1.0 - a)

        return c

 

    def expectedU(self, p):

        a = p

        c = self.calc_criterion(a)

        b = ss.ncx2.cdf(c, self.df, self.nc) # sspec.nctdtr(self.df, self.nc, c)

        exp_util = self.p_H0 * (a * self.U0sig + (1 - a) * self.U0nsig) + \

                    self.p_H1 * ((1 - b) * self.U1sig + b * self.U1nsig)

        return exp_util

 

    def calc_beta(self, a):

        c = ss.chi2.ppf(1.0 - a, self.df)  # sspec.stdtrit(self.df, 1.0 - a)

        return ss.ncx2.cdf(c, self.df, self.nc) #  sspec.nctdtr(self.df, self.nc, c)

 

 

pd_df = pd.read_csv(input('Input data file (*.csv) = '))

print(pd_df)

vals = pd_df.values

print(vals)

 

nc = vals[1][1]

df = vals[2][1]

p_H0 = vals[0][2] / (vals[0][2] + vals[1][2])

p_H1 = vals[1][2] / (vals[0][2] + vals[1][2])

U0sig = vals[0][3]

U0nsig = vals[0][4]

U1sig = vals[1][3]

U1nsig = vals[1][4]

 

 

print('nc =', nc) 

print('df =', df) 

print('p_H0 =', p_H0)

print('p_H1 =', p_H1)

print('U0sig =', U0sig) 

print('U0nsig =', U0nsig) 

print('U1sig =', U1sig)

print('U1nsig =', U1nsig)

 

import sys

#sys.exitc()

 

plt.figure(figsize=(12,5))

 

plt.subplot(1,3,(1,2))                  #   左2区画に期待効用曲線を描画

 

e_u = ExpectedUtil(p_H0, p_H1, U0sig, U0nsig, U1sig, U1nsig,

                 df, nc)

 

ps = np.linspace(1.0e-9, 1.0 - 1.0e-9, 10000)

expected_utils = e_u.expectedU(ps)

 

ck_idx = np.argsort(-expected_utils)    #   最大値を与えるインデックス

opt_a = ps[ck_idx[0]]                   #   最大期待効用を与える有意水準

 

print('opt_a =\n', opt_a)

 

plt.plot(ps, expected_utils, label=f'Exp.U')

plt.plot([opt_a], [expected_utils[ck_idx[0]]], 'ro', markersize=16, lw=0,

         label=fr'opt-$\alpha$={opt_a:.3f}')

plt.xlabel(r'$\alpha$', fontsize= 18)

plt.ylabel('Expect.Utility', fontsize=18)

plt.legend()

plt.title(fr'nc={nc}, df={df}' + '\n' +

          fr'U0sig={U0sig}, U0nsig={U0nsig}, p0={p_H0:.3f}' + '\n' +

          fr'U1sig={U1sig}, U1nsig={U1nsig}, p1={p_H1:.3f}', fontsize=16)

plt.tight_layout()

 

plt.subplot(1, 3, 3)                       #   αに対するβと検出力のグラフ

alphas = np.linspace(1.0e-9, 1.0 - 1.0e-9, 10_000)

betas = e_u.calc_beta(alphas)

pwrs = 1.0 - betas

plt.plot(alphas, betas, label=r'$\beta$')

plt.plot(alphas, pwrs, label='power')

plt.plot(opt_a, e_u.calc_beta(opt_a), 'ro', markersize=12,

         label=fr'$\beta$={e_u.calc_beta(opt_a):.3f}')

plt.xlabel(r'$\alpha$', fontsize=18)

plt.ylabel(r'$\beta$, power', fontsize=14)

plt.legend()

plt.tight_layout()

 

plt.show()

 

 

 

Home