簡介:精算師的「飛行模擬器」
歡迎來到 CS1 課程中最具實用性的章節之一!在 Paper B 中,你不再只是單純地計算概率,而是在建立模型。你可以將模擬隨機變量 (simulating random variables) 想像成精算師的「飛行模擬器」。在保險公司推出新產品之前,他們會透過模擬成千上萬次可能的索償情況來進行「試飛」,以測試公司的償付能力。在本章中,我們將學習如何使用 R 的內置函數以及逆變換法 (Inverse Transform Method) 來生成這些「試飛」數據。
1. 「r」系列函數
在 R 中,大多數概率分佈都有一個專門用於生成隨機樣本的函數。這些函數統統以字母 r(代表 "random")開頭。
其一般結構通常為:r[分佈名稱](n, [參數]),其中 \(n\) 是你想要生成的觀測值數量。
常見離散分佈 (Discrete Distributions)
- 二項分佈 (Binomial): rbinom(n, size, prob) — 從 \(X \sim Bin(size, prob)\) 中生成 \(n\) 個樣本。
- 泊松分佈 (Poisson): rpois(n, lambda) — 從 \(X \sim Pois(\lambda)\) 中生成 \(n\) 個樣本。
- 幾何分佈 (Geometric): rgeom(n, prob) — 生成第一次成功之前的失敗次數。
- 負二項分佈 (Negative Binomial): rnbinom(n, size, prob) — 生成達到特定成功次數之前的失敗次數。
常見連續分佈 (Continuous Distributions)
- 正態分佈 (Normal): rnorm(n, mean, sd) — 注意 R 使用的是標準差 (standard deviation) \(\sigma\),而非方差 (variance) \(\sigma^2\)。
- 指數分佈 (Exponential): rexp(n, rate) — 使用率參數 (rate parameter) \(\lambda\)。
- Gamma 分佈: rgamma(n, shape, rate) — 也可以使用 scale (\(1/rate\))。
- 均勻分佈 (Uniform): runif(n, min, max) — 在上限與下限之間生成數值。
- 對數正態分佈 (Lognormal): rlnorm(n, meanlog, sdlog)。
- Beta 分佈: rbeta(n, shape1, shape2)。
快速複習:如果你需要從平均值為 5 的泊松分佈中模擬 100 個索償數據,你會使用 rpois(100, 5)。
2. 可重複性:set.seed() 函數
電腦實際上無法生成真正的「隨機」數字,而是使用演算法來創建「偽隨機」數字。如果你運行 rnorm(5, 0, 1) 兩次,你會得到不同的結果。對於需要批改你作品的考官來說,這是一個問題!
解決方案: 使用 set.seed()。在你的模擬代碼之前輸入 set.seed(123)(或任何整數),就能確保每次運行代碼時,R 都會產生完全相同的「隨機」數字。
重要考試貼士: 務必檢查試卷是否指定了種子值 (seed)。如果題目要求「Use a seed of 42」,那麼你代碼的第一行必須是 set.seed(42)。
3. 逆變換法 (Inverse Transform Method, ITM)
有時候,你可能會被要求在不使用特定「r」函數的情況下,手動生成隨機變量。對於連續和離散變量,逆變換法都是標準的處理方式。
ITM 的邏輯
每個累積分佈函數 (CDF) \(F(x)\) 的輸出值都在 0 到 1 之間。如果我們從 Uniform(0,1) 均勻分佈中取出一個隨機數 \(U\),我們就可以「反向推算」出對應該概率的 \(x\) 值。
分步流程:
- 使用 runif(1) 從 \(U \sim Uniform(0,1)\) 生成一個隨機數 \(u\)。
- 令 \(F(x) = u\)。
- 通過計算逆函數求解 \(x\):\(x = F^{-1}(u)\)。
指數分佈示例:
其 CDF 為 \(F(x) = 1 - exp(-\lambda x)\)。
1. 令 \(u = 1 - exp(-\lambda x)\)
2. \(1 - u = exp(-\lambda x)\)
3. \(\ln(1 - u) = -\lambda x\)
4. \(x = -\frac{1}{\lambda} \ln(1 - u)\)
在 R 中,如果你有一個均勻隨機變量的向量 u,你的代碼會寫成:x <- - (1/lambda) * log(1 - u)。
你知道嗎? 由於 \(U\) 和 \(1-U\) 都服從 \(Uniform(0,1)\) 分佈,精算師通常會將公式簡化為 \(x = -\frac{1}{\lambda} \ln(u)\)。
4. 從現有數據中抽樣
課程大綱提到,不僅要能從理論分佈中生成樣本,還要能從現有的數據集中抽樣。我們使用 sample() 函數來實現這一點。
sample() 的關鍵參數:
- x:要從中抽樣的數據或向量。
- size:要抽取多少個項目。
- replace:抽取後是否放回?(TRUE 或 FALSE)。
實際應用:
Bootstrap(自助法): 為了估算估計量 (estimator) 的性質(如其偏差或方差),我們可以使用「Bootstrap 法」。這涉及從我們的數據中進行有放回抽樣 (replace = TRUE),藉此模擬從總體中抽取新樣本的過程。
排列檢定 (Permutation Tests): 為了進行非參數假設檢定,我們通常進行無放回抽樣 (replace = FALSE) 來「洗牌」數據,看看某些模式是否純屬偶然發生。
5. 模擬結果與理論的比較
一旦有了模擬數據,大綱要求你將其與已知分佈進行比較,特別是作為中心極限定理 (CLT) 一部分的正態分佈。
如果你從任何分佈中模擬 1,000 個樣本平均值,CLT 告訴我們這些平均值的分佈應該看起來像一條正態曲線。在 R 中,你可以通過以下方式檢查:
- 為模擬數據繪製直方圖:hist(sim_data)。
- 疊加密度曲線:lines(density(sim_data))。
- 使用 Q-Q 圖查看點是否落在一直線上(這將在「探索性圖表」章節中進一步討論)。
核心要點: 模擬讓我們能夠驗證 CLT。即使原始數據嚴重偏斜(如指數分佈),隨著樣本量增加,這些模擬值的平均值也會開始呈現「正態」分佈。
總結與快速複習
應避免的常見陷阱:
- 標準差 vs 方差: 記住 rnorm() 需要的是 \(\sigma\),但很多考題提供的是 \(\sigma^2\)。必要時請使用 sqrt()!
- 忘記 set.seed(): 如果不設置種子值,你的數值答案將與評分方案 (mark scheme) 不同。
- ITM 邏輯: 記住 ITM 總是從 runif() 開始。你正在將一個「概率」轉化回「數值」。
註:如需了解如何計算這些模擬樣本的具體概率或匯總統計量,請參閱「R 中的概率、分位數與匯總統計量」章節。