1 基本題 (共 90 分)

1.1 常態分配檢驗函數 (50 分)

請撰寫一個函數 checkNormality() 用來檢視輸入的 vector (x) 趨近常態分配的程度。checkNormality() 達成此目的的方式是將傳入的資料繪製成直方圖,再於直方圖之上疊加常態分配的機率密度函數曲線。

要求:

  • 繪製直方圖時,需依據傳入的 vector x 長度自動調整長條的數量 (可透過 geom_histogram() 的參數 bins 進行設置。請自行實驗找出適合的方式去自動調整 bins 的數量,讓繪製出來的直方圖盡量平滑沒有斷裂1)
  • 請使用 geom_point() 繪製常態分配機率密度之曲線。常態分配的參數需依據傳入的 vector x 之平均與標準差決定。
library(ggplot2)

checkNormality <- function(x) {
  # Modify the code below
  x_seq <- seq(min(x), max(x), by = 0.01)
  y <- dnorm(x_seq, mean = mean(x), sd = sd(x))
  norm <- data.frame(x = x_seq, y = y)
  
  bins <- as.integer(length(x)^0.57)
  plt <- ggplot() +
    geom_histogram(mapping = aes(x = x,
                                 y = ..density..),
                   bins = bins, fill = "pink", color = "grey") +
    geom_point(data = norm, mapping = aes(x, y), size = 0.1)
  return(plt)
}

###### Do not modify the code below ########
set.seed(1914)
d <- rnorm(200)
checkNormality(d)
d <- rnorm(1000)
checkNormality(d)
d <- runif(1000)
checkNormality(d)

範例輸出:

1.2 因果結構模擬 (30 分)

請根據上圖的因果結構 (箭號代表因果關係) 模擬出 G, P, C 這三個變項的資料,並將結果儲存成一個 data frame df1

  • 請模擬出 500 筆觀察值
  • 假定 G, P, C 皆來自常態分配
    • G 來自標準常態分配 (平均 = 0, 標準差 = 1)
    • P 與 C 皆來自標準差 = 1 的常態分配
  • 假定「G 對 P」、「G 對 C」以及「P 對 C」的因果影響強度是相同的,且影響皆為正向的 (增加 P 會造成 C 跟著增加,而非減少。其它組合亦然)。
set.seed(1)
##### Do not modify the code above ######
# Write your code here
N <- 500
G <- rnorm(N)
P <- rnorm(N, mean = G)
C <- rnorm(N, mean = G + P)
df1 <- data.frame(G = G, P = P, C = C)

##### Do not modify the code below #####
head(df1)
#>            G          P           C
#> 1 -0.6264538 -0.5491507 -0.04063941
#> 2  0.1836433 -0.1132253  1.18234985
#> 3 -0.8356286 -2.0188709 -3.72527710
#> 4  1.5952808  1.6065735  3.41258588
#> 5  0.3295078  1.3211088  1.72001223
#> 6 -0.8204684  0.7734991 -1.70961817

1.3 兩兩散布圖 (10 分)

請使用上一題的 df1 繪製出此圖:

# Write your code here
plotPairs <- function(df) 
    psych::pairs.panels(df, lm = T, smooth = F, ellipses = F, rug = F, hist.col = "#F8766D")
plotPairs(df1)

2 進階選答題 (共 30 分)

2.1 因果結構分析 (10 分)

上方的因果結構中,G, P, U, C 可以被歸類成三種因子:混淆因子 (Confounder)、對撞因子 (Collider) 與中介因子 (Mediator)

請將 G, P, U, C 這四個因子進行分類 (請在正確的類別填入 G, P, U, C):

  • Confounder: G, U
  • Collider: P, C
  • Mediator: P

2.2 因果結構模擬 (20 分)

請根據上圖的因果結構模擬出 G, P, U, C 這四個變項的資料,並將結果儲存成一個 data frame df2

  • 請模擬出 500 筆觀察值
  • 假定 G, P, U, C 皆來自常態分配
    • G 與 U 來自標準常態分配 (平均 = 0, 標準差 = 1)
    • P 與 C 來自標準差 = 1 的常態分配
  • 所有的因果影響皆是正向的 (增加 P 會造成 C 跟著增加,而非減少。其它組合亦然),但每組因果關係的影響強度不一定相同:
    • U 對 P 的影響強度 (係數) 為 1
    • U 對 C 的影響強度 (係數) 為 1
    • G 對 P 的影響強度 (係數) 為 2
    • G 對 C 的影響強度 (係數) 為 0.5
    • P 對 C 的影響強度 (係數) 為 2
set.seed(1)
##### Do not modify the code above ######
N <- 500
e_UP <- 1
e_UC <- 1
e_GP <- 2
e_GC <- 0.5
e_PC <- 2

G <- rnorm(N)
U <- rnorm(N)
P <- rnorm(N, mean = e_GP*G + e_UP*U)
C <- rnorm(N, mean = e_GC*G + e_PC*P + e_UC*U)
df2 <- data.frame(G = G, U = U, P = P, C = C)

##### Do not modify the code below
head(df2)
# Should print out:
#>            G           U           P          C
#> 1 -0.6264538  0.07730312 -0.04063941  0.5328409
#> 2  0.1836433 -0.29686864  1.18234985  1.2343397
#> 3 -0.8356286 -1.18324224 -3.72527710 -8.1580295
#> 4  1.5952808  0.01129269  3.41258588  6.6930951
#> 5  0.3295078  0.99160104  1.72001223  5.1353315
#> 6 -0.8204684  1.59396745 -1.70961817 -2.4174775
#>            G           U           P          C
#> 1 -0.6264538  0.07730312 -0.04063941  0.5328409
#> 2  0.1836433 -0.29686864  1.18234985  1.2343397
#> 3 -0.8356286 -1.18324224 -3.72527710 -8.1580295
#> 4  1.5952808  0.01129269  3.41258588  6.6930951
#> 5  0.3295078  0.99160104  1.72001223  5.1353315
#> 6 -0.8204684  1.59396745 -1.70961817 -2.4174775

  1. 假定 vector x 是來自連續型機率分配如常態分配、均等分配等。↩︎