跳轉到

7.5 檢定與信賴區間的對偶#

本節目標#

  • 理解檢定與信賴區間的對偶關係:同一份資料的兩種敘述方式
  • 用程式窮舉驗證「95% CI 不含 \(\mu_0\) ⇔ 雙尾檢定 \(p < 0.05\)」不是口號,而是精確的等價
  • 搞清楚對偶關係在什麼條件下成立、什麼條件下不成立
  • 收束全章:檢定回答「是否」,信賴區間回答「多大」,兩者都要報告

問題:同一個結論,兩種說法#

回到第 7.2 節的填充機例子。資料:

499.8 493.1 498.2 497.2 494.8 487.0 494.5 493.3 498.1
495.6 495.9 494.5 496.7 496.7 486.9 503.3

r.t_test(x, mu=500) 的輸出同時給了兩個東西:

t = -4.4826, df = 15, p-value = 0.0004382
95 percent confidence interval:
 493.139 497.561
  • p 值說:「如果平均填充量真的是 500,看到這麼極端的資料的機率只有 0.00044」——這是一個關於證據強度的陳述。
  • 信賴區間說:「平均填充量 95% 信心落在 493.1 到 497.6 公克之間」——這是一個關於效應大小的陳述。

同一份分析,卻是兩種語言。它們之間有沒有必然的對應關係?

答案是:有,而且是可以精確證明的等價關係。這就是本節的主題。


理論:對偶關係#

雙尾情形#

考慮檢定 \(H_0: \mu = \mu_0\) 對 \(H_1: \mu \ne \mu_0\),信賴水準 \(1-\alpha\)(例如 95%,\(\alpha = 0.05\))。

\((1-\alpha)\) 信賴區間的定義是:所有不被拒絕的 \(\mu_0\) 的集合。理由如下:

  • 對某個 \(\mu_0\),檢定統計量 \(T = (\bar{X}-\mu_0)/(s/\sqrt{n})\)。拒絕域是 \(|T| > t_{1-\alpha/2, n-1}\),即

$$ |\bar{X}-\mu_0| > t_{1-\alpha/2,\,n-1} \cdot \frac{s}{\sqrt{n}}

$$ - 把不等式反解,\(\mu_0\) 不被拒絕的條件是

$$ \bar{X} - t_{1-\alpha/2}\frac{s}{\sqrt{n}} \;\le\; \mu_0 \;\le\; \bar{X} + t_{1-\alpha/2}\frac{s}{\sqrt{n}}

$$ - 這正是 \((1-\alpha)\) 信賴區間的公式。

所以:

對偶定理(雙尾):\(\mu_0\) 落在 \((1-\alpha)\) 信賴區間內 \(\Longleftrightarrow\) 雙尾檢定不拒絕 \(H_0: \mu = \mu_0\)。

用 \(\alpha = 0.05\) 說,就是:

$$ \mu_0 \notin \mathrm{CI}_{95\%} \;\Longleftrightarrow\; p < 0.05

$$ 「顯著」與「CI 不含 \(\mu_0\)」是同一件事的兩種說法,沒有任何近似、沒有任何選擇。

單尾情形#

對偶關係在單尾也成立,但方向要對:

  • \(H_1: \mu < \mu_0\)(左尾)配單邊信賴區間 \((-\infty, U]\):\(\mu_0 > U\) \(\Longleftrightarrow\) 拒絕。
  • \(H_1: \mu > \mu_0\)(右尾)配單邊信賴區間 \([L, \infty)\):\(\mu_0 < L\) \(\Longleftrightarrow\) 拒絕。

這裡有個關鍵陷阱:雙尾檢定配雙邊 CI,單尾檢定配單邊 CI。如果拿雙尾檢定的 p 值去對單邊 CI,會系統性地搞錯結論。第 7.2 節已經展示過:單尾左檢定的 CI 是 \((-\infty, 497.1685]\),上界比雙尾的 497.561 更緊。

