Медиана медиан - это возможно или есть другой путь - PullRequest
2 голосов
/ 23 февраля 2012

В настоящее время я собираю большое количество данных ежедневно и для каждого дня вычисляю медиану текущих значений. Теперь мне нужно объединить все эти ежедневные результаты в месячный период и, конечно, мне нужно снова вычислить медиану.

Есть ли способ рассчитать медиану медиан и сделать ее статистически правильной? Я хочу избежать повторного использования необработанных данных, потому что их огромное количество:)

В качестве небольшого доказательства концепции я сделал этот 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));

Как вы увидите, между медианой всех необработанных чисел и медианой медианы часто существует огромная граница, и мне нравится, когда она довольно близка друг к другу.

Большое спасибо!

Ответы [ 4 ]

2 голосов
/ 23 февраля 2012

вы на самом деле не «вычисляете» медиану, которую вы «обнаруживаете» через перераспределение в подмножества, единственной оптимизацией для этого является перезагружаемая «тиковая диаграмма» или подсчет времени: например, сохраняйте каждое вхождение с количеством раз, которое оно произошлотаким образом, вы можете воссоздать дистрибутив без необходимости повторного анализа необработанных данных.Это только небольшая оптимизация, но в зависимости от повторения рассматриваемого набора данных вы можете сэкономить тонны МБ и, по крайней мере, несколько циклов процессора.

подумайте об этом в JSON: { '1': 3, '5': 12, '7': 4 } canonical: «1» происходил 3 раза, «5» происходил 12 раз и т. д.

, затем сохраните эти значения для начала в начале периода времени, в который вы хотите получить медианудля.

надеюсь, это поможет -ck

0 голосов
/ 31 октября 2013

Я знаю, что это очень устаревшая тема, но будущие читатели могут найти метод Тьюки Нинтера весьма уместным ... анализ здесь: http://www.johndcook.com/blog/2009/06/23/tukey-median-ninther/

-kg

0 голосов
/ 23 февраля 2012

Еще один подход - это брать данные за каждый день, анализировать их и хранить в отсортированном порядке. За определенный день вы можете просто посмотреть на медианный фрагмент данных и получить ответ.

В конце месяца вы можете быстро выбрать медиану. Вы можете воспользоваться отсортированным порядком данных каждого дня, чтобы выполнить двоичный поиск, чтобы разделить их. В результате обработка в конце месяца будет очень и очень быстрой.

Данные такого же типа, организованные таким же образом, также позволят вам очень дешево создавать различные процентили. Единственная сложная часть - извлечение необработанных данных каждого дня и их сортировка.

0 голосов
/ 23 февраля 2012

Нет, к сожалению, нет способа рассчитать медиану на основе медиан подмножеств целого и при этом быть статистически точным. Однако если вы хотите вычислить среднее значение, вы можете использовать средства подмножеств, учитывая, что они имеют одинаковый размер.

Оптимизация ck выше может быть вам полезна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...