t検定のサンプルサイズと検出力と効果量と有意水準

## はじめに

最近$t$検定について調べる機会があったため、備忘録もかねてまとめました。

特に検出力と効果量とサンプルサイズについて、シミュレーションもはさみつつ確認してみます。
（シミュレーションはmatlabを使いました。）

$t$検定はいろいろな検定の中でも使用頻度が高く、検定について学ぶとっかかりとしても良いのではないかと思います。

$t$分布について軽く説明したのち、$t$検定を解説します。
その後、有意水準、検出力、効果量といった概念を導入し、最後にサンプルサイズの決め方についてまとめます。

### キーワード

$t$検定：$t$-test
$t$分布：$t$-distribution
非心$t$分布：noncentral $t$-distribution
統計量：statistics value
帰無仮説 ($H_0$)：null hypothesis
対立仮説 ($H_1$)：alternative hypothesis
有意水準：significance level
検出力：statistical power
効果量：effect size
サンプルサイズ：sample size

## 統計量tとt分布

$t$検定というのが、ざっくり分布と分布の平均の差についての検定であるというのを知っている人は多いと思います。

どのように平均の差を評価するのでしょうか？

これを知るためには、統計量$t$および$t$分布についてイメージを持つことが大事です。

統計量というのは、サンプリングしたデータの特徴を要約した数値のことです。サンプルの平均やサンプルの標準偏差なども統計量です。

### 統計量t

統計量$t$は、言葉で言うと**標本平均と母平均の差を平均の標準偏差で割って標準化した値**です。

式で書くと次の通り。

```math
\begin{align*}
t &= \frac{\bar{X} - \mu} {\frac{S}{\sqrt{n}}}, \\
\bar{X} &= \frac{X_1 + \dots + X_n} {n}, \\
S^2 &= \frac{1}{n-1} \sum_{i=1}^{n} (X_i - \bar{X})^2
\end{align*}
```

ここで、$\bar{X}$は標本平均、$S^2$は不偏分散です。（この$\bar{X}$と$S$はサンプルから計算されることに注意！ 特に、不偏分散$S^2$は母集団の分散$\sigma^2$とは異なります。標準偏差や分散周りは言葉がわかりにくくなるので、数式で理解すると良いでしょう。）
$n$はサンプルサイズ、$\mu$は母集団の平均です。

このとき、統計量$t$の分母$S/\sqrt{n}$が、標本平均の標準偏差となります。
（ちなみに、何の説明もなく標準誤差という場合はこの値を言うことが多いです。）

### シミュレーション1

ランダムなシミュレーション（モンテカルロ・シミュレーション）で、標本平均の分布を見てみましょう。

```matlab
% t分布 モンテカルロ・シミュレーション

clear
sampleSize = 3;
% 母集団のパラメータ（変化させてもt分布は変わらない）
mu = 0;
sigma = 1;

% 統計量tを繰り返し取得
n1 = 100000;
tVector = nan(n1, 1);
for i = 1 : n1
    tempRand = randn(sampleSize, 1) * sigma + mu;
    tempT = (mean(tempRand) - mu) / (std(tempRand) / sqrt(sampleSize));
    tVector(i) = tempT;
end

% プロット
xx = -10 : 0.2 : 10;
figure
tiledlayout('flow')

% 正規分布 (母集団からのサンプル)
nexttile
hold on;
histogram(randn(n1, 1) * sigma + mu, xx, 'Normalization', 'pdf')
xlim([-6, 6])
xlabel('x');
ylabel('Density');
title('正規分布（母集団）')

% t分布 (統計量tのサンプル)
df = sampleSize - 1; % t分布の自由度
nexttile
hold on;
histogram(tVector, xx, 'Normalization', 'pdf')
tY = tpdf(xx, df); % t分布
plot(xx, tY, 'LineWidth', 2)
xlim([-6, 6])
xlabel('t');
ylabel('Density');
title(sprintf('t分布（統計量t）, 自由度 %d', df))
```
![t分布.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327569/3df54857-70f6-0b95-60e7-f4fa88aa9f5f.png)

