高效经验CDF计算/存储

0 投票
1 回答
868 浏览
提问于 2025-04-16 07:31

我正在尝试预先计算几个随机变量的分布。具体来说,这些随机变量是基因组中某些位置上函数的结果,所以每个变量大概会有10亿到10亿个值。因为这些函数的变化比较平滑,所以我觉得只在每隔2个、10个或100个碱基上计算一次,应该不会损失太多的准确性,但无论如何,样本数量会非常庞大。我的计划是为每个函数预先计算分位数表(可能是百分位数),然后在主程序执行时引用这些表,以避免每次运行时都要重新计算这些分布统计数据。

不过,我不太明白怎么能轻松做到这一点:存储、排序和处理一个包含10亿个浮点数的数组并不现实,但我想不到其他不丢失分布信息的方法。有没有什么办法可以在不需要将整个样本分布存储在内存中的情况下测量分位数呢?

1 个回答

2

我同意@katriealex的观点:找一个有强大统计背景的人来问问。

你可以很轻松地计算最小值、最大值、平均值和标准差,而不需要占用太多内存。(关于平均值和标准差:可以使用Knuth的方法:

delta = x - m[n-1]
m[n] = m[n-1] +  1/n * delta
S[n] = S[n-1] + (x[n] - m[n])*delta
mean = m[n]
std dev = sqrt(S[n]/n)

这个方法可以避免在简单计算标准差时出现的浮点溢出或下溢问题,比如说 S1 = x[k]的总和,S2 = x[k]的平方和,然后试图计算标准差 = sqrt(S2/N - S1^2/N^2)。更多信息可以查看 维基百科。)

可能还有其他面向流的数据算法可以用来计算分布的更高特征矩,但我不知道具体是什么。

或者,你也可以使用 直方图 技术,设置足够的区间来描述分布情况。

撰写回答