如何处理来自模拟/敏感性分析的大量输出数据集?

计算科学 Python 数据集 随机数生成 模拟
2021-12-22 16:19:07

有点相关,但我认为这个问题足以证明一个单独的问题是正确的。

作为背景知识,我来自观察/统计流行病学背景,使用已经收集的数据,因此即使是我们的大型数据集也往往是离散的、不可分割的因此,我从未真正学会如何处理来自模拟的大量数据。

我的问题如下:

我正在研究感染系统的分区模型,涉及一个由约 10 个微分方程和约 40 个参数共享的系统。这些参数中的大多数不是常数,而是统计估计值,因此可以从分布中得出。这是我想做的事情之一 - 看看系统有多少变化纯粹是由于参数估计中的不确定性造成的。

这涉及从每个分布多次运行模型采样的数值解,以覆盖参数空间。如果这只是一个随机模拟,我可能会输出一个巨大的或数千个可以用脚本处理的小数据文件。我当前的问题是如何管理输出数据,因为我需要知道绘制了哪些参数值。

现在,我非常快速而肮脏的方法是将参数值与数值结果一起输出,这意味着如果我将系统运行 100 步,我最终会得到一个 100 行 50 列的数据集 - 但其中有 40 列是相同的数字一遍又一遍地重复。这似乎非常浪费,并且导致文件非常大。

当然有更好的方法来做到这一点?目前,其中大部分是在 Python 中实现的。

3个回答

您可以尝试使用非常基本的关系数据库之类的东西。您可以使用单独的标记每个输出文件,例如序列号,然后维护一个单独的文件,该文件在每一行中都包含使用的键和参数。

如果您正在自动处理数据,则必须使用一级间接,但与您的模型相比,这仍然为您节省了相当多的表条目。

在旁注中,听起来您只是通过对参数空间进行采样来进行参数敏感性分析如果您试图最小化 ODE 积分结果的某些函数,您可能需要查看也积分系统变量相对于参数的导数的方法。我最近发表了一篇关于此的论文(对不起,无耻的插件),如果不是对其他方法的引用,您可能会发现它很有趣。

如果你想分析你的结果对输入空间变化的敏感性,你会想要像Dakota或 SUSA(在本文中描述)。这些代码允许您在从分配给它们的概率分布中采样参数的同时,将模拟作为黑盒多次运行。输出是统计结果:您得到输出值的平均值和标准差。SUSA 还将根据灵敏度等对输入参数进行排名。

对于 ODE,您可能需要使用具有特定求解器的Sundials包,这些求解器允许对 ODE 中的参数进行敏感性分析。Assimulo包为这些求解器提供了 Python 绑定

由于主要目标是事后计算一些统计数据,因此正确的方法是为您之后可能想要计算的内容确定一组丰富的附加统计数据,然后在每个批次中更新这些统计数据。然后,您永远不需要存储旧数据,尽管您误将一些数据存储为备份或用于独立假设检验。

相关统计数据通常由一组数字组成,这些数字计算为所选功能(关键特征、关键特征的乘积、存在关键指标的关键特征等)的总和或最大值或最小值,以及总和的项目总数(最大化,最小化)结束。这使您可以随时进行相应的均值、协方差矩阵和感兴趣的概率表,以进行后续统计解释。

如果您想进行某种 5 折交叉验证,例如验证您的统计结论,请制作 5 个这样的集合,将每个新项目随机分配给五个集合之一。然后结合 5 个集合中的 4 个的统计数据进行预测,并在第五个集合中检查其准确性(每个集合轮流担任此角色)。这给出了 5 个准确度估计值。