J'ai une variable aléatoire et je connais .
Existe-t-il un moyen de calculer ? J'ai essayé de comprendre l'intégrale, mais je n'ai pas fait beaucoup de progrès. Est-ce même possible?
J'ai une variable aléatoire et je connais .
Existe-t-il un moyen de calculer ? J'ai essayé de comprendre l'intégrale, mais je n'ai pas fait beaucoup de progrès. Est-ce même possible?
Réponses:
Comme déjà mentionné dans les commentaires et réponses à la question de @Martijn, il ne semble pas y avoir de solution analytique pour en dehors du cas particulier où qui donne .
De plus, par l'inégalité de Jensen, nous avons que si et inversement si . Depuis est convexe quand et concave quand et la majeure partie de la masse volumique normale se trouvera dans ces régions en fonction de la valeur de .
Il existe de nombreuses façons de se rapprocher , J'en ai détaillé quelques-uns que je connais et inclus un code R à la fin.
C'est assez facile à comprendre / à mettre en œuvre:
où nous prélevons des échantillons de .
Cela comprend de nombreuses méthodes d'approximation de l'intégrale ci-dessus - dans le code, j'ai utilisé la fonction d' intégration de R qui utilise la quadrature adaptative.
Voir par exemple le filtre de Kalman non parfumé pour l'estimation non linéaire d'Eric A. Wan et Rudolph van der Merwe qui décrit:
La transformation non parfumée (UT) est une méthode de calcul des statistiques d'une variable aléatoire qui subit une transformation non linéaire
La méthode consiste à calculer un petit nombre de "points sigma" qui sont ensuite transformés par et une moyenne pondérée est prise. Cela contraste avec l'échantillonnage aléatoire de nombreux points, en les transformant avec et en prenant la moyenne.
Cette méthode est beaucoup plus efficace en termes de calcul que l'échantillonnage aléatoire. Malheureusement, je n'ai pas trouvé d'implémentation R en ligne, je ne l'ai donc pas incluse dans le code ci-dessous.
Le code suivant crée des données avec différentes valeurs de et fixe . Il produit f_mu
ce qui estet approximations de via sampling
et 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)
}
production:
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
J'ai en fait trouvé une transformation non parfumée facile à utiliser dans le package python filterpy (bien qu'il soit en fait assez rapide à implémenter à partir de zéro):
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}))
qui génère:
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
Ainsi, la transformation non parfumée semble fonctionner assez mal pour ces valeurs de et . Ce n'est peut-être pas surprenant puisque la transformation non parfumée tente de trouver la meilleure approximation normale de et dans ce cas c'est loin d'être 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()
Pour des valeurs plus petites de cela semble OK.
La variable a une distribution logit normale ou logistique normale dont les moments n'ont pas de description analytique connue. Vous pouvez obtenir les valeurs par calcul.
Plus d'informations sur ces distributions sont décrites dans un article disponible gratuitement: Atchison, J., et Sheng M. Shen. "Distributions logistiquement normales: quelques propriétés et utilisations." Biometrika 67,2 (1980): 261-272.
Dans ce texte, ils ne donnent aucune expression de limites, d'approximations ou de comportement des moments (sauf en mentionnant qu'ils existent). Mais, ils continuent avec des expressions de la valeur attendue pour le rapport de deux composantes dans une variable distribuée normale logistique multivariée.