Pregunta

Tengo un tipo de valor que representa una distribución gaussiana:

struct Gauss {
    double mean;
    double variance;
}

Me gustaría realizar una integral sobre una serie de estos valores:

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

Mi pregunta es cómo implementar la suma para estas distribuciones normales.

La multiplicación por un escalar ( dt ) parecía bastante simple. ¡Pero no era simple! Gracias a FOOSHNICK por la ayuda:

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

Sin embargo, la adición me elude. Supongo que solo puedo añadir los medios; Es la variación que me está causando problemas. Cualquiera de estas definiciones parece " lógica " a mi.

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

¿Puede alguien ayudar a definir una estadística correcta, o al menos " razonable " - versión del operador + ?

Supongo que podría cambiar el código para usar aritmética de intervalos en lugar de eso, pero esperaba quedarme en el mundo de los problemas y las estadísticas.

¿Fue útil?

Solución

La suma de dos distribuciones normales es en sí misma una distribución normal:

N (media1, varianza1) + N (media2, varianza2) ~ N (media1 + media2, varianza1 + varianza2)

Todo está en página de wikipedia .

Tenga cuidado de que estas sean realmente variaciones y no desviaciones estándar.

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

Otros consejos

Para ser más precisos:

Si una variable aleatoria Z se define como la combinación lineal de dos variables aleatorias gaussianas no correlacionadas X e Y, entonces Z es en sí misma una variable aleatoria gaussiana, por ejemplo:

si Z = aX + bY,   luego media (Z) = a * media (X) + b * media (Y), y varianza (Z) = a 2 * varianza (X) + b 2 * varianza (Y).

Si las variables aleatorias están correlacionadas , entonces hay que tenerlo en cuenta. La variación (X) se define por el valor esperado E ([X-mean (X)] 2 ). Trabajando esto para Z = aX + bY, obtenemos:

varianza (Z) = a 2 * varianza (X) + b 2 * varianza (Y) + 2ab * covarianza (X, Y)

Si está sumando dos variables aleatorias no correlacionadas que no tienen distribuciones gaussianas, entonces la distribución de la suma es la convolución de las dos distribuciones de componentes.

Si está sumando dos variables aleatorias no gaussianas correlacionadas, usted mismo tiene que trabajar con las integrales apropiadas.

Bueno, tu multiplicación por escalar es incorrecta: debes multiplicar la varianza por el cuadrado de d. Si está agregando una constante, solo agréguela a la media, la varianza sigue siendo la misma. Si está agregando dos distribuciones, agregue los medios y agregue las variaciones.

  

¿Puede alguien ayudar a definir una estadística correcta, o al menos " razonable " - versión del operador +?

Podría decirse que no, ya que agregar dos distribuciones significa cosas diferentes: habiendo trabajado en confiabilidad y mantenibilidad, mi primera reacción del título sería la distribución del mtbf de un sistema, si el mtbf de cada parte se distribuye normalmente y el sistema no tiene redundancia. . Está hablando de la distribución de la suma de dos variables independientes distribuidas normalmente, no de la suma (lógica) del efecto de dos distribuciones normales. Muy a menudo, la sobrecarga del operador tiene una semántica sorprendente. Lo dejaría como una función y lo llamaría 'normalSumDistribution' a menos que su código tenga un público objetivo muy específico.

Hah, pensé que no podías agregar juntas las distribuciones gaussianas, ¡pero puedes!

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

De hecho, la media es la suma de las distribuciones individuales, y la varianza es la suma de las distribuciones individuales.

No estoy seguro de que me guste lo que estás llamando "integración" " sobre una serie de valores. ¿Te refieres a esa palabra en un sentido de cálculo? ¿Estás tratando de hacer integración numérica? Hay otras formas mejores de hacerlo. El tuyo no se ve bien para mí, y mucho menos óptimo.

La distribución gaussiana es una función agradable y suave. Creo que un buen enfoque en cuadratura o Runge-Kutta sería una idea mucho mejor.

Habría pensado que depende del tipo de adición que estés haciendo. Si solo desea obtener una distribución normal con propiedades (media, desviación estándar, etc.) igual a la suma de dos distribuciones, entonces la adición de las propiedades tal como se indica en las otras respuestas está bien. Esta es la suposición utilizada en algo como PERT, donde si se suma un gran número de distribuciones de probabilidad normales, la distribución de probabilidad resultante es otra distribución de probabilidad normal.

El problema surge cuando las dos distribuciones que se agregan no son similares. Por ejemplo, agregue una distribución de probabilidad con una media de 2 y una desviación estándar de 1 y una distribución de probabilidad de 10 con una desviación estándar de 2. Si suma estas dos distribuciones, obtendrá una distribución de probabilidad con dos picos, uno en 2ish y uno a las 10ish. Por lo tanto, el resultado no es una distribución normal. La suposición sobre la adición de distribuciones solo es realmente válida si las distribuciones originales son muy similares o si tiene muchas distribuciones originales para que los picos y valles puedan ser nivelados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top