Tengo una variable aleatoria Y yo sé .
¿Hay alguna manera de calcular ? He tratado de resolver la integral, pero no he progresado mucho. ¿Es posible?
Tengo una variable aleatoria Y yo sé .
¿Hay alguna manera de calcular ? He tratado de resolver la integral, pero no he progresado mucho. ¿Es posible?
Respuestas:
Como ya se mencionó en los comentarios y preguntas de @Martijn, no parece haber una solución analítica para aparte del caso especial donde lo que da .
Además, por la desigualdad de Jensen tenemos que Si y a la inversa que Si . Ya que es convexo cuando y cóncavo cuando y la mayor parte de la masa de densidad normal estará en esas regiones dependiendo del valor de .
Hay muchas formas de aproximar , He detallado algunos con los que estoy familiarizado e incluí algunos códigos R al final.
Esto es bastante fácil de entender / implementar:
donde sacamos muestras desde .
Esto incluye muchos métodos de aproximación de la integral anterior: en el código utilicé la función de integración de R que utiliza la cuadratura adaptativa.
Véase, por ejemplo, El filtro de Kalman sin perfume para la estimación no lineal de Eric A. Wan y Rudolph van der Merwe, que describe:
La transformación sin perfume (UT) es un método para calcular las estadísticas de una variable aleatoria que sufre una transformación no lineal.
El método implica calcular una pequeña cantidad de "puntos sigma" que luego se transforman y se toma una media ponderada. Esto contrasta con el muestreo aleatorio de muchos puntos, transformándolos con y tomando la media.
Este método es mucho más eficiente computacionalmente que el muestreo aleatorio. Desafortunadamente no pude encontrar una implementación de R en línea, así que no la he incluido en el código a continuación.
El siguiente código crea datos con diferentes valores de y arreglado . Da salida f_mu
que esy aproximaciones de vía sampling
y integration
.
integrate_approx <- function(mu, sigma) {
f <- function(x) {
plogis(x) * dnorm(x, mu, sigma)
}
int <- integrate(f, lower = -Inf, upper = Inf)
int$value
}
sampling_approx <- function(mu, sigma, n = 1e6) {
x <- rnorm(n, mu, sigma)
mean(plogis(x))
}
mu <- seq(-2.0, 2.0, by = 0.5)
data <- data.frame(mu = mu,
sigma = 3.14,
f_mu = plogis(mu),
sampling = NA,
integration = NA)
for (i in seq_len(nrow(data))) {
mu <- data$mu[i]
sigma <- data$sigma[i]
data$sampling[i] <- sampling_approx(mu, sigma)
data$integration[i] <- integrate_approx(mu, sigma)
}
salida:
mu sigma f_mu sampling integration
1 -2.0 3.14 0.1192029 0.2891102 0.2892540
2 -1.5 3.14 0.1824255 0.3382486 0.3384099
3 -1.0 3.14 0.2689414 0.3902008 0.3905315
4 -0.5 3.14 0.3775407 0.4450018 0.4447307
5 0.0 3.14 0.5000000 0.4999657 0.5000000
6 0.5 3.14 0.6224593 0.5553955 0.5552693
7 1.0 3.14 0.7310586 0.6088106 0.6094685
8 1.5 3.14 0.8175745 0.6613919 0.6615901
9 2.0 3.14 0.8807971 0.7105594 0.7107460
En realidad, encontré una transformación sin perfume fácil de usar en el paquete de python filterpy (aunque en realidad es bastante rápido de implementar desde cero):
import filterpy.kalman as fp
import numpy as np
import pandas as pd
def sigmoid(x):
return 1.0 / (1.0 + np.exp(-x))
m = 9
n = 1
z = 1_000_000
alpha = 1e-3
beta = 2.0
kappa = 0.0
means = np.linspace(-2.0, 2.0, m)
sigma = 3.14
points = fp.MerweScaledSigmaPoints(n, alpha, beta, kappa)
ut = np.empty_like(means)
sampling = np.empty_like(means)
for i, mean in enumerate(means):
sigmas = points.sigma_points(mean, sigma**2)
trans_sigmas = sigmoid(sigmas)
ut[i], _ = fp.unscented_transform(trans_sigmas, points.Wm, points.Wc)
x = np.random.normal(mean, sigma, z)
sampling[i] = np.mean(sigmoid(x))
print(pd.DataFrame({"mu": means,
"sigma": sigma,
"ut": ut,
"sampling": sampling}))
que salidas:
mu sigma ut sampling
0 -2.0 3.14 0.513402 0.288771
1 -1.5 3.14 0.649426 0.338220
2 -1.0 3.14 0.716851 0.390582
3 -0.5 3.14 0.661284 0.444856
4 0.0 3.14 0.500000 0.500382
5 0.5 3.14 0.338716 0.555246
6 1.0 3.14 0.283149 0.609282
7 1.5 3.14 0.350574 0.662106
8 2.0 3.14 0.486598 0.710284
Por lo tanto, la transformación sin perfume parece funcionar bastante mal para estos valores de y . Esto quizás no sea sorprendente, ya que la transformación sin perfume intenta encontrar la mejor aproximación normal a y en este caso está lejos de ser normal:
import matplotlib.pyplot as plt
x = np.random.normal(means[0], sigma, z)
plt.hist(sigmoid(x), bins=50)
plt.title("mu = {}, sigma = {}".format(means[0], sigma))
plt.xlabel("f(x)")
plt.show()
Para valores menores de Parece estar bien.
La variable tiene una distribución logit normal o logística normal cuyos momentos no tienen una descripción analítica conocida. Puede obtener los valores computacionalmente.
Se describe más sobre estas distribuciones en un artículo disponible gratuitamente: Atchison, J. y Sheng M. Shen. "Distribuciones logísticas normales: algunas propiedades y usos". Biometrika 67.2 (1980): 261-272.
En ese texto no dan ninguna expresión para los límites, aproximaciones o comportamiento de los momentos (excepto mencionar que existen). Pero sí continúan con expresiones para el valor esperado de la relación de dos componentes en una variable distribuida normal logística multivariada.