簡介:精算師的「飛行模擬器」

歡迎來到 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\) 值。

分步流程:

  1. 使用 runif(1) 從 \(U \sim Uniform(0,1)\) 生成一個隨機數 \(u\)。
  2. 令 \(F(x) = u\)。
  3. 通過計算逆函數求解 \(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:抽取後是否放回?(TRUEFALSE)。

實際應用:

Bootstrap(自助法): 為了估算估計量 (estimator) 的性質(如其偏差或方差),我們可以使用「Bootstrap 法」。這涉及從我們的數據中進行有放回抽樣 (replace = TRUE),藉此模擬從總體中抽取新樣本的過程。

排列檢定 (Permutation Tests): 為了進行非參數假設檢定,我們通常進行無放回抽樣 (replace = FALSE) 來「洗牌」數據,看看某些模式是否純屬偶然發生。

5. 模擬結果與理論的比較

一旦有了模擬數據,大綱要求你將其與已知分佈進行比較,特別是作為中心極限定理 (CLT) 一部分的正態分佈。

如果你從任何分佈中模擬 1,000 個樣本平均值,CLT 告訴我們這些平均值的分佈應該看起來像一條正態曲線。在 R 中,你可以通過以下方式檢查:

  1. 為模擬數據繪製直方圖:hist(sim_data)
  2. 疊加密度曲線:lines(density(sim_data))
  3. 使用 Q-Q 圖查看點是否落在一直線上(這將在「探索性圖表」章節中進一步討論)。

核心要點: 模擬讓我們能夠驗證 CLT。即使原始數據嚴重偏斜(如指數分佈),隨著樣本量增加,這些模擬值的平均值也會開始呈現「正態」分佈。

總結與快速複習

應避免的常見陷阱:

  • 標準差 vs 方差: 記住 rnorm() 需要的是 \(\sigma\),但很多考題提供的是 \(\sigma^2\)。必要時請使用 sqrt()
  • 忘記 set.seed(): 如果不設置種子值,你的數值答案將與評分方案 (mark scheme) 不同。
  • ITM 邏輯: 記住 ITM 總是從 runif() 開始。你正在將一個「概率」轉化回「數值」。

註:如需了解如何計算這些模擬樣本的具體概率或匯總統計量,請參閱「R 中的概率、分位數與匯總統計量」章節。