5 min read

TA_class_1128

預備

library(tidyverse)

資料匯入與匯出

不同格式的檔案需要用相對應的 package 來處理匯入與匯出,比如 tidyverse 裡的 readr 只適用於 .txt.csv 檔案。

readxl 可以處理 .xls.xlsx 檔案。

數據可能是以不同的分隔符號紀錄在檔案裡,需要用相對應的函數來處理。比如最常見的三種是逗號(,)分隔,分號(;)分隔,以及 Tab 分隔。

# comma separated
import.data <- readr::read_csv("file_name.csv")
# semicolon separated
import.data <- readr::read_csv2("file_name.csv")
# tab separated
import.data <- readr::read_tsv("file_name.csv")

以 CPS 資料為例,如果下載 .txt 格式。

# .txt file
cps <- read_tsv("cps09mar.txt", col_names = FALSE) # 匯入的資料並沒有變數名稱,且以 tab 分隔
write_csv(cps, "output.txt") # 匯出會自動新增變數名稱,並以逗號分隔
read_csv("output.txt") # 因為是逗號分隔,所以讀取資料時,改成用 read_csv()

如果下載 .xlsx 格式。使用 readxl package 處理。

# install.packages("readxl")
library(readxl)

cps <- read_xlsx("cps09mar.xlsx")
write_csv(cps, "output.csv") # 匯出以 csv 格式儲存

如果要儲存 R 跑完的資料,使用 save(),放物件名稱,並指定存入的檔名,小心副檔名不要打錯。 load() 指定讀入的檔案,可以觀察到 Environment 出現儲存的物件名稱。

df1 <- mpg
df2 <- msleep
df3 <- txhousing

save(df1, df2, df3,  
     file = "mydata.RData")

load("mydata.RData")

缺失值

以 ggplot2::msleep 為例,有許多變數的觀測值並沒有被紀錄。

ggplot2::msleep
#> # A tibble: 83 x 11
#>    name   genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
#>    <chr>  <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
#>  1 Cheet~ Acin~ carni Carn~ lc                  12.1      NA        NA      11.9
#>  2 Owl m~ Aotus omni  Prim~ <NA>                17         1.8      NA       7  
#>  3 Mount~ Aplo~ herbi Rode~ nt                  14.4       2.4      NA       9.6
#>  4 Great~ Blar~ omni  Sori~ lc                  14.9       2.3       0.133   9.1
#>  5 Cow    Bos   herbi Arti~ domesticated         4         0.7       0.667  20  
#>  6 Three~ Brad~ herbi Pilo~ <NA>                14.4       2.2       0.767   9.6
#>  7 North~ Call~ carni Carn~ vu                   8.7       1.4       0.383  15.3
#>  8 Vespe~ Calo~ <NA>  Rode~ <NA>                 7        NA        NA      17  
#>  9 Dog    Canis carni Carn~ domesticated        10.1       2.9       0.333  13.9
#> 10 Roe d~ Capr~ herbi Arti~ lc                   3        NA        NA      21  
#> # ... with 73 more rows, and 2 more variables: brainwt <dbl>, bodywt <dbl>

使用 dplyr::drop_na() 可以將有遺漏的數據整筆刪除。

