信頼区間を理解したい

Statistics
Author

Kentaro Kamada

Published

September 21, 2024

信頼区間の意味がわかりやすいシミュレーション

パッケージの読み込み

library(tidyverse)

設定

  • 100人の研究者がいる
  • 各研究者がそれぞれデータをとる。N=500の調査を行う
  • データは平均0.5、標準偏差0.1の正規分布に従うと仮定
set.seed(1)

data <- 
  tibble(
    # 100人の研究者がいる
    researcher_ID = 1:100,
    # 各研究者がそれぞれデータをとる。N=500の調査を行う。
    data = map(researcher_ID, \(researcher_ID) rnorm(500, 0.5, 0.1))
  )

data
# A tibble: 100 × 2
   researcher_ID data       
           <int> <list>     
 1             1 <dbl [500]>
 2             2 <dbl [500]>
 3             3 <dbl [500]>
 4             4 <dbl [500]>
 5             5 <dbl [500]>
 6             6 <dbl [500]>
 7             7 <dbl [500]>
 8             8 <dbl [500]>
 9             9 <dbl [500]>
10            10 <dbl [500]>
# ℹ 90 more rows

データから信頼区間を計算

  • 各研究者のデータの平均値、標準誤差、信頼区間を計算
  • 信頼区間が真値(0.5)を含むかどうかを判定
data2 <- 
  data |> 
  # 各研究者のデータの平均値、標準誤差、信頼区間を計算
  mutate(
    mean = map_dbl(data, \(data) mean(data)),
    se = map_dbl(data, \(data) sd(data) / sqrt(length(data))),
    lower = mean - 1.96 * se,
    upper = mean + 1.96 * se
  ) |>  
  # 信頼区間が0.5を含むかどうかを判定
  mutate(
    flg = case_when(
      0.5 < lower | upper < 0.5  ~ 'Error',
      .default = 'Not Error'
    )
  )

data2
# A tibble: 100 × 7
   researcher_ID data         mean      se lower upper flg      
           <int> <list>      <dbl>   <dbl> <dbl> <dbl> <chr>    
 1             1 <dbl [500]> 0.502 0.00453 0.493 0.511 Not Error
 2             2 <dbl [500]> 0.495 0.00473 0.486 0.505 Not Error
 3             3 <dbl [500]> 0.500 0.00452 0.491 0.509 Not Error
 4             4 <dbl [500]> 0.497 0.00479 0.488 0.506 Not Error
 5             5 <dbl [500]> 0.501 0.00464 0.492 0.510 Not Error
 6             6 <dbl [500]> 0.502 0.00459 0.493 0.511 Not Error
 7             7 <dbl [500]> 0.509 0.00476 0.500 0.518 Not Error
 8             8 <dbl [500]> 0.494 0.00451 0.486 0.503 Not Error
 9             9 <dbl [500]> 0.499 0.00440 0.491 0.508 Not Error
10            10 <dbl [500]> 0.497 0.00446 0.488 0.505 Not Error
# ℹ 90 more rows

各研究者の信頼区間を図示

  • 点推定値は0.5に近いのもあれば、遠いのもある
  • 信頼区間が真値(0.5)を含まない、「不運」な研究者は、5人 / 100人(5%)
    • 95%の研究者は真の値を拾える、という意味
  • 実際には自分が「不運」な研究者かもしれないし、信頼区間の端ギリギリで真値を拾っているだけかもしれない
# 図示
data2 |> 
  ggplot(aes(mean, researcher_ID, xmin = lower, xmax = upper, color = flg))+
  geom_vline(xintercept = 0.5, linetype = 'dashed')+
  geom_pointrange()+
  theme_bw()+
  theme(legend.position = 'bottom')