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

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

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);
}

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

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


person Frank Krueger    schedule 07.01.2009    source источник


Ответы (7)


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

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);
}
person David Norman    schedule 07.01.2009
comment
Фантастика, мне нравится, что это точно, а не оценка. - person Frank Krueger; 08.01.2009
comment
@DavidNorman Эта ссылка еще лучше: en.wikipedia.org/wiki/ - person Michael Berdyshev; 13.12.2017

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

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

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

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

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

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

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

person Jason S    schedule 19.01.2009

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

person Community    schedule 07.01.2009
comment
И наоборот: когда вы умножаете переменную на d, вы умножаете дисперсию на d в ​​квадрате. - person John D. Cook; 08.01.2009

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

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

person Pete Kirkham    schedule 19.01.2009

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

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

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

person MSN    schedule 07.01.2009

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

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

person duffymo    schedule 07.01.2009
comment
Конечно, я бы выбрал Рунге-Кутту, но мне не хотелось вводить это в редактор Stack Overflow :-) - person Frank Krueger; 08.01.2009
comment
Согласен, но мой интерфейс ясновидения не работает. У меня нет возможности узнать, печатаете ли вы одно, а думаете другое. Не вводите в заблуждение — комментарий к псевдокоду типа // 5-го порядка R-K говорит мне гораздо больше. - person duffymo; 08.01.2009
comment
В любом случае, мои данные очень скучны, и приведенной выше интеграции Эйлера вполне достаточно. В этом нет ничего плохого. Я даже назвал его Эйлером, чтобы избежать подобных комментариев. ;-) - person Frank Krueger; 08.01.2009

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

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

person Ian Turner    schedule 19.01.2009