Ich habe eine Zufallsvariable und kenne .
Gibt es eine Möglichkeit, zu berechnen ? Ich habe versucht, das Integral herauszuarbeiten, aber keine großen Fortschritte gemacht. Ist es überhaupt möglich?
Ich habe eine Zufallsvariable und kenne .
Gibt es eine Möglichkeit, zu berechnen ? Ich habe versucht, das Integral herauszuarbeiten, aber keine großen Fortschritte gemacht. Ist es überhaupt möglich?
Antworten:
Wie bereits in den Fragenkommentaren und Antworten von @Martijn erwähnt, scheint es keine analytische Lösung für abgesehen von dem Sonderfall, bei dem ergibt .
Zusätzlich haben wir durch Jensens Ungleichung , dass wenn und umgekehrt, dass wenn . Da konvex ist, wenn und konkav, wenn und der größte Teil der Masse mit normaler Dichte in diesen Bereichen liegt, abhängig vom Wert von .
Es gibt viele Möglichkeiten, zu approximieren. Ich habe einige, mit denen ich vertraut bin, detailliert beschrieben und am Ende einen R-Code eingefügt.
Dies ist recht einfach zu verstehen / umzusetzen:
wo wir Proben aus .
Dies beinhaltet viele Methoden zur Approximation des obigen Integrals - in dem Code habe ich die Integrationsfunktion von R verwendet , die die adaptive Quadratur verwendet.
Siehe zum Beispiel den Unscented Kalman Filter for Nonlinear Estimation von Eric A. Wan und Rudolph van der Merwe, der beschreibt:
Die unscented Transformation (UT) ist eine Methode zur Berechnung der Statistik einer Zufallsvariablen, die eine nichtlineare Transformation durchläuft
Das Verfahren beinhaltet die Berechnung einer kleinen Anzahl von "Sigma-Punkten", die dann durch transformiert werden und ein gewichteter Mittelwert wird genommen. Dies steht im Gegensatz dazu, viele Punkte zufällig abzutasten, sie mit transformieren und den Mittelwert zu nehmen.
Diese Methode ist viel rechnerisch effizienter als die Zufallsstichprobe. Leider konnte ich eine R-Implementierung online nicht finden und habe sie daher nicht in den folgenden Code aufgenommen.
Der folgende Code erstellt Daten mit unterschiedlichen Werten von und festem . Er gibt f_mu
das ist , und Annäherungen an über sampling
und 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)
}
Ausgabe:
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
Ich habe tatsächlich eine einfach zu verwendende, nicht parfümierte Transformation im Python-Paket filterpy gefunden (obwohl die Implementierung von Grund auf recht schnell ist):
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}))
welche Ausgänge:
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
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()
Weitere Informationen zu diesen Distributionen finden Sie in einem frei verfügbaren Artikel: Atchison, J. und Sheng M. Shen. "Logistisch-normale Verteilungen: Einige Eigenschaften und Verwendungen." Biometrika 67.2 (1980): 261 & ndash; 272.
In diesem Text geben sie keine Ausdrücke für Grenzen, Annäherungen oder das Verhalten der Momente (außer zu erwähnen, dass sie existieren). Sie fahren jedoch mit Ausdrücken für den Erwartungswert für das Verhältnis zweier Komponenten in einer multivariaten logistischen normalverteilten Variablen fort.