简介:精算师的“飞行模拟器”
欢迎来到 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 中的概率、分位数与汇总统计量”章节。