対応のあるt検定

僕が作った架空のデータで練習しましょう。結果についてはご意見があると思いますが、統計学の練習のためのサンプルですのでご了承ください。信頼区間の求め方は母平均の区間推定(母分散が未知の場合)をご覧ください。

例題)COPDの男性患者10名を対象にして、入院時と入院2週間後に6分間歩行距離(m)を計測した。両時点での歩行距離に差があるか有意水準5%で検証せよ。

データの準備と要約

Rを使って10名のサンプルを作成します

計測結果(pre: 入院時、post: 2週間後)

ID <- 1:10
pre <- c(330, 410, 410, 315, 395, 290, 250, 335, 302, 340)
post <- c(350, 420, 408, 333, 445, 312, 275, 312, 295, 395)
dat <- data.frame(ID, pre, post)
head(dat)

対応のあるデータのグラフ

#表の準備
x <- c(1.1, 1.9)
dat2 <- t(dat[,2:3])
print(dat2)

グラフ(dat2を使用します)

matplot(
    x, dat2,
    type ="b", lty=2,
    xaxt="n", 
    xlim=c(1, 2),
    xlab="", ylab=""
)
name <- c("入院時", "2週間後")
axis(side=1, at=c(1.1, 1.9), labels=name)

仮説

帰無仮説:入院時の歩行距離と2週間後の歩行距離に差はない\( \quad (pre=post)\)

対立仮説1:入院時と2週間後の歩行距離の差の平均は0ではない\( \quad (pre \neq post)\)

対立仮説2:2週間後の歩行距離は入院時の歩行距離より長い\( \quad (post – pre > 0)\)

対立仮説1を証明する場合には両側検定、対立仮説2を検証する場合には片側検定となります

入院治療の効果を判定する場合には、本来であれば対立仮説2になるのですが、対立仮説1で検証している報告が多いようです

t検定

仮説1の両側検定

sa <- dat$post - dat$pre
t.test(sa)

p>0.05で有意差なし・・・という結果になりました

仮説2の片側検定

t.test(sa, alternative="greater")

p<0.05で有意になりました

結果のみよければ、ここまでです

ここからはもう少し深く勉強してみましょう

統計量

2週間後 – 入院時: \(post-pre\)

(2週間後 – 入院時)の平均値:\(\bar{x}\)

(2週間後 – 入院時)の母平均値:\(\mu\)

(2週間後 – 入院時)の不偏分散: \(s^2\)

#標本平均
mean(sa) 

#標本不偏分散
var(sa) 

母分散が未知の平均値の差の検定なので、t統計量を使用します   (\(\sim t(10-1)\))

また帰無仮説では \(pre=post\) を仮定しているので \(\mu = 0\) とします

\(t=
\dfrac{\bar{x}-\mu}{\sqrt{\dfrac{s^2}{n}}}=\dfrac{16.8-0}{\sqrt{\dfrac{579.733}{10}}}\)

標本不偏分散の求め方

$V[A – B] = V[A] + V[B] – 2cov(A, B)$ より

var(dat$pre) + var(dat$post) - 2*cov(dat$pre, dat$post)
t値の求め方
t <- mean(sa)/sqrt(var(sa)/length(sa))
print(t)

Rの検定結果に記載してあるt統計量と同じ値になりました。この統計量(t値=2.21)を利用して検定してみましょう

両側検定

対立仮説1(\(\mu \neq 0 \))を有意水準5%で検定してみましょう

自由度9のt分布

#グラフ
x <- seq(-5, 5, length=100)
plot(
    x, dt(x, 9), type = "l",
    xlim=c(-5, 5), ylim=c(0, 0.4),
    xlab="", ylab="", xaxt="n"
)

t <- mean(sa)/sqrt(var(sa)/length(sa))
lines(c(t, t), c(-1.5, dt(t, 9)))
axis(side=1, at=t)

有意水準5%なので右側の面積 $<0.025$ であれば両側検定で帰無仮説が棄却できます

右側の面積が $<0.025$ の部分を青色で塗りつぶしてみましょう

