何时使用模拟?

机器算法验证 模拟
2022-02-11 12:16:05

所以这是一个非常简单和基本的问题。然而,当我在学校的时候,我很少注意课堂上模拟的整个概念,这让我对这个过程有点害怕。

  1. 你能用外行的方式解释模拟过程吗?(可用于生成数据、回归系数等)

  2. 使用模拟时有哪些实际情况/问题?

我希望给出的任何示例都在 R 中。

4个回答

定量模型通过以下方式模拟世界的某些行为:(a) 通过对象的一些数值属性来表示对象,以及 (b) 以明确的方式组合这些数字以产生也表示感兴趣的属性的数值输出。

图 1:确定性模型

在这个示意图中,左边的三个数字输入组合在一起,在右边产生一个数字输出。数字线表示输入和输出的可能值;点表示使用中的特定值。如今,数字计算机通常执行计算,但它们不是必需的:模型是用铅笔和纸计算的,或者是通过在木材、金属和电子电路中构建“模拟”设备来计算的。

例如,也许前面的模型将其三个输入相加。 R这个模型的代码可能看起来像

inputs <- c(-1.3, 1.2, 0) # Specify inputs (three numbers)
output <- sum(inputs)     # Run the model
print(output)             # Display the output (a number)

它的输出只是一个数字,

-0.1

我们无法完美地了解这个世界:即使模型恰好按照世界的方式运作,我们的信息也不完美,世界上的事物也会发生变化。(随机)模拟帮助我们理解模型输入的这种不确定性和变化应该如何转化为输出的不确定性和变化。他们通过随机改变输入、为每个变化运行模型并总结集体输出来做到这一点。

“随机”并不意味着任意。 建模者必须指定(无论是否有意,无论是显式还是隐式)所有输入的预期频率。输出频率提供了最详细的结果摘要。

图:随机输入

相同的模型,显示为随机输入和生成的(计算的)随机输出。

该图使用直方图显示频率,以表示数字的分布。左侧显示了输入的预期输入频率,而右侧显示了通过多次运行模型获得的计算输出频率。

确定性模型的每组输入都会产生可预测的数字输出。然而,当模型用于随机模拟时,输出是一个分布(如右图所示的长灰色)。输出分布的分布告诉我们,当输入变化时,模型输出如何变化。

前面的代码示例可以像这样修改以将其转换为模拟:

n <- 1e5 # Number of iterations
inputs <- rbind(rgamma(n, 3, 3) - 2,
                runif(n, -2, 2),
                rnorm(n, 0, 1/2))
output <- apply(inputs, 2, sum)
hist(output, freq=FALSE, col="Gray")

其输出已汇总为通过使用这些随机输入迭代模型生成的所有数字的直方图:

直方图

在幕后观察,我们可能会检查传递给此模型的许多随机输入中的一些:

rownames(inputs) <- c("First", "Second", "Third")
print(inputs[, 1:5], digits=2)

输出显示前五个100,000迭代,每次迭代一列:

        [,1]  [,2]  [,3]  [,4]  [,5]
First  -1.62 -0.72 -1.11 -1.57 -1.25
Second  0.52  0.67  0.92  1.54  0.24
Third  -0.39  1.45  0.74 -0.48  0.33

可以说,第二个问题的答案是模拟可以在任何地方使用。 实际上,运行模拟的预期成本应该低于可能的收益。理解和量化可变性有什么好处?这有两个主要领域很重要:

  • 寻求真理,如科学和法律。一个数字本身是有用的,但了解这个数字的准确性或确定性要有用得多。

  • 做决定,就像在商业和日常生活中一样。决策平衡风险和收益。风险取决于不良结果的可能性。随机模拟有助于评估这种可能性。

计算系统已经变得足够强大,可以重复执行现实的、复杂的模型。软件已经发展到支持快速轻松地生成和汇总随机值(如第二个R示例所示)。这两个因素在过去 20 年(甚至更长时间)结合在一起,以至于模拟成为常规。剩下的就是帮助人们 (1) 指定适当的输入分布和 (2) 理解输出的分布。那是人类思想的领域,到目前为止,计算机对此几乎没有帮助。

首先,让我说你的问题没有单一的答案。有多个示例说明何时可以(或必须)使用模拟。我将尝试在下面举几个例子。其次,请注意有多种方法可以定义“模拟”,因此答案至少部分取决于您选择的定义。

例子:

1.您是贝叶斯统计学家,因此模拟是您进行统计的首选方法。贝叶斯统计有一些非基于模拟的方法,但是在绝大多数情况下,您使用模拟。要了解更多信息,请查看Gelman 的“贝叶斯数据分析”一书(或其他可能的资源)。

2.您要评估统计方法的性能。假设您设计了一些统计测试T设计用于估计某些参数θ给定经验数据。现在你想检查它是否真的做了你想让它做的事情。您可以获取一些数据样本并对这些数据进行测试 - 但是如果您需要统计测试来了解θ,那么你怎么知道你的测试是否工作正常只有数据..?当然,您可以将结果与其他统计测试的估计值进行比较,但是如果其他测试不估计怎么办θ正确..?在这种情况下,您可以使用模拟。您可以做的是根据您的参数生成一些假数据θ然后检查您的估计值是否与真实值相同θ(因为您选择了它,所以您提前知道)。使用模拟还可以让您检查不同的场景(样本大小、不同的数据分布、数据中不同的噪声量等)。

3.您没有数据或数据非常有限。假设你想知道核战争的可能结果是什么。不幸的是(希望)之前没有核战争,所以你没有任何数据。在这种情况下,您可以使用计算机模拟对现实做出一些假设,然后让计算机在核战争发生的地方创建平行的虚拟现实,这样您就有了一些可能结果的样本。

4. 你的统计模型不适合软件或者很复杂。例如,Gelman 和 Hill 在“使用回归和多级/分层模型的数据分析”中提倡这种方法,他们将基于模拟的贝叶斯估计描述为回归建模的“下一步”。

5. 你想了解一个复杂过程的可能结果。想象一下,您想预测某个复杂过程的未来结果,但问题是您的过程行为是混乱的,并且给定不同的输入,您会得到不同的输出,而可能的输入数量非常多。一般来说,情况确实如此,因为蒙特卡罗模拟方法是由二战期间研究核弹的物理学家和数学家发明的。通过模拟,您可以尝试不同的输入并收集样本,以便大致了解可能的结果。

6. 你的数据不符合某些统计方法的标准,例如它有偏态分布,但它应该是正常的。在某些情况下,这并不是真正的问题,但有时确实是,因此发明了基于模拟的方法,如引导程序

7. 根据实际情况检验理论模型。你有一个理论模型来描述一些过程,例如通过社交网络传播流行病。您可以使用模型生成一些数据,以便您可以比较模拟是否与真实数据相似。Lada Adamic在她的Coursera 课程中给出了社交网络分析的多个示例(请参阅此处的一些演示)。

8.生成“假设0”数据。您生成一个假(随机)数据,以便将真实数据与它进行比较。如果您的数据有任何显着影响或趋势,那么它应该与随机生成的数据不同。Buja 等人提倡这种方法。(2009) 在他们的论文“探索性数据分析和模型诊断的统计推断”中,他们提出了如何使用图来促进探索性数据分析和假设检验(另请参阅实现这些想法的nullabor R 包的文档)。

我认为对 TrynnaDoStat 的回答的讨论很好地说明了这一点:当问题无法通过分析解决时(例如,层次模型中参数的后验分布),或者当我们太恼火而无法投入时间时,我们会使用模拟分析地制定解决方案。

根据我在这个网站上观察到的情况,统计学家之间“令人讨厌到足以模拟”的阈值差异很大。显然,像@whuber 这样的人可以瞥一眼问题并立即看到解决方案,而像我这样的凡人则必须仔细考虑问题,并且可能在编写模拟程序来完成艰苦的工作之前做一些阅读。

请记住,模拟不一定是灵丹妙药,因为对于大型数据集或复杂模型,或两者兼而有之,您将花费大量(计算机)时间来估计和检查您的模拟。如果您可以通过一个小时的仔细考虑来实现相同的目标,那肯定不值得付出努力。

当您无法获得某事物(例如分布)的封闭形式,或者您想要一种具体且快速的方法来获得该事物时,通常会进行模拟。

例如,假设我正在使用一个变量运行逻辑回归X解释Y. 我知道系数的分布β为了X根据 MLE 理论是渐近正态的。但是假设我对两个估计概率的差异感兴趣f(β)=P(Y=1|X=1)P(Y=1|X=0). 推导出这个函数的精确分布可能非常困难(或不可能),但是,因为我知道β,我可以模拟来自β并将其插入f(β)得到一个经验分布。