t.test() を実行し,結果を解釈できるこの回のコードは,すべて tidyverse
を読み込んだ状態で動きます。
RStudioを起動したら,まずこれを実行してください。
毎回必要です。読み込まないまま
filter()やggplot()を使うと, 「関数が見つかりません」というエラーになります。
→ t検定(独立2標本t検定) で統計的に判断します
\[t = \frac{\bar{x}_1 - \bar{x}_2}{SE_{差}}\]
→ t値が大きいほど「差が大きく,偶然とは言いにくい」
2群の平均値の差 \(\bar{x}_1 - \bar{x}_2\) も,標本を取り直すたびに揺れる量です。その揺れの大きさが分母になります。
分散は,2群が互いに独立なら和について加法的です。引き算でも符号は効きません(\(\mathrm{Var}[-X] = \mathrm{Var}[X]\))。したがって
\[\mathrm{Var}[\bar{X}_1 - \bar{X}_2] = \mathrm{Var}[\bar{X}_1] + \mathrm{Var}[\bar{X}_2]\]
各群の標本平均の標準誤差は \(SE_i = s_i / \sqrt{n_i}\) なので,平方根を取って
\[SE_{差} = \sqrt{SE_1^2 + SE_2^2} = \sqrt{\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}}\]
これが \(t = \dfrac{\bar{x}_1 - \bar{x}_2}{SE_{差}}\) の分母の正体です。
数値で確かめる:mtcars では,オートマ \(SE_1 = 0.8796\),マニュアル \(SE_2 = 1.7103\) なので
\[SE_{差} = \sqrt{0.8796^2 + 1.7103^2} = 1.9232\]
平均差 \(7.2449\) をこれで割ると
\(7.2449 / 1.9232 = 3.7671\)
となり,あとで t.test() が返す \(t = -3.7671\)
の絶対値と一致します(符号は引き算の向きの違いです)。
この式は「2群が独立」を使っています。 同じ人を2回測ったデータ(前後比較など)では2つの測定が独立ではないので,この足し算は成り立ちません。その場合は先に差を取って1標本として扱います(第11回の対応のあるt検定)。
使った数学:分散の加法性と,平方根。独立でなければ共分散の項が残ります。
もし母標準偏差 \(\sigma\) が分かっていれば,平均の差を \(\sigma\) から作った標準誤差で割った量は標準正規分布に従います。分母が定数だからです。
しかし実際には \(\sigma\) は分かりません。手元の標本から \(s\) を計算して代わりに使います。すると分母もランダムに揺れる量になります。
\[t = \frac{\bar{x}_1 - \bar{x}_2}{\sqrt{s_1^2/n_1 + s_2^2/n_2}}\]
たまたま \(s\) が小さめに出た標本では,分子が普通でも比が大きくなります。この「分母のブレ」のぶんだけ,\(t\) の分布は正規分布より裾が重くなります。標本が小さいほど \(s\) が当てにならないので,裾はさらに重くなります。これを表すのが自由度です。自由度が大きくなると \(t\) 分布は標準正規分布に近づき,\(n\) が十分大きければ違いは実用上なくなります。
数値で確かめる:mtcars の Welch法では \(df = 18.33\) と小数になります。これは2群の分散が異なる場合に自由度を近似的に決めるためです。等分散を仮定する Student法では \(df = n_1 + n_2 - 2 = 30\) となり,\(t = -4.1061\),\(p = 0.000285\) です(Welch法は \(t = -3.7671\),\(p = 0.001374\))。
使った数学:標準化と,未知の母数を推定量で置き換えるという考え方。なお \(t\) 分布の密度関数そのものを導くのは,この科目の範囲外です。
# mtcars データ:am(0=オートマ, 1=マニュアル)ごとの燃費(mpg)
mtcars |>
group_by(am) |>
summarise(n = n(), mean_mpg = mean(mpg), sd_mpg = sd(mpg))# 箱ひげ図で確認
mtcars |>
mutate(am = factor(am, labels = c("オートマ", "マニュアル"))) |>
ggplot(aes(x = am, y = mpg, fill = am)) +
geom_boxplot() +
geom_jitter(width = 0.1, alpha = 0.5) +
scale_fill_brewer(palette = "Set2") +
labs(title = "トランスミッション別の燃費", x = "トランスミッション", y = "燃費 (mpg)") +
theme_bw() +
theme(legend.position = "none")##
## Welch Two Sample t-test
##
## data: mpg by am
## t = -3.7671, df = 18.332, p-value = 0.001374
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -11.280194 -3.209684
## sample estimates:
## mean in group 0 mean in group 1
## 17.14737 24.39231
mpg ~ amという書き方(チルダ記法)~の左に「比べたい数値」,右に「グループを表す列」を書きます。 「amで分けたときのmpg」という意味です。 第9回のxtabs(Freq ~ Sex + Survived, ...)や,第13回の分散分析aov(...)でも同じ形を使います。 Rで「何を何で説明するか」を書くときの共通の書式だと覚えてください。
出力の1行目が
Welch Two Sample t-testになっていることに注目。t.test()は何も指定しないとWelch法で計算します(§4で扱います)。
Welch Two Sample t-test
data: mpg by am
t = -3.7671, df = 18.332, p-value = 0.001374
alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
95 percent confidence interval:
-11.280194 -3.209684
sample estimates:
mean in group 0 mean in group 1
17.14737 24.39231
| 項目 | 意味 |
|---|---|
t |
t統計量(負の値 = group0 < group1) |
df |
自由度 |
p-value |
p値(< 0.05 で有意) |
95% CI |
平均差の95%信頼区間(0を含まなければ有意) |
mean in group 0/1 |
各群の平均値 |
Welch法(分散が等しくない場合に対応)とStudent法(等分散を仮定)の使い分け:
##
## F test to compare two variances
##
## data: mpg by am
## F = 0.38656, num df = 18, denom df = 12, p-value = 0.06691
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 0.1243721 1.0703429
## sample estimates:
## ratio of variances
## 0.3865615
教科書などでよく見るのは,次の使い分けです。
##
## Two Sample t-test
##
## data: mpg by am
## t = -4.1061, df = 30, p-value = 0.000285
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -10.84837 -3.64151
## sample estimates:
## mean in group 0 mean in group 1
## 17.14737 24.39231
上の var.test() の結果は F = 0.387, p =
.067 でした。\(p \geq .05\)
なので,
さきほどの使い分けに従えば「等分散と判断してStudent法」になります。
それでも,この授業ではWelch法の結果(§3・§6)を採用します。 理由は2つあります。
① F検定の結果で手法を選ぶ(2段階の手続き)のは,現在は推奨されていません。 「有意でなかったから等分散」は「等分散であることが示された」とは違います。 n が小さいと差があっても有意になりにくいだけで,このデータも標準偏差は 3.83 対 6.17(分散で2.6倍)とかなり違います。p = .067 は境界すぐそばの値です。 さらに,検定の結果を見てから次の検定を選ぶと,全体の第1種の誤りの確率が 名目の5%からずれてしまいます。
② Welch法は,等分散のときに使っても損がほとんどありません。 分散が等しい場合でもWelch法の性能はStudent法とほぼ変わらず, 等しくない場合にはStudent法より明らかに正確です。 最初からWelch法にしておけば,等分散かどうかを判断する必要がありません。
この授業の方針:独立2標本t検定は t.test()
をそのまま使う(=Welch法)。 var.test()
は「手法を選ぶため」ではなく,2群のばらつきの違いそのものを知りたいときに使ってください。
なお
var.test()のF検定は,データが正規分布から外れていると結果が当てにならないことが 知られています。これも,F検定に判断を委ねない理由のひとつです。
p値は「差が有意かどうか」しか教えてくれません。 「どのくらいの差か」 を表すのが効果量です。
\[d = \frac{\bar{x}_1 - \bar{x}_2}{SD_{プール}}\]
分母の \(SD_{プール}\) は,2群の標準偏差を1つにまとめたものです。 それぞれの群の標準偏差を,自由度 \(n_i - 1\) で重みづけして平均します。
\[SD_{プール} = \sqrt{\frac{(n_1 - 1)s_1^2 + (n_2 - 1)s_2^2}{n_1 + n_2 - 2}}\]
下のコードは,この式をそのまま書いたものです。var() が
\(s^2\) にあたります。
# Cohenの d を手動で計算
auto <- mtcars |> filter(am == 0) |> pull(mpg)
manual <- mtcars |> filter(am == 1) |> pull(mpg)
mean_diff <- mean(manual) - mean(auto)
sd_pooled <- sqrt(((length(auto)-1)*var(auto) + (length(manual)-1)*var(manual)) /
(length(auto) + length(manual) - 2))
d <- mean_diff / sd_pooled
round(d, 2)## [1] 1.48
| d の値 | 効果の大きさ |
|---|---|
| 0.2 | 小 |
| 0.5 | 中 |
| 0.8以上 | 大 |
効果量の式
\[d = \frac{\bar{x}_1 - \bar{x}_2}{SD_{プール}}\]
は,分子と分母が同じ単位です。割り算で単位が消えるので,\(d\) は単位のない数になります。つまり「差は標準偏差いくつ分か」だけを表します。
測定単位を変えても \(d\) は変わりません。 燃費を mpg から km/L に換算(\(\times 0.425144\))しても,分子も分母も同じ倍率で変わるため \(d = 1.4779\) のまま一致します。
ここで \(t\) と \(d\) の関係を見ます。等分散を仮定する Student法では,両者は次の式で厳密に結ばれます。
\[t = d \times \sqrt{\frac{n_1 n_2}{n_1 + n_2}}\]
数値で確かめる:\(d = 1.4779\),\(\sqrt{19 \times 13 / 32} = 2.7783\) なので積は \(4.1061\)。Student法の \(t = 4.1061\) と完全に一致します。
この式の右辺で,\(d\) には \(n\) が入っていません。\(n\) は平方根の側にだけ入っています。つまり
同じデータを複製して \(n\) だけ増やすと,これがはっきり見えます(上の式に合わせて \(t\) はStudent法の値です)。
| データの量 | 合計 \(n\) | \(t\)(Student法) | \(d\) |
|---|---|---|---|
| そのまま | 32 | 4.11 | 1.48 |
| 2倍 | 64 | 5.90 | 1.50 |
| 4倍 | 128 | 8.42 | 1.51 |
| 10倍 | 320 | 13.37 | 1.52 |
\(t\) は3倍以上になるのに,\(d\) はほとんど動きません(わずかな増加は,プールした標準偏差の自由度 \(n_1 + n_2 - 2\) が変わるためです)。
この表の「そのまま 32」の \(t = 4.11\) は Student法の値です。 §3でWelch法が返した \(t = 3.77\) とは別の数字なので,混同しないでください。 Welch法でも「\(n\) を増やすと \(t\) は大きくなり,\(d\) は動かない」という結論は同じです (Welch法だと 3.77 → 5.43 → 7.75 → 12.32)。
「有意」は \(n\) を増やせば作れますが,「重要」はそうではありません。 これが,p値だけでなく効果量を併せて報告する理由です。
使った数学:無次元量(単位が消える割り算)と,平方根。
論文・レポートでの記述例:
マニュアル車(M = 24.39, SD = 6.17)の燃費は, オートマ車(M = 17.15, SD = 3.83)に比べて有意に高かった, t(18.33) = 3.77, p = .001, d = 1.48。
報告の要素:各群の M と SD,t値,df,p値,効果量 d
\(t\) と \(d\) の符号について。
t.test(mpg ~ am)の出力は \(t = -3.77\) でした。これはam = 0(オートマ)からam = 1(マニュアル)を引いた向きだからで,「マニュアルのほうが低い」という意味ではありません。 報告では上の例のようにどちらが高いかを言葉で書くので,数値は絶対値で構いません。 ただし言葉と符号が食い違わないように気をつけてください。
信頼区間も書けるとより良い報告になります。 §3の出力にある 95% CI \([-11.28,\ -3.21]\) は「平均差がこの範囲にありそうだ」という区間です。 「マニュアル車の燃費は 3.21〜11.28 mpg 高い(95% CI)」と添えると, 「有意かどうか」だけでなく差の大きさの不確かさまで伝わります。
iris データを使って,setosa と
versicolor の Petal.Length を比較します。
まず,2群の平均・標準偏差・サンプルサイズを確認してください。
演習1の2群を箱ひげ図で比較してください。
iris の setosa と versicolor
の Petal.Length を比べるt検定を実行し,
結果を解釈してください。
演習3の結果を,論文の結果の節として1〜2文で記述してください。 (M, SD, t値, df, p値を含める)
t.test() で t値・df・p値・信頼区間を取得