上の図の正規分布の母集団からサンプルサイズ3でサンプルし、そこから計算される統計量tの分布は、自由度2の$t$分布となります。

### t分布

**$t$分布は、正規分布からのサンプルにより計算される統計量tの確率密度分布のことです。**

$t$分布は、統計量$t$の分布です。ただし、その統計量$t$は正規分布由来のサンプルから計算されます。

大事なことは、$t$分布は元となる正規分布の標準偏差の大小にかかわらず一定であることです。

これは、統計量$t$が平均の標準偏差による標準化を行っているためです。

さらに言えば、$t$分布の形はサンプルサイズのみで決まります。
この特性はつまり、母集団がいかなる正規分布由来のサンプルであっても、統計量$t$に置き換えることで等しく扱うことができるということを意味します。

これらの特性が正規分布の平均の差を扱うのに便利なため、平均の差の評価に$t$分布を使ったt検定が有効なのです。

もう少し厳密にいうと、degree of freedom（自由度）というパラメータが$t$分布の形を決定します。自由度は拡張することで整数に限らず、小数を取ることもできるようになります。後述するウェルチの$t$検定では小数の自由度を持つ$t$分布が必要になります。

### シミュレーション2

$t$分布が元となる正規分布の標準偏差にかかわらず一定の形を取ることを見てみましょう。

```matlab
% t分布 標準偏差を変化

clear
sampleSize = 3;
% 母集団のパラメータ（変化させてもt分布は変わらない）
mu = 0;
sigmaVec = [0.5, 1.5];

figure
tiledlayout(2, length(sigmaVec))
for j = 1 : length(sigmaVec)
    sigma = sigmaVec(j);

    n1 = 100000;
    tVector = nan(n1, 1);
    for i = 1 : n1
        tempRand = randn(sampleSize, 1) * sigma + mu;
        tempT = (mean(tempRand) - mu) / (std(tempRand) / sqrt(sampleSize));
        tVector(i) = tempT;
    end

    % 正規分布
    xx = -10 : 0.2 : 10;
    nexttile(j)
    hold on;
    histogram(randn(n1, 1) * sigma + mu, xx, 'Normalization', 'pdf')
    xlim([-6, 6])
    xlabel('x');
    ylabel('Density');
    title('正規分布（母集団）')

    % t分布
    df = sampleSize - 1; % t分布の自由度
    nexttile(length(sigmaVec) + j)
    hold on;
    histogram(tVector, xx, 'Normalization', 'pdf')
    tY = tpdf(xx, df); % t分布
    plot(xx, tY, 'LineWidth', 2)
    xlim([-6, 6])
    xlabel('t');
    ylabel('Density');
    title(sprintf('t分布（統計量t）, 自由度 %d', df))
end
```
![標準偏差とt分布.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327569/ff58108e-71d4-4855-7c0f-ef6b84d81e62.png)

ついでに、自由度によって$t$分布の形が変化する様子も眺めてみます。

```matlab
% t分布 自由度による変化

clear
xx = linspace(-10, 10, 300);
figure
hold on;
dfVector = [1 : 4];
legendCell = {};
for i = 1 : length(dfVector)
    df = dfVector(i); % t分布の自由度
    tY = tpdf(xx, df); % t分布
    plot(xx, tY, 'LineWidth', 2)
    legendCell = [legendCell; {sprintf('自由度 = %d', dfVector(i))}];
end
xlim([-6, 6])
legend(legendCell)
xlabel('t');
ylabel('Density');
title(sprintf('t分布'))
```
![自由度とt分布.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327569/0348ccae-de2d-1e44-6037-5aeae2ca9620.png)

## t検定とt分布

### t検定のパターン

ここでは4つの基本的な$t$検定を紹介します。

- 1群の検定
    - 標本平均とある値との差