df <- msleep %>% drop_na()
df
#> # A tibble: 20 x 11
#>    name   genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
#>    <chr>  <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
#>  1 Great~ Blar~ omni  Sori~ lc                  14.9       2.3       0.133   9.1
#>  2 Cow    Bos   herbi Arti~ domesticated         4         0.7       0.667  20  
#>  3 Dog    Canis carni Carn~ domesticated        10.1       2.9       0.333  13.9
#>  4 Guine~ Cavis herbi Rode~ domesticated         9.4       0.8       0.217  14.6
#>  5 Chinc~ Chin~ herbi Rode~ domesticated        12.5       1.5       0.117  11.5
#>  6 Lesse~ Cryp~ omni  Sori~ lc                   9.1       1.4       0.15   14.9
#>  7 Long-~ Dasy~ carni Cing~ lc                  17.4       3.1       0.383   6.6
#>  8 North~ Dide~ omni  Dide~ lc                  18         4.9       0.333   6  
#>  9 Big b~ Epte~ inse~ Chir~ lc                  19.7       3.9       0.117   4.3
#> 10 Horse  Equus herbi Peri~ domesticated         2.9       0.6       1      21.1
#> 11 Europ~ Erin~ omni  Erin~ lc                  10.1       3.5       0.283  13.9
#> 12 Domes~ Felis carni Carn~ domesticated        12.5       3.2       0.417  11.5
#> 13 Golde~ Meso~ herbi Rode~ en                  14.3       3.1       0.2     9.7
#> 14 House~ Mus   herbi Rode~ nt                  12.5       1.4       0.183  11.5
#> 15 Rabbit Oryc~ herbi Lago~ domesticated         8.4       0.9       0.417  15.6
#> 16 Labor~ Ratt~ herbi Rode~ lc                  13         2.4       0.183  11  
#> 17 Easte~ Scal~ inse~ Sori~ lc                   8.4       2.1       0.167  15.6
#> 18 Thirt~ Sper~ herbi Rode~ lc                  13.8       3.4       0.217  10.2
#> 19 Pig    Sus   omni  Arti~ domesticated         9.1       2.4       0.5    14.9
#> 20 Brazi~ Tapi~ herbi Peri~ vu                   4.4       1         0.9    19.6
#> # ... with 2 more variables: brainwt <dbl>, bodywt <dbl>

也可以針對某些變數的缺失值做處理。

df2 <- msleep %>% drop_na(sleep_rem)
df2
#> # A tibble: 61 x 11
#>    name   genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
#>    <chr>  <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
#>  1 Owl m~ Aotus omni  Prim~ <NA>                17         1.8      NA       7  
#>  2 Mount~ Aplo~ herbi Rode~ nt                  14.4       2.4      NA       9.6
#>  3 Great~ Blar~ omni  Sori~ lc                  14.9       2.3       0.133   9.1
#>  4 Cow    Bos   herbi Arti~ domesticated         4         0.7       0.667  20  
#>  5 Three~ Brad~ herbi Pilo~ <NA>                14.4       2.2       0.767   9.6
#>  6 North~ Call~ carni Carn~ vu                   8.7       1.4       0.383  15.3
#>  7 Dog    Canis carni Carn~ domesticated        10.1       2.9       0.333  13.9
#>  8 Goat   Capri herbi Arti~ lc                   5.3       0.6      NA      18.7
#>  9 Guine~ Cavis herbi Rode~ domesticated         9.4       0.8       0.217  14.6
#> 10 Grivet Cerc~ omni  Prim~ lc                  10         0.7      NA      14  
#> # ... with 51 more rows, and 2 more variables: brainwt <dbl>, bodywt <dbl>

符號意義

\(\sim\): is distributed as

\(\Phi(\cdot)\): 標準常態分配的累積機率函數

\(\Phi^{-1}(\cdot)\): 標準常態分配的 quantile 函數

note that:

\(\Phi(-c) = 1 - \Phi(c) = \alpha\)

\(c = -\Phi^{-1}(\alpha) = \Phi^{-1}(1 - \alpha)\)

\(T_n(\cdot)\): t 分配,自由度 n 的累積機率函數

\(T^{-1}_n(\cdot)\): t 分配,自由度 n 的 quantile 函數

note that:

\(T_n(-c) = 1 - T_n(c) = \alpha\)

\(c = -T_n^{-1}(\alpha) = T_n^{-1}(1 - \alpha)\)

標準常態分配與 t 分配

信賴區間

  1. 單一母體平均數的區間估計

假設母體常態分配,以 \(95\%\) 信賴區間,雙尾檢定為例。

母體變異數已知