這個對偶為什麼重要?#

  1. 兩種語言各有所長。p 值適合回答「有沒有證據反對 \(H_0\)」;CI 適合回答「效應有多大、精確度如何」。只報 p 值會讓讀者無法判斷效應的實務重要性。
  2. CI 揭露了檢定看不見的資訊。檢定只給「是/否」,CI 給「數字與範圍」。
  3. 對偶讓「p 值」的意義變得可操作。當有人問「p = 0.048 算顯著嗎?」,真正該問的是「相對應的 CI 是什麼?它離無效值有多遠?」

動手:用程式窮舉驗證#

口頭說「它們等價」不夠,我們用程式掃過一整串 \(\mu_0\) 來檢查。

雙尾:掃 400 個 \(\mu_0\)#

import rstatistics as r
x = [499.8,493.1,498.2,497.2,494.8,487.0,494.5,493.3,498.1,
     495.6,495.9,494.5,496.7,496.7,486.9,503.3]

bad = 0
for k in range(400):
    mu0 = 488.0 + k * 0.05          # 488.00, 488.05, ..., 507.95
    t = r.t_test(x, mu=mu0)
    lo, hi = t.conf_int
    inside = (lo <= mu0 <= hi)       # mu0 在 95% CI 內?
    sig = (t.p_value < 0.05)        # 雙尾檢定顯著?
    if inside == sig:               # 兩者一致才對
        bad += 1
print("不一致的 mu0 個數:", bad)
不一致的 mu0 個數: 0

400 個 \(\mu_0\),零個不一致。 對偶關係不是近似,是精確等價。

單尾:兩種方向各掃 400 個#

print("=== 單尾 less ===")
bad = 0
for k in range(400):
    mu0 = 488.0 + k * 0.05
    t = r.t_test(x, mu=mu0, alternative='less')
    lo, hi = t.conf_int              # 單邊 CI: (-inf, hi]
    if (mu0 > hi) != (t.p_value < 0.05):
        bad += 1
print("不一致的 mu0 個數:", bad)

print("=== 單尾 greater ===")
bad = 0
for k in range(400):
    mu0 = 488.0 + k * 0.05
    t = r.t_test(x, mu=mu0, alternative='greater')
    lo, hi = t.conf_int              # 單邊 CI: [lo, inf)
    if (mu0 < lo) != (t.p_value < 0.05):
        bad += 1
print("不一致的 mu0 個數:", bad)
=== 單尾 less ===
不一致的 mu0 個數: 0
=== 單尾 greater ===
不一致的 mu0 個數: 0

換個檢定,關係一樣成立#

對偶不是單樣本 t 檢定的專利。把第 7.3、7.4 節的檢定全部拿來掃:

A = [12.1,12.4,11.9,12.3,12.0,12.2,11.8,12.5,12.1,12.0,11.9,12.3]
B = [9.8,11.6,12.9,10.4,11.2,13.1,9.5,12.4,10.8,11.7]

print("=== 兩樣本 Welch:掃 mu0(平均差)===")
bad = 0
for k in range(200):
    mu0 = -0.5 + k * 0.02
    t = r.t_test(A, B, mu=mu0)
    lo, hi = t.conf_int
    if (lo <= mu0 <= hi) == (t.p_value < 0.05):
        bad += 1
print("不一致個數:", bad)

before = [148,132,141,155,129,138,150,144,136,147,133,142]
after  = [132,124,128,140,120,130,138,135,126,136,125,130]
print("=== 配對 t 檢定:掃 mu0(平均差)===")
bad = 0
for k in range(200):
    mu0 = 5.0 + k * 0.05
    t = r.t_test(before, after, paired=True, mu=mu0)
    lo, hi = t.conf_int
    if (lo <= mu0 <= hi) == (t.p_value < 0.05):
        bad += 1
print("不一致個數:", bad)
=== 兩樣本 Welch:掃 mu0(平均差)===
不一致個數: 0
=== 配對 t 檢定:掃 mu0(平均差)===
不一致個數: 0

比例檢定也是一樣#

print("=== 比例檢定:掃 p0 ===")
bad = 0
for xi in range(0, 101):
    for p0 in [i/100 for i in range(1, 100)]:
        b = r.prop_test(xi, 100, p0)
        lo, hi = b.conf_int
        if (lo <= p0 <= hi) == (b.p_value < 0.05):
            bad += 1