- 関連2組の差の検定
    - 組の差の標本平均と0との差
- 独立2群の検定
    - 等分散を仮定する
        - 1群の標本平均ともう1群の標本平均との差
    - 等分散を仮定しない
        - 1群の標本平均ともう1群の標本平均との差（ウェルチの検定）

露骨に書きましたが、$t$検定ではたいてい平均と何かの値を比べます。

### t検定のアイデア

いろいろな$t$検定のタイプがありますが、どの$t$検定も以下の共通の手順で考えることができます。

1. 分布が$t$分布にとなる適切な統計量$T$を設定。
1. $t$分布からその統計量$T$が、確率的に出現しやすい範囲にあるか、出現しにくい範囲にあるかを判断。

$t$検定の重要な点は、**母集団についてのある仮定の下では統計量$T$が$t$分布に従う**ということです。

これはつまり、サンプルから計算された統計量$T$を見ることで、サンプルの母集団が仮説にしたがっていそうかどうかを判断できるということです。

$t$検定の各パターンにおける母集団の仮定、統計量$T$、$t$分布を確認していきましょう。

### 4つのt検定の統計量Tとt分布の自由度

#### 1群の検定

1群の検定では標本平均と特定のある値$a$に差があるかを検定します。

最も基本的でわかりやすい検定です。

統計量$T$は記事の初めのほうで紹介した統計量$t$と同じ形を取ります。

```math
T = \frac{\bar{X} - a} {\frac{S}{\sqrt{n}}}
```

$T$は母集団の平均値が$a$であるとき、自由度$n−1$の$t$分布に従います。

#### 関連2組の差の検定

組の差の標本平均と値0との差を検定します。

2群の検定の特殊パターンとすることもありますが、考え方はどちらかといえば**1群の検定に近いです。**
なぜなら、最初に組ごとに差を取り、$n$個のサンプルとみなすような操作をするためです。

$X_i$と$Y_i$が組だとして、

```math
X_i' = X_i - Y_i
```

というサンプルを計算します。そして、次の統計量$T$を計算します。

```math
T = \frac{\bar{X}' - 0} {\frac{S}{\sqrt{n}}}
```

$T$は組の差の母集団の平均が0であるとき、自由度$n−1$の$t$分布に従います。

#### 独立2群の検定

1群の標本平均ともう1群の標本平均との差を検定します。

この場合、統計量$T$は次のように取ります。

```math
T = \frac{\bar{X} - \bar{Y}} {\sqrt{\frac{S_1^2}{n_1} + \frac{S_2^2}{n_2}}}
```

ここで$S_1^2$, $S_2^2$は$X$と$Y$から計算される不偏分散、$n_1$, $n_2$は$X$と$Y$のサンプルサイズです。

これは、正規分布 $\bar{X} \sim N(\mu_1, \frac{\sigma_1^2} {n_1})$, $\bar{Y} \sim N(\mu_2, \frac{\sigma_2^2} {n_2})$ の差、

```math
Z = \bar{X} - \bar{Y}
```

も正規分布

```math
Z \sim N(\mu_1 - \mu_2, \frac{\sigma_1^2} {n_1} + \frac{\sigma_2^2} {n_2})
```

となることから、$\bar{X} = \bar{Y}$であれば、統計量$T$が$t$分布に従うことが予感できます。

ただし、目的の$t$分布の自由度を求めるのは難しそうです。
（ウェルチの検定ではこの自由度を考えます。）

この統計量は$X$と$Y$が同じ分散を持つ母集団から得られていることを仮定する時 (つまり、それぞれの母集団の標準偏差$\sigma_1=\sigma_2=\sigma$となるとき)、わかりやすい形になります。

##### 独立2群の検定 (等分散を仮定する)

等分散を仮定することで、計算してみます。

共通の不偏分散$S^2$を、自由度を考慮した加重平均を用いて以下のように計算します。