#グラフ
x <- seq(-5, 5, length=100)
plot(
    x, dt(x, 9), type = "l",
    xlim=c(-5, 5), ylim=c(0, 0.4),
    xlab="", ylab="", xaxt="n"
)

q = qt(0.025, 9, lower.tail=F)
p <- seq(q, 5, length=100)
y <- dt(p, 9)
polygon(c(p,rev(p)), c(rep(0,length(p)), rev(y)), col="#72C6EF")

t <- mean(sa)/sqrt(var(sa)/length(sa))
lines(c(t, t), c(-1.5, dt(t, 9)))
axis(side=1, at=t)

2.21は棄却域には入っていないようなので、p値は0.05より少し大きい値となっていることが予想できます

Rの関数で確認してみましょう

#再掲
t.test(sa)

t値は2.21でp値は0.055です

p>0.05で有意差なし・・・という結果になりました

p値

上記の検定は両側検定でした

したがって求めたp値は両側の裾の面積になります

x <- seq(-5, 5, length=100)
plot(
    x, dt(x, 9), type = "l",
    xlim=c(-5, 5), ylim=c(0, 0.4),
    xlab="", ylab="", xaxt="n"
)

t <- mean(sa)/sqrt(var(sa)/length(sa))
p <- seq(t, 5, length=100)
y <- dt(p, 9)
polygon(c(p,rev(p)), c(rep(0,length(p)), rev(y)), col="yellow")

p2 <- seq(-t, -5, length=100)
y <- dt(p2, 9)
polygon(c(p2,rev(p2)), c(rep(0,length(p2)), rev(y)), col="yellow")

axis(side=1, at=c(-t, t)

両側検定の場合は、正確には以下のように描かなければなりません

両側の黄色い部分の合計面積が0.05となります

#グラフ
x <- seq(-5, 5, length=100)
plot(
    x, dt(x, 9), type = "l",
    xlim=c(-5, 5), ylim=c(0, 0.4),
    xlab="", ylab="", xaxt="n"
)

q = qt(0.025, 9, lower.tail=F)
p <- seq(q, 5, length=100)
y <- dt(p, 9)
polygon(c(p,rev(p)), c(rep(0,length(p)), rev(y)), col="#72C6EF")

q = qt(0.025, 9, lower.tail=F)
p2 <- seq(-q, -5, length=100)
y <- dt(p2, 9)
polygon(c(p2,rev(p2)), c(rep(0,length(p2)), rev(y)), col="#72C6EF")

lines(c(t, t), c(-1.5, dt(t, 9)))
lines(c(-t, -t), c(-1.5, dt(-t, 9)))
axis(side=1, at=c(-t, t))

上側検定

post > pre を有意水準5%で証明してみます

対立仮説2:(post – pre)の平均 > 0

t値は両側検定で求めた値と同じです

#再掲
t <- mean(sa)/sqrt(var(sa)/length(sa))
print(t)

これは一側の検定ですの、下のグラフの緑色部分のみがp値として算出されます

つまり両側検定のときの半分のp値になります

#グラフ
x <- seq(-5, 5, length=100)
plot(
    x, dt(x, 9), type = "l",
    xlim=c(-5, 5), ylim=c(0, 0.4),
    xlab="", ylab="", xaxt="n"
)

t <- mean(sa)/sqrt(var(sa)/length(sa))
p <- seq(t, 5, length=100)
y <- dt(p, 9)
polygon(c(p,rev(p)), c(rep(0,length(p)), rev(y)), col="yellow")

lines(c(t, t), c(-1.5, dt(t, 9)))
axis(side=1, at=t)

有意差検定を行う場合は、このように統計量とp値との関係性をイメージしながら検証されることをお勧めします。その場合、Rは最適なツールになりますよ!

同じ有意水準5%でも片側検定だと有意な結果になりました。統計のマジックという人もいるかもしれませんが、別にトリックではないので、解析結果を見誤ったりしないように注意が必要ですね。。

コメント欄 『間違い』や『分かりにくい部分』などのご意見もお寄せください

タイトルとURLをコピーしました