print("不一致個數:", bad)
=== 比例檢定:掃 p0 ===
不一致個數: 0

101 個成功次數 × 99 個 \(p_0\) = 9,999 種組合,全部一致。

看一眼分界線在哪#

print("mu0      p-value      95% CI                mu0 在 CI 內?  p<0.05?")
for mu0 in [490.0, 493.0, 493.139, 495.35, 497.561, 500.0]:
    t = r.t_test(x, mu=mu0)
    lo, hi = t.conf_int
    print(f"{mu0:7.3f}  {t.p_value:.6f}  [{lo:.3f}, {hi:.3f}]   {str(lo<=mu0<=hi):>10}  {str(t.p_value<0.05):>6}")
mu0      p-value      95% CI                mu0 在 CI 內?  p<0.05?
490.000  0.000117  [493.139, 497.561]        False    True
493.000  0.038724  [493.139, 497.561]        False    True
493.139  0.050004  [493.139, 497.561]         True   False
495.350  1.000000  [493.139, 497.561]         True   False
497.561  0.050004  [493.139, 497.561]         True   False
500.000  0.000438  [493.139, 497.561]        False    True

分界點就是 CI 的端點:\(\mu_0 = 493.139\)(CI 下界)時 p 值剛好 0.050004(不顯著),往左一點就變顯著。CI 端點就是 p = \(\alpha\) 的等價物。

順帶看單尾的分界:

for mu0 in [495.0, 497.1685, 497.2, 500.0]:
    t = r.t_test(x, mu=mu0, alternative='less')
    lo, hi = t.conf_int
    print(f"{mu0:8.4f}  p={t.p_value:.6f}  CI=({lo}, {hi:.4f}]  拒絕? {t.p_value<0.05}")
   495.0000  p=0.629755  CI=(-inf, 497.1685]  拒絕? False
 497.1685  p=0.050001  CI=(-inf, 497.1685]  拒絕? False
  497.2000  p=0.047381  CI=(-inf, 497.1685]  拒絕? True
  500.0000  p=0.000219  CI=(-inf, 497.1685]  拒絕? True

單尾的規則是「\(\mu_0\) 大於 CI 上界就拒絕」——注意方向是「\(>\)」而不是「不在區間內」,因為單邊區間的另一半是無窮大。


動手:對偶關係的例外#

對偶關係是精確的,但不是所有檢定都自動滿足它。有兩類例外,兩者都值得親眼看到。

例外一:精確二項檢定會有「不一致」#

把上面的比例掃描換成 r.binom_test(精確二項法):

print("=== 精確二項:掃 p0 ===")
bad = []
for xi in range(0, 101):
    for p0 in [i/100 for i in range(1, 100)]:
        b = r.binom_test(xi, 100, p0)
        lo, hi = b.conf_int
        if (lo <= p0 <= hi) == (b.p_value < 0.05):
            bad.append((xi, p0))
print("不一致個數:", len(bad), " 前 5 個:", bad[:5])
不一致個數: 54  前 5 個: [(2, 0.07), (7, 0.03), (8, 0.15), (10, 0.05), (12, 0.2)]

9,999 種組合中有 54 種不一致。 為什麼?

看其中一例:\(x = 12\)、\(n = 100\)、\(p_0 = 0.2\)。

b = r.binom_test(12, 100, 0.2)
print("p =", b.p_value)
print("CI =", b.conf_int)
print("0.2 在 CI 內?", b.conf_int[0] <= 0.2 <= b.conf_int[1])
p = 0.04534895995356885
CI = [0.06356890256115919, 0.20023568361996846]
0.2 在 CI 內? True

p = 0.0453 < 0.05(應該「顯著」),但 \(p_0 = 0.2\) 落在 CI 內(應該「不顯著」)。矛盾。

原因:這裡有兩個不同的「雙尾」定義。

  • Clopper–Pearson 區間是把單尾精確檢定在 \(\alpha/2\) 與 \(1-\alpha/2\) 兩端反解出來的結果(即「\(p_0\) 落在區間內當且僅當不拒絕」)。
  • R 的雙尾精確 p 值則是用「機率排序法」算的:把所有機率不大於觀察值之機率的結果全部加總。

在對稱的連續分布裡這兩種定義會給出同樣的結論;但二項分布是離散的、機率有並列(很多不同的 \(k\) 有相同的機率),兩種定義就不再互相對應。於是在 p 值剛好落在 0.05 附近的組合上,「p < 0.05」與「\(p_0\) 在不在 CI 內」就可能分道揚鑣。

順帶一提,精確二項的 p 值是由有限個結果的機率加總而成,因此它的取值是離散的格點,不像連續分布的 p 值那樣可以取到任意精細的值。這正是「\(p = 0.048\)」與「\(p = 0.052\)」之間可能藏著完全不同的證據結構的原因。

實務含意:報告精確二項檢定的結果時,除了 p 值也給出 CI,是特別重要的——因為 p 值在 0.05 附近的判讀不穩定,而 CI 把「距離無效值多遠」講清楚了。

例外二:p 值與 CI 的「\(\alpha\) 預算」必須一致#

假設你做了雙尾檢定(\(\alpha = 0.05\)),卻報告90% 的信賴區間。這時:

  • 雙尾 p 值 < 0.05 \(\Longleftrightarrow\) \(\mu_0\) 不在 95% CI 內
  • 但與 90% CI 沒有對應關係(90% CI 一定包含在 95% CI 內,所以「不在 90% CI 內」比「不在 95% CI 內」更嚴格)

對偶關係要求 CI 的信賴水準 = 1 − 雙尾 α(這裡 \(\alpha = 0.05\))。用 conf_level=0.90 做雙尾 \(\alpha = 0.05\) 的檢定,兩者就對不上了。

t = r.t_test(x, mu=500, conf_level=0.90)
print(t.conf_int)          # 90% CI
t2 = r.t_test(x, mu=500, conf_level=0.95)
print(t2.conf_int)         # 95% CI
[493.53148309049413, 497.1685169095059]
[493.1389528228482, 497.56104717715186]

r.t_test 的 conf_level 預設就是 0.95,正好對應雙尾 \(\alpha = 0.05\)。不要隨手改它,否則對偶關係就斷了。

例外三:只有雙尾才對稱#

第 7.4 節提過:單尾檢定把整個 \(\alpha\) 預算押在一邊,所以單尾 p 值恰為雙尾的一半。如果用雙尾 p 值去對單邊 CI,會得到錯誤結論:

t_less = r.t_test(x, mu=500, alternative='less')
print("單尾 p =", t_less.p_value, " 單邊 CI =", t_less.conf_int)
單尾 p = 0.00021912062541166845  單邊 CI = [-inf, 497.1685169095059]

如果誤以為「\(\mu_0 = 500\) 不在單邊 CI 內 → 顯著」,你會得到對的結論,但那是巧合:雙尾 p = 0.000438 也 < 0.05。在臨界附近這種巧合就會失效。永遠讓 CI 的型態與檢定的 alternative 對應。


與 R 對照#

R 的 t.test 回傳的 conf.int 與 p.value 之間有完全相同的對偶關係。R 端重跑同一組掃描:

x <- c(499.8,493.1,498.2,497.2,494.8,487.0,494.5,493.3,498.1,495.6,495.9,494.5,496.7,496.7,486.9,503.3)
bad <- 0
for (k in 0:399) {
  mu0 <- 488 + k*0.05
  tt <- t.test(x, mu=mu0)
  ci <- tt$conf.int
  if ((ci[1] <= mu0 && mu0 <= ci[2]) == (tt$p.value < 0.05)) bad <- bad + 1
}
cat("two-sided mismatches:", bad, "\n")
bad <- 0
for (k in 0:399) {
  mu0 <- 488 + k*0.05
  tt <- t.test(x, mu=mu0, alternative="less")
  if ((mu0 > tt$conf.int[2]) != (tt$p.value < 0.05)) bad <- bad + 1
}
cat("less mismatches:", bad, "\n")
two-sided mismatches: 0 
less mismatches: 0 

精確二項的「不一致」在 R 裡完全一樣:

bad <- 0
for (xi in 0:100) for (p0 in (1:99)/100) {
  b <- binom.test(xi, 100, p=p0)
  ci <- b$conf.int
  if ((ci[1] <= p0 && p0 <= ci[2]) == (b$p.value < 0.05)) bad <- bad + 1
}
cat("binom mismatches:", bad, "\n")
binom mismatches: 54 

分界點的數值也一致:

for (mu0 in c(490.0, 493.0, 495.35, 500.0)) {
  tt <- t.test(x, mu=mu0)
  cat(sprintf("%.3f  %.6f  [%.3f, %.3f]\n", mu0, tt$p.value, tt$conf.int[1], tt$conf.int[2]))
}
490.000  0.000117  [493.139, 497.561]
493.000  0.038724  [493.139, 497.561]
495.350  1.000000  [493.139, 497.561]
500.000  0.000438  [493.139, 497.561]

R 的 t.test 物件結構不同:tt$conf.int、tt$p.value、tt$statistic、tt$parameter;rstatistics 則是 t.conf_int、t.p_value、t.statistic、t.parameter。


小結#

  • 對偶定理(雙尾):\(\mu_0\) 不在 \((1-\alpha)\) CI 內 \(\Longleftrightarrow\) 雙尾檢定 \(p < \alpha\)。這是精確等價,本節用 400 個 \(\mu_0\)、9,999 個比例組合窮舉驗證,零例外。
  • 單尾也成立,但規則不同:左尾是「\(\mu_0 >\) CI 上界」,右尾是「\(\mu_0 <\) CI 下界」,且 CI 必須是單邊的。
  • 對偶關係要求 CI 的信賴水準 = 1 − 雙尾 α(這裡 \(\alpha = 0.05\)),且 CI 型態與 alternative 對應;否則會出錯。
  • 精確二項檢定有 54/9,999 的不一致:R 的雙尾精確 p 值用「機率排序法」,Clopper–Pearson 區間則是「反解單尾檢定」,兩種「雙尾」定義在離散分布上並不互為反函數。所以精確檢定特別需要同時報告 CI。
  • 實務收束:檢定回答「是否」,CI 回答「多大」,兩個都要報告。 只報 p 值,讀者無法判斷效應的實務意義;只報 CI,讀者不知道你的決策門檻在哪。兩者合起來才是完整的證據。

練習#

  1. 對第 7.2 節的 16 瓶資料,寫一段程式驗證:對所有 \(\mu_0 \in [480, 520]\)(步長 0.01),「\(\mu_0\) 不在 95% CI 內」與「雙尾 p < 0.05」完全一致。並找出 p 值最接近 0.05 的那個 \(\mu_0\)。提示:p 值是 \(\mu_0\) 的凸函數,會在 \(\bar{x}\) 附近最小。
  2. 把 conf_level 改成 0.90,重跑上面的對偶掃描。會出現不一致嗎?為什麼?提示:CI 變窄了,「不在 90% CI 內」比「不在 95% CI 內」嚴格。
  3. 用 r.t_test 對 7.3 節的 A、B 兩組資料做單尾右側檢定(alternative='greater'),然後把單邊 CI 的下界與 p = 0.05 的臨界 \(\mu_0\) 比較,驗證它們相等。提示:CI 下界 = \(\bar{x}_A - \bar{x}_B - t_{0.95}\cdot s_W\)。
  4. 用 r.binom_test 找出所有「p 值 < 0.05 但 \(p_0\) 在 CI 內」的組合(\(n = 50\))。這些組合有什麼共同特徵?提示:\(p_0\) 靠近 CI 端點時最容易發生。
  5. 找一篇你手上的研究報告或新聞,只報了 p 值或只報了 CI。幫它補上另一半,用 rstatistics 重新算一次,並寫下你會怎麼改寫那句結論。提示:好的寫法範例:「新藥使血壓平均下降 10.9 mmHg(95% CI:9.2 至 12.7;雙尾 p < 0.001),效果遠大於臨床認定的 5 mmHg 門檻」。