```math
\begin{align*}
S^2 &= S_1^2= S_2^2 \\
&= \frac{\sum(X_i - \bar{X})^2 + \sum(Y_i - \bar{Y})^2} {n_1 + n_2 - 2}
\end{align*}
```
統計量$T$は以下になります。

```math
T = \frac{\bar{X} - \bar{Y}} {S\sqrt{\frac{1}{n_1} + \frac{1}{n_2}}}
```

$T$は2つの母集団の平均が同じ値であるとき、自由度 $n_1 + n_2 − 2$ の$t$分布に従います。


##### 独立2群の検定 (等分散を仮定しない) (ウェルチの検定)

等分散を仮定しない独立2群のt検定には、ウェルチの検定という名前がついています。

等分散を仮定する場合に対して、等分散を仮定しないため実用的であり、最近のt検定はたいていこのウェルチの検定が用いられているように思います。
たいていの解析ソフトにはこの検定が用意されています。

統計量$T$を改めて書きます。

```math
T = \frac{\bar{X} - \bar{Y}} {\sqrt{\frac{S_1^2}{n_1} + \frac{S_2^2}{n_2}}}
```

問題は自由度 $df$ ですが、以下のようになります。

```math
df = \frac{(\frac{\sigma_1^2} {n_1} + \frac{\sigma_2^2} {n_2})^2} {\frac{\sigma_1^2} {n_1^2(n_1 - 1)} + \frac{\sigma_2^2} {n_2^2(n_2 - 1)}}
```

ここで、$df$ は整数だけでなく小数を取る可能性があります。

$T$は2つの母集団の平均が同じ値であるとき、自由度 $df$ の$t$分布に従います。

## 有意水準と検出力と効果量

これまで$t$検定に用いる統計量$T$と$t$分布について説明してきました。

これからは検定において重要な概念である、**有意水準と検出力と効果量**を説明します。

### 検定のエラー

検定について、次のような表を書くことができます。

||$H_0$が真実|$H_1$が真実|
|:-:|:-:|:-:|
|$H_0$を採用|正しい ($1-\alpha$) |Type II error ($\beta$)|
|$H_1$を採用|Type I error ($\alpha$)|正しい ($1-\beta$)|

()の中身は特定の仮説が真実であるときに、特定の仮説を採用する条件付確率です。(例：$\alpha = P((H_1を採用)|(H_0が真実))$)

* $H_0$は帰無仮説 (差がないという、棄却したい仮説)
* $H_1$は対立仮説 (差があるという、採用したい仮説)

$H_0$が真実のとき$H_0$を採用し、$H_1$が真実のとき$H_1$を採用するのが理想です。
そのため、よりもっともらしい検定を行うためにType I errorとType II errorが発生する確率を小さくしたいわけです。

このあたりのバランス決定するのが、有意水準やサンプルサイズ、検出力、効果量です。

### 有意水準

**有意水準は帰無仮説$H_0$が真実のときに、その帰無仮説を棄却する基準となる確率です。**

有意水準を表す文字として $\alpha$ を用いることが多いです。
具体的な値は0.05や0.01がよく使用されます。

統計量の分布を考えたときに、確率がかなり低い範囲に統計量が計算された場合、それは仮説が正しくない可能性が高い。
→ だから、対立仮説$H_1$を採用しよう！

#### シミュレーション3 (片側と両側の検定)

$t$分布 ($H_0$の分布) の棄却範囲を眺めてみましょう。

