Как рассчитать сумму двух нормальных распределений

StackOverflow https://stackoverflow.com/questions/422186

Вопрос

У меня есть тип значения, представляющий распределение по Гауссу:

struct Gauss {
    double mean;
    double variance;
}

Я хотел бы выполнить интеграл по ряду этих значений:

Gauss eulerIntegrate(double dt, Gauss iv, Gauss[] values) {
    Gauss r = iv;
    foreach (Gauss v in values) {
        r += v*dt;
    }
    return r;
}

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

Умножение на скаляр ( dt ) показалось достаточно простым. Но это было не просто! Спасибо FOOSHNICK за помощь:

public static Gauss operator * (Gauss g, double d) {
    return new Gauss(g.mean * d, g.variance * d * d);
}

Тем не менее, дополнение ускользает от меня. Я полагаю, я могу просто добавить средства; это дисперсия вызывает у меня проблемы. Любое из этих определений кажется «логичным» для меня.

public static Gauss operator + (Gauss a, Gauss b) {
    double mean = a.mean + b.mean;
    // Is it this? (Yes, it is!)
    return new Gauss(mean, a.variance + b.variance);        
    // Or this? (nope)
    //return new Gauss(mean, Math.Max(a.variance, b.variance));
    // Or how about this? (nope)
    //return new Gauss(mean, (a.variance + b.variance)/2);
}

Может ли кто-нибудь помочь определить статистически правильный или, по крайней мере, "разумный" ответ? - версия оператора + ?

Полагаю, я мог бы вместо этого переключить код на использование интервальной арифметики, но я надеялся остаться в мире вероятностей и статистики.

Это было полезно?

Решение

Сумма двух нормальных распределений сама по себе является нормальным распределением:

N (среднее1, дисперсия1) + N (среднее2, дисперсия2) ~ N (среднее1 + среднее2, дисперсия1 + дисперсия2)

Это все на странице википедии .

Будьте осторожны, это действительно отклонения, а не стандартные отклонения.

// X + Y
public static Gauss operator + (Gauss a, Gauss b) {
    //NOTE: this is valid if X,Y are independent normal random variables
    return new Gauss(a.mean + b.mean, a.variance + b.variance);
}

// X*b
public static Gauss operator * (Gauss a, double b) {
    return new Gauss(a.mean*b, a.variance*b*b);
}

Другие советы

Чтобы быть более точным:

Если случайная величина Z определяется как линейная комбинация двух некоррелированных гауссовских случайных величин X и Y, то Z сама является гауссовой случайной величиной, например:

если Z = aX + bY,   тогда среднее (Z) = a * среднее (X) + b * среднее (Y) и дисперсия (Z) = a 2 * дисперсия (X) + b 2 * дисперсия (Y).

Если случайные переменные коррелированы , то вы должны это учитывать. Дисперсия (X) определяется ожидаемым значением E ([X-mean (X)] 2 ). Проработав это для Z = aX + bY, мы получим:

дисперсия (Z) = 2 * дисперсия (X) + b 2 * дисперсия (Y) + 2ab * ковариация (X, Y)

Если вы суммируете две некоррелированные случайные величины, которые не имеют гауссовских распределений, то распределение суммы будет свертка двухкомпонентных распределений.

Если вы суммируете две коррелированные негауссовские случайные величины, вам придется самостоятельно работать с соответствующими интегралами.

Ну, вы умножаете на скаляр неправильно, вы должны умножить дисперсию на квадрат d. Если вы добавляете константу, то просто добавьте ее к среднему значению, дисперсия останется прежней. Если вы добавляете два распределения, то добавьте средства и добавьте отклонения.

  

Может ли кто-нибудь помочь определить статистически правильный или, по крайней мере, "разумный" ответ? - версия оператора +?

Возможно, нет, так как добавление двух дистрибутивов означает разные вещи - работая с надежностью и ремонтопригодностью, моей первой реакцией из названия будет распределение mtbf системы, если mtbf каждой части нормально распределен, а система не имеет избыточности , Вы говорите о распределении суммы двух нормально распределенных независимых переменных, а не о (логической) сумме эффекта двух нормальных распределений. Очень часто перегрузка операторов имеет удивительную семантику. Я бы оставил его как функцию и назвал бы его «normalSumDistribution», если ваш код не имеет очень конкретной целевой аудитории.

Ха, я думал, что вы не можете добавить гауссовские распределения вместе, но вы можете!

http://mathworld.wolfram.com/NormalSumDistribution.html

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

Я не уверен, что мне нравится то, что вы называете "интеграцией" по ряду значений. Вы имеете в виду это слово в смысле исчисления? Вы пытаетесь сделать числовую интеграцию? Есть и другие, лучшие способы сделать это. Ваш не выглядит правильным для меня, не говоря уже об оптимальном.

Гауссово распределение - хорошая, гладкая функция. Я думаю, что хороший квадратурный подход или Рунге-Кутта был бы намного лучшей идеей.

Я бы подумал, что это зависит от того, какой тип дополнения вы делаете. Если вы просто хотите получить нормальное распределение со свойствами (среднее значение, стандартное отклонение и т. Д.), Равными сумме двух распределений, тогда добавление свойств, как указано в других ответах, подойдет. Это предположение используется в чем-то вроде PERT, где, если сложено большое количество нормальных распределений вероятности, то получающееся в результате распределение вероятностей является другим нормальным распределением вероятности.

Проблема возникает, когда два добавляемых дистрибутива не похожи. Возьмем, к примеру, добавление распределения вероятностей со средним значением 2 и стандартным отклонением 1 и распределением вероятностей 10 со стандартным отклонением 2. Если вы добавите эти два распределения вверх, вы получите распределение вероятностей с двумя пиками, один на 2ish. и один на 10ish. Поэтому результат не является нормальным распределением. Предположение о добавлении дистрибутивов действительно действительно только в том случае, если исходные дистрибутивы либо очень похожи, либо у вас много оригинальных дистрибутивов, так что пики и впадины можно выровнять.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top