一、分佈相關函數

設隨機變數 \(X\) 的機率密度函數為 $\phi(x)= \begin{cases} \dfrac{x-2}{2}, & 2\le x<3,\\ \dfrac{2-x/3}{2}, & 3\le x\le 6,\\ 0, & otherwise. \end{cases}$

本題希望同學可以將數學上的分段函數轉換為 R 中的函數,並進一步透過繪圖、積分與效率比較,理解機率密度函數與分布函數的概念。

(1) 兩種寫法與效率比較(10 分)

  1. 使用 function() 與巢狀 ifelse() 撰寫分段函數,命名為 phif(x)
  2. 使用 index 邏輯向量的方式撰寫同一個分段函數,命名為 phif2(x)。此方法的想法是:先建立一個全部為 0 的向量,再針對不同區間填入對應的函數值。
  3. 使用一組測試資料確認 phif(x)phif2(x) 的結果是否一致。

請簡要說明:兩種寫法的結果是否相同?哪一種寫法在可讀性或效率上較有優勢?

回答:_______________________________

# 方法一:巢狀 ifelse() 寫法
phif <- function(x) {
  ifelse(x < 2, 0,
         ifelse(x < 3, (x - 2) / 2,
                ifelse(x <= 6, (2 - x / 3) / 2, 0)))
}

# 方法二:index 邏輯向量寫法
phif2 <- function(x) {
  y <- numeric(length(x))

  idx1 <- x >= 2 & x < 3
  idx2 <- x >= 3 & x <= 6

  y[idx1] <- (x[idx1] - 2) / 2
  y[idx2] <- (2 - x[idx2] / 3) / 2

  y
}

x_test <- c(1, 2, 2.5, 3, 4, 6, 7)

phif(x_test)
phif2(x_test)

identical(phif(x_test), phif2(x_test))

(2) 累積分布函數(10 分)

定義積分函數 $\\Phi(x)=P(X\le x)=\int_{-\infty}^{x}\phi(t)dt.$ 。由於 $\phi(x)$ 在 $x<2$ 時為 0,在 $x>6$ 後總面積已累積到 1,因此: $\Phi(x)= \begin{cases} 0, & x<2,\\ \int_2^x \phi(t),dt, & 2\le x\le 6,\\ 1, & x>6. \end{cases}$

請使用 integrate()sapply() 撰寫向量化函數 Phi(x)。最後,以你所所的程式畫出 $\phi(x)$ 與 $\Phi(x)$ 的圖形,以確認函數是否正確。

# 向量化積分函數 Phi(x)
Phi <- function(xv) {
  F <- function(xi) {
    if (xi < 2) {
      0
    } else if (xi > 6) {
      1
    } else {
      integrate(phif, lower = 2, upper = xi)$value
    }
  }

  sapply(xv, F)
}

Phi(c(1, 2, 3, 4, 6, 7))

二、小型車通行費矩陣

icmile 分別為高速公路部分交流道名稱及其簡化公里點。假設小型車通行費採下列簡化規則: $T(d)= \begin{cases} 0, & 0 \le d \le 20,\\[4pt] 1.2(d-20), & 20 < d \le 200,\\[4pt] 1.2(180)+0.9(d-200), & d > 200. \end{cases}$

其中 $d$ 為兩交流道之間的公里差,最後通行費使用 floor() 取整數。

(1) 通行費函數(10 分)

撰寫函數 toll_by_distance(d),用來根據公里差 $d$ 計算小型車通行費。接著撰寫函數 toll(x, y),用來計算第 x 個交流道到第 y 個交流道之間的小型車通行費。

# 基本資料
ic <- c("基隆", "汐止", "內湖", "圓山", "台北", "林口",
        "桃園", "新竹", "台中", "嘉義", "台南", "高雄")

mile <- c(0.0, 10.8, 16.4, 23.2, 25.0, 41.5,
          49.2, 91.0, 174.2, 272.9, 319.6, 367.6)

# 小型車通行費函數
toll_by_distance <- function(d) {
  fee <- ifelse(d <= 20, 0,
                ifelse(d <= 200,
                       1.2 * (d - 20),
                       1.2 * 180 + 0.9 * (d - 200)))
  floor(fee)
}

# 任兩交流道通行費
toll <- function(x, y) {
  d <- abs(mile[x] - mile[y])
  toll_by_distance(d)
}

# 測試
toll(1, 2)
toll(1, 12)