```matlab
% t分布 棄却範囲

clear
N = 8;
df = N-1;
alpha = 0.05;
conf = 1-alpha;
cutoff1 = tinv(alpha/2,df);
cutoff2 = tinv(1-alpha/2,df);
cutoff3 = tinv(1-alpha,df);
x = [linspace(-10,cutoff1), linspace(cutoff1,cutoff2),linspace(cutoff2,10)];
y = tpdf(x,df);

figure
tiledlayout('flow')
% 両側
nexttile; hold on;
h1 = plot(x,y);
xlo = [x(x<=cutoff1),cutoff1];
ylo = [y(x<=cutoff1),0];
xhi = [cutoff2,x(x>=cutoff2)];
yhi = [0, y(x>=cutoff2)];
patch(xlo,ylo,'b', 'FaceAlpha', '0.3');
patch(xhi,yhi,'b', 'FaceAlpha', '0.3');
title(sprintf('t分布, 自由度 = %d, 両側', df));
xlim([-15, 15])
xlabel('T');
ylabel('Density');

% 片側
nexttile; hold on;
h1 = plot(x,y);
xhi = [cutoff3,x(x>=cutoff3)];
yhi = [0, y(x>=cutoff3)];
patch(xhi,yhi,'b', 'FaceAlpha', '0.3');
title(sprintf('t分布, 自由度 = %d, 片側', df));
xlim([-15, 15])
xlabel('T');
ylabel('Density');
```
![棄却範囲.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327569/b89515b3-5dba-cf9c-7897-61522b2a3914.png)

検定を行う際に、片側と両側を決める必要があります。
片側と両側の違いは、棄却する範囲を分布の片側だけにするのか、それとも両側にするのか、ということです。

両側と片側の検定では検定の内容が、「単に差がある」と「一方が一方に対して大きい（小さい）」のように異なります。

差の大小の関係性が予想できる時に、片側の検定を使います。
自分が検定したい対象に合わせて、検定前に決めておきましょう。

### 検出力と効果量

**検出力は対立仮説$H_1$が真実のときに、$H_1$を採用する確率です。**

検出力はType II error $\beta$ を用いて $1 - \beta$ と表されます。
具体的な値は0.80がよく使用されます。

個人的に、検出力が検定の理解のネックの一つになっているように思われます。
その理由は、対立仮説$H_1$の扱い方です。

もともと$H_1$は単に$H_0$の対立仮説に過ぎず、「差がある」というだけ仮説です。

しかし、**検出力を計算する際には、$H_1$は具体的な分布を想定します。**
つまり、「どれだけの差」があるのかを設定します。

**この設定される差の大きさを効果量といいます。**

#### シミュレーション4 (t分布と非心t分布)

例えば1群の$t$検定では、「平均値とある値$a$の間に差がある」かどうか検定するわけですが、効果量 $b$ だけ差があるときに、統計値$T$はどのような分布を取るのでしょうか？

文字を使っているとわかりづらいので、より具体的に、次のような問題を考えます。

平均8で標準偏差3の正規分布を持つ母集団から8サンプル得るとします。
ここで、母集団の平均値が5であるかどうかを検定します。
露骨に書くと「母集団の平均値と値5の間に差がある」かどうかを検定するわけです。

実際は母集団の平均が8であり5ではないため、今回は$H_0$を棄却して$H_1$を採用したいです。
この状況で$H_1$が採用される確率が、効果量3の下での検出力となります。

ここで、今回の設定では「母集団が平均8で標準偏差3の正規分布を持つ分布である」ことが対立仮説$H_1$として設定されていることに注意しましょう。

このように、検出力を計算するときは、対立仮説$H_1$に具体的な分布を設定する必要があります。

$H_1$の下での統計量$T$の分布を眺めます。

```math
T = \frac{\bar{X} - a} {\frac{S}{\sqrt{n}}}
```