\[ \begin{aligned} &X_1, X_2,\dots, X_n \sim N(\mu, \sigma^2)\\\\ &\frac{\bar X_n - \mu}{\frac{\sigma}{\sqrt n}} \sim N(0,1)\\\\ &c = -\Phi^{-1}(0.025) = \Phi^{-1}(0.975)\\\\ &0.95 = P(-c < \frac{\bar X_n - \mu}{\frac{\sigma}{\sqrt n}} < c)\\\\ &0.95 = P(\bar X_n - c\frac{\sigma}{\sqrt{n}} < \mu < \bar X_n + c\frac{\sigma}{\sqrt{n}}) \end{aligned} \]

在母體常態分配,平均值為 0, 標準差為 2,隨機抽出 100 個樣本,找出此次抽樣的信賴區間,並畫圖表示。

# 隨機抽樣
random.sample = rnorm(n = 100, mean = 0, sd = 2)
# 樣本平均數
sample.mean <- mean(random.sample)
sample.mean
#> [1] 0.005825125
# 標準常態分配 2.5% 和 97.5% 的位置
z_0.025 <- qnorm(0.025, mean = 0, sd = 1)
z_0.975 <- qnorm(0.975, mean = 0, sd = 1)
round(c(z_0.025, z_0.975), 2)
#> [1] -1.96  1.96
const <- z_0.975
# 信賴區間
lower <- sample.mean - const * 2 / sqrt(100)
upper <- sample.mean + const * 2 / sqrt(100)
round(c(lower, upper), 4)
#> [1] -0.3862  0.3978
# 畫圖
## 法一
ggplot() +
  geom_point(aes(random.sample, dnorm(random.sample, 0, 2))) +
  geom_vline(xintercept = c(lower, upper),
             linetype = "dashed",
             color = "red")

## 法二
data <- tibble(x = random.sample, 
               y = dnorm(random.sample, 0, 2))

ggplot(data) +
  geom_point(aes(x, y)) +
  geom_vline(xintercept = c(lower, upper),
             linetype = "dashed",
             color = "red",
             size = 1)

## 法三
data <- tibble(x = rnorm(100, 0, 2), 
               y = dnorm(x, 0, 2))

ggplot(data) +
  geom_point(aes(x, y)) +
  geom_vline(xintercept = c(mean(data$x) - const * 2 / sqrt(100),
                            mean(data$x) + const * 2 / sqrt(100)),
             linetype = "dashed",
             color = "red",
             size = 1)

母體變異數未知

\[ \begin{aligned} &X_1, X_2,\dots, X_n \sim N(\mu, \sigma^2)\quad S_n^2 = \frac{1}{n-1}\sum(X_i-\bar X_n)^2\\\\ &\frac{\bar X_n - \mu}{\frac{S_n}{\sqrt n}} \sim t_{n-1}\\\\ &c = -T_{n-1}^{-1}(0.025) = T_{n-1}^{-1}(0.975)\\\\ &0.95 = P(-c < \frac{\bar X_n - \mu}{\frac{S_n}{\sqrt n}} < c)\\\\ &0.95 = P(\bar X_n - c\frac{S_n}{\sqrt{n}} < \mu < \bar X_n + c\frac{S_n}{\sqrt{n}}) \end{aligned} \]

在母體常態分配,平均值為 0, 標準差未知,隨機抽出 100 個樣本,找出此次抽樣的信賴區間,並畫圖表示。

# 隨機抽樣
random.sample = rnorm(n = 100, mean = 0, sd = 2)
# 樣本平均數
sample.mean <- mean(random.sample)
sample.mean
#> [1] 0.02228167
# S_n
S_n <- sqrt(sum((random.sample - sample.mean) ** 2) / (100 - 1))
S_n
#> [1] 1.592378
# t 分配 2.5% 和 97.5% 的位置
t_0.025 <- qt(0.025, df = 100 - 1)
t_0.975 <- qt(0.975, df = 100 - 1)
round(c(t_0.025, t_0.975), 2)
#> [1] -1.98  1.98
const <- t_0.975
# 信賴區間
lower <- sample.mean - const * S_n / sqrt(100)
upper <- sample.mean + const * S_n / sqrt(100)
round(c(lower, upper), 2)
#> [1] -0.29  0.34
# 畫圖
## 法一
ggplot() +
  geom_point(aes(random.sample, dnorm(random.sample, 0, 2))) +
  geom_vline(xintercept = c(lower, upper),
             linetype = "dashed",
             color = "red")

