中位数的中位数 - 这是可能的还是有不同的方法
Posted
技术标签:
【中文标题】中位数的中位数 - 这是可能的还是有不同的方法【英文标题】:Median of medians - is this possible or is there a different way 【发布时间】:2012-03-13 23:46:32 【问题描述】:目前,我每天都在汇总大量数据,并且每天我都在计算当前值的中位数。现在我需要将所有这些每日结果汇总到每月的基础上,当然我需要再次计算中位数。
有没有办法计算中位数的中位数并使其在统计上正确?我想避免再次使用原始数据,因为它的数量很大:)
作为一个小的概念证明,我制作了这个 javascript - 也许它有助于找到一种方法:
var aSortedNumberGroups = [];
var aSortedNumbers = [];
var aMedians = [];
Math.median = function(aData)
var fMedian = 0;
var iIndex = Math.floor(aData.length/2);
if (!(aData.length%2))
fMedian = (aData[iIndex-1]+aData[iIndex])/2;
else
fMedian = aData[iIndex];
return fMedian;
;
for (var iCurrGroupNum = 0; iCurrGroupNum < 5; ++iCurrGroupNum)
var aCurrNums = [];
for (var iCurrNum = 0; iCurrNum < 1000; ++iCurrNum)
var iCurrRandomNumber = Math.floor(Math.random()*10001);
aCurrNums.push(iCurrRandomNumber);
aSortedNumbers.push(iCurrRandomNumber);
aCurrNums.sort(function(oCountA,oCountB)
return (iNumA < iNumB) ? -1 : 1;
);
aSortedNumberGroups.push(aCurrNums);
aMedians.push(Math.median(aCurrNums));
console.log("Medians of each group: "+JSON.stringify(aMedians, null, 4));
console.log("Median of medians: "+Math.median(aMedians));
console.log("Median of all: "+Math.median(aSortedNumbers));
正如您将看到的,所有原始数字的中位数和中位数的中位数之间通常存在巨大的上限,我希望它们彼此非常接近。
非常感谢!
【问题讨论】:
可以计算平均值,但您必须将旧数字存储在某处才能确定中位数。 我确实已经考虑过基于快速排序的中位数算法,因为它至少会带走一些原始数据。这是我能找到 atm 的最好方法 :) 【参考方案1】:您实际上并没有“计算”通过重新分配到子集来“发现”它的中位数,对此的唯一优化是可重新加载的“tick chart”或运行计数:例如存储每次出现的次数,这样您就可以重新创建分布,而无需实际重新解析原始数据。这只是一个小的优化,但根据相关数据集的重复性,您可以为自己节省大量的 MB 内存,并且至少可以节省大量的处理器周期。
在 JSON 中考虑它: '1': 3, '5': 12, '7': 4
canonical:'1' 出现了 3 次,'5' 出现了 12 次,等等......
然后将这些计数保留在您想要获得中位数的时间段开始时的开始。
希望这有助于 -ck
【讨论】:
有趣的方法,有助于减少数据量。但是我仍然需要每个月再次有这样的清单,不是吗?在我的特殊情况下,我想它会有很多开销,我可能宁愿保存原始数据,但我会试一试:) 是的,正确的是,您需要为每个要为其生成中位数的时间段创建一个新列表。除非您想让该列表更复杂并为每个项目存储“到期日期”,例如: '1': ['2/23/2012','2/24/2012']
其中item.length
将是出现次数,然后您可以每天继续“修剪”列表。 .【参考方案2】:
不,遗憾的是,没有一种方法可以根据整体子集的中位数计算中位数,并且仍然具有统计上的准确性。但是,如果您想计算均值,则可以使用子集的均值,因为它们的大小相同。
上面ck的优化可能对你有帮助。
【讨论】:
因此,如果所有子集的大小始终相同,我将能够获得均值......很高兴知道 - 非常感谢!【参考方案3】:另一种方法是获取每天的数据,对其进行解析,然后按排序顺序存储。对于给定的一天,您只需查看中间数据,您就会得到答案。
在月底,您可以快速选择以找到中位数。您可以利用每天数据的排序顺序进行二分查找来拆分它。结果是您的月末处理将非常非常快。
同样的数据,以同样的方式组织,也会让你非常便宜地做各种百分位数。唯一困难的部分是提取每天的原始数据并对其进行排序。
【讨论】:
【参考方案4】:我知道这是一个非常过时的线程,但未来的读者可能会发现 Tukey 的 Ninther 方法非常相关……分析:http://www.johndcook.com/blog/2009/06/23/tukey-median-ninther/
-公斤
【讨论】:
“虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。”以上是关于中位数的中位数 - 这是可能的还是有不同的方法的主要内容,如果未能解决你的问题,请参考以下文章