```matlab
% 非心t分布
clear
sampleSize = 8;
% 母集団のパラメータ（変化させてもt分布は変わらない）(H1)
mu = 8;
sigma = 3;
% 検定相手のパラメータ(H0)
mu0 = 5;

n1 = 100000;
tVector = nan(n1, 1);
for i = 1 : n1
    tempRand = randn(sampleSize, 1) * sigma + mu;
    tempT = (mean(tempRand) - mu0) / (std(tempRand) / sqrt(sampleSize));
    tVector(i) = tempT;
end

xx = -20 : 0.2 : 20;
figure
tiledlayout('flow')
df = sampleSize - 1; % t分布の自由度
nexttile
hold on;
histogram(tVector, xx, 'Normalization', 'pdf')
delta = (mu - mu0) / (sigma / sqrt(sampleSize)); % 非心パラメータ
nctY = nctpdf(xx, df, delta); % 非心t分布
plot(xx, nctY, 'LineWidth', 2)
xlim([-15, 15])
xlabel('T');
ylabel('Density');
title(sprintf('非心t分布, 自由度 %d, 効果量 %d', df, mu - mu0))
```
![非心t分布.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327569/0ac3e9cb-b121-8976-16a3-187004fcdac8.png)

ピークが0ではないので、一目でt分布ではないことがわかります。

この分布を、非心t分布と呼びます。

$t$分布 ($H_0$の分布) の棄却範囲 (= 非心$t$分布 ($H_1$の分布)の採用範囲) を眺めてみましょう。

```matlab
% 検出力

clear
sampleSize = 8;
% 母集団のパラメタ（変化させてもt分布は変わらない）
mu = 8;
sigma = 3;
% 検定相手の値
mu0 = 5;

df = sampleSize - 1; % t分布の自由度
alpha = 0.05;
cutoff3 = tinv(1-alpha,df);

figure
tiledlayout('flow')
nexttile
hold on;

% t分布 (H0)
xx = -20 : 0.1 : 20;
tY = tpdf(xx, df);
xhi = [cutoff3,xx(xx>=cutoff3)];
yhi = [0, tY(xx>=cutoff3)];
plot(xx, tY, 'b', 'LineWidth', 2)
patch(xhi,yhi,'b', 'FaceAlpha', '0.3');

% 非心t分布 (H1)
delta = (mu - mu0) / (sigma / sqrt(sampleSize));
nctY = nctpdf(xx, df, delta);
xhi = [cutoff3,xx(xx>=cutoff3)];
yhi = [0, nctY(xx>=cutoff3)];
power = nctcdf(cutoff3,df,delta,'upper');
plot(xx, nctY, 'r', 'LineWidth', 2)
patch(xhi,yhi, 'r', 'FaceAlpha', '0.3');

text(-4, 0.06, sprintf('有意水準 = 0.05', power), ...
    'Color', 'b', 'HorizontalAlignment', 'right')
plot([-4, 2.5], [0.06, 0.01], 'b', 'LineWidth', 1)
text(7, 0.06, sprintf('検出力 = %.2f', power), ...
    'Color', 'r', 'HorizontalAlignment', 'left')
plot([7, 4], [0.06, 0.1], 'r', 'LineWidth', 1)
text(-3, 0.2, sprintf('H0', power), ...
    'Color', 'b', 'HorizontalAlignment', 'center')
text(5, 0.2, sprintf('H1', power), ...
    'Color', 'r', 'HorizontalAlignment', 'center')

xlim([-15, 15])
xlabel('T');
ylabel('Density');
title([sprintf('t分布 (H0), 自由度 %d', df), newline, ...
    sprintf('非心t分布 (H1), 自由度 %d, 効果量 %d', df, mu - mu0)])

%%
% 検出力の確認 (提供されている関数と比較)
% power
% powerTest = sampsizepwr("t", [mu0, 3], 8, [], sampleSize, Tail="right")
```

![検出力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327569/07e658c5-ca74-7eb9-745a-d3213ad564b6.png)

この非心$t$分布 ($H_1$の分布) の採用範囲の確率が、今回の検出力です。

サンプルサイズを大きくすると、平均値の標準偏差が小さくなるため、検出力が大きくなります。

また、効果量を大きくしても、差が大きくなるので、やはり検出力が大きくなります。
ここで、効果量を大きくするというのが、つまり、想定する$H_1$の分布を変化させていることに対応していることに注意しましょう。

## サンプルサイズの決め方

### 統計検定を行う前に

検定をするためには、事前に最低限次のようなことを考える必要があります。

* どのような検定を行うべきか
* どの程度の差を意味のある差としてみなすのか

特に2つ目のポイント、意味があるとみなしたい差の大きさ（つまり、基準となる効果量）については失念していることが多いので気を付けましょう。

もちろんこのほかにも考えるべきことはたくさんありますが、何より大事なのは扱うデータについて知ることです。

基本中の基本ですが、実際に手元にあるデータをよく見て、行うべき解析・検定を考えましょう。

### サンプルサイズを決める

サンプルサイズはどのくらいあれば十分なのでしょうか？

サンプルサイズを決める手順を確認しましょう。

サンプルサイズを決めるために、まず、基準となる有意水準と検出力を設定しましょう。
よく用いられるのは、有意水準 $\alpha = 0.05$ 、検出力 $1 - \beta = 0.80$です。

次に、2群それぞれの母集団の標準偏差を想定します。
真の母集団の標準偏差は未知ですが、計算に必要なので適当な値を設定する必要があります。
事前の調査などをもとに決定しましょう。

そして次に、効果量を決めます。
「どの程度の差を意味のある差としてみなすのか」を事前に決めているはずなので、それをもとに決定します。

ここまでで、以下を決定しました。
* 検定の方法
* 有意水準
* 基準となる検出力
* 母集団の標準偏差
* 効果量

母集団の標準偏差とサンプルサイズと効果量を決めれば、$H_0$の分布と$H_1$の分布を書くことができます。
さらに有意水準を決めれば棄却範囲が決まり、その時の検出力が計算できます。

あとはサンプルサイズを変数として変化させて検出力の関数を作り、設定した基準となる検出力を満たすサンプルサイズを探すことができます。

#### シミュレーション5

1群の片側の$t$検定の場合を例に、サンプルサイズを決めてみましょう。

有意水準は0.05、ほしい検出力は0.8と設定します。

母集団の平均は標準偏差は3を想定します。
効果量は3と設定します。

サンプルサイズと検出力のプロットを描きます。

```matlab
% サンプルサイズと検出力

clear
% H0パラメータ
mu0 = 5;
sigma0 = 3;
% H1パラメータ
mu = 8;
alpha = 0.05; % 有意水準
powerWant = 0.80; % 基準となる検出力
% 検出力計算
sampleSizeVec = [2 : 20];
powerVec = sampsizepwr('t', [mu0, sigma0], mu, [], sampleSizeVec, ...
    'Alpha', alpha, 'Tail', 'right');
% プロット
figure; grid on; hold on; box on;
plot(sampleSizeVec, powerVec, 'o', ...
    'MarkerEdgeColor','b', 'MarkerFaceColor', 'b', 'MarkerSize', 8)
yline(powerWant, '--', {sprintf('power = %.2f', powerWant)}, 'LineWidth', 2)
xlim([0, sampleSizeVec(end) + 1])
ylim([0, 1.1])
xlabel('Sample size');
ylabel('Statistical power');
title('サンプルサイズと検出力');
```

![サンプルサイズ_検出力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327569/698b3bbd-6002-f518-1e32-81be39af8e3f.png)

この例では、サンプルサイズが8のとき検出力0.8程度が見込めることがわかります。

このようにして、サンプルサイズを設計することができます。

## おわりに

$t$分布、$t$検定を解説し有意水準、検出力、効果量といった概念を導入し、最後にサンプルサイズの決め方についてまとめました。

このあたりの考え方は一度わかったつもりになっても時間がたつと混乱することが多いので、備忘録的にまとめることが出来て良かったです。

うまく消化して、自信を持って検定を使いこなしたいですね。

## 参考

[t検定(Wikipedia)](https://ja.wikipedia.org/wiki/T%E6%A4%9C%E5%AE%9A)
[標本サイズの選択 (MathWorks)](https://jp.mathworks.com/help/stats/selecting-a-sample-size.html)