設隨機變數 \(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 中的函數,並進一步透過繪圖、積分與效率比較,理解機率密度函數與分布函數的概念。
function() 與巢狀 ifelse() 撰寫分段函數,命名為 phif(x)。phif2(x)。此方法的想法是:先建立一個全部為 0 的向量,再針對不同區間填入對應的函數值。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))
定義積分函數 $\\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))
ic 和 mile 分別為高速公路部分交流道名稱及其簡化公里點。假設小型車通行費採下列簡化規則:
$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() 取整數。
撰寫函數 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)