在数据分析中,确定数据遵循的分布类型及其参数是一项基本且重要的任务。本文将介绍一种方法,通过构建频率分布图和图形视图来确定数据的分布类型,包括正态分布、对数正态分布和伽马分布,并比较原始分布与计算出的分布,以选择最佳匹配。
首先,构建值的频率分布。其次,通过分布的图形视图来确定其参数。最后,将原始分布与计算出的分布进行比较,以选择最佳匹配。
构建频率分布(概率分布)是使用排序关联容器(例如C++中的std::map)的典型方式。确定分布参数的方法可能不止一种,但本文只提出了一种——通过特征点的坐标来确定。所有分布都属于双参数族。对于它们中的每一个,除了主要的概率密度函数外,两个参数还与众数(最频繁值)方程相关。因此,两个点足以解决两个方程的系统。其中一个是显而易见的——这是对应于众数的峰值(曲线的顶点)。第二个应该属于曲线的上升(左侧)或下降(右侧)分支,在对分布参数最敏感的位置。这些位置是半高宽位置。在这些位置中,最好选择右侧的,因为对于对数正态和伽马分布,下降分支通常是更平坦的,这在横坐标上提供了更低的测量误差。
设M为众数的x坐标,X为右侧半高宽点的x坐标。对于正态分布,有:
μ = M,
σ = sqrt((X - M) / (2 * ln(2)))
对于对数正态分布,有:
μ = ln(M),
σ = sqrt((ln(X) - ln(M)) / (2 * ln(2)))
对于伽马分布,有:
a = (X / M)^(1 / (1 - ln(X / M))),
b = M * a
比较两条曲线通常使用皮尔逊方法。
不幸的是,现实世界是肮脏、混乱和复杂的。由于一些物理和技术原因,实际分布通常远非理想。此外,它们通常是嘈杂的,有时是调制的。此外,它们可能被裁剪或扭曲到左侧(见DNA片段分布和DNA片段的读取分布;所有数据都是真实的)。选择下降分支上的第二个点可以消除扭曲和剪切。但在所有其他情况下,找到特征点的“真实”坐标是一项非平凡任务。
构建一个“平滑”虚拟曲线,使其最接近数据,根据特定标准,即虚拟点与其真实原型之间的等距(“平滑”意味着整个曲线上虚拟点之间的最小可能总距离)。通常有三种方法可以解决这个问题:非线性回归、贝塞尔曲线和移动平均。现在让考虑特殊任务的简化:(a)每个真实点都有一个唯一的横坐标,(b)在包括特征点的关键区域内,真实点沿着x轴均匀分布,(c)每个虚拟点对应一个真实点(具有相同的横坐标,但有修正的纵坐标)。在这些条件下,回归和贝塞尔分析看起来过于复杂,因此资源密集。此外,贝塞尔曲线在调制分布的情况下无能为力。最好的解决方案似乎是使用基于滚动平均的样条方法。
简单移动平均和简单移动中位数拼接器实现为从移动窗口继承的简单类,并且具有单个Push()方法。窗口长度总是奇数。构造函数采用半长度,因此对于最小半长度1,最小窗口长度为3。
移动平均和移动中位数拼接器实现为从移动窗口继承的简单类,并且具有单个Push()方法。窗口长度总是奇数。构造函数采用半长度,因此对于最小半长度1,最小窗口长度为3。
在2.5 GHz笔记本电脑上测量了调用对数正态参数的运行时间。整个算法的最佳和最差运行时间,平均1000次重复,如表所示:
数据(图在片段分布中) | 真实点数 | 实现最佳窗口长度的迭代次数 | 最佳窗口长度 | 时间,微秒 |
---|---|---|---|---|
19 | 2985 | 2 | 3(最小) | 46 |
11 | 8730 | 2 | 3(最小) | 80 |
17* | 5600 | 6 | 39 | 2500 |
*“嘈杂”数据用于本文的插图。