驗證

模擬重複抽樣 100 次,每次抽樣均抽出 100 組樣本,驗證雙尾檢定下 95% 的信賴區間。

在觀察到樣本前,預期樣本的信賴區間有 95% 的可能涵蓋母體平均數, 我們檢驗在重複抽樣 100 次後,有多少次抽樣的信賴區間包含母體平均數。

# 模擬
simulate <- map(1:100, ~ tibble(r = rnorm(100, 0, 2)))
lower_upper <- simulate %>%
  map(~ tibble(lower = mean(.x$r) - qnorm(0.975, 0, 1) * 2 / sqrt(100),
               upper = mean(.x$r) - qnorm(0.025, 0, 1) * 2 / sqrt(100))) %>%
  bind_rows()

lower_upper
#> # A tibble: 100 x 2
#>      lower upper
#>      <dbl> <dbl>
#>  1 -0.366  0.418
#>  2 -0.558  0.226
#>  3 -0.655  0.129
#>  4 -0.144  0.640
#>  5 -0.518  0.266
#>  6 -0.0542 0.730
#>  7  0.0739 0.858
#>  8 -0.605  0.179
#>  9 -0.273  0.511
#> 10 -0.553  0.231
#> # ... with 90 more rows
lower_upper %>% 
  mutate(row = row_number()) %>%
  ggplot() +
  geom_segment(aes(x = lower, y = row,
                   xend = upper, yend = row),
               color = "violetred4",
               size = 1) +
  labs(x = "confidence interval",
       y = "simulation")

confidence <- lower_upper %>% 
  mutate(cover = 
           case_when(lower > 0 | upper < 0 ~ 0, 
                     TRUE ~ 1)) %>%
  summarise(cover = sum(cover))

confidence
#> # A tibble: 1 x 1
#>   cover
#>   <dbl>
#> 1    96

本次模擬的結果有 96% 的信賴區間涵蓋母體平均數。

作業

請應用區間估計對資料的變數做說明。

補充

  1. 單一母體變異數的區間估計

假設母體常態分配,以 \(95\%\) 信賴區間,雙尾檢定為例。

Hint: \(\chi^2_n\) 系列的函數為 *chisq()

母體平均數已知

\[ \begin{aligned} &X_1, X_2,\dots, X_n \sim N(\mu, \sigma^2)\\\\ &\frac{\sum(X_i - \mu)^2}{\sigma^2} \sim \chi^2_{n}\\\\ &0.95 = P(\chi^2_{n, 0.025} < \frac{\sum(X_i - \mu)^2}{\sigma^2} < \chi^2_{n, 0.975})\\\\ &0.95 = P(\frac{\sum(X_i - \mu)^2}{\chi^2_{n, 0.975}} < \sigma^2 < \frac{\sum(X_i - \mu)^2}{\chi^2_{n, 0.025}}) \end{aligned} \]

母體平均數未知

\[ \begin{aligned} &X_1, X_2,\dots, X_n \sim N(\mu, \sigma^2)\\\\ &\frac{\sum(X_i - \bar X_n)^2}{\sigma^2} \sim \chi^2_{n-1}\\\\ &0.95 = P(\chi^2_{n-1, 0.025} < \frac{\sum(X_i - \bar X_n)^2}{\sigma^2} < \chi^2_{n-1, 0.975})\\\\ &0.95 = P(\frac{\sum(X_i - \bar X_n)^2}{\chi^2_{n-1, 0.975}} < \sigma^2 < \frac{\sum(X_i - \bar X_n)^2}{\chi^2_{n-1, 0.025}}) \end{aligned} \]