Ho una variabile casuale e conosco .
C'è un modo per calcolare ? Ho provato a elaborare l'integrale, ma non ho fatto molti progressi. È anche possibile?
Ho una variabile casuale e conosco .
C'è un modo per calcolare ? Ho provato a elaborare l'integrale, ma non ho fatto molti progressi. È anche possibile?
Risposte:
Come già menzionato nei commenti alle domande e nella risposta di @Martijn, non sembra esserci una soluzione analitica per parte il caso speciale in cui che dà .
Inoltre per la disuguaglianza di Jensen abbiamo che if e viceversa che se . Poiché è convesso quando e concavo quando e la maggior parte della massa di densità normale si troverà in quelle regioni a seconda del valore di .
Esistono molti modi per approssimare , ne ho dettagliati alcuni con cui ho familiarità e ho incluso un codice R alla fine.
Questo è abbastanza facile da capire / implementare:
dove disegniamo campioni da .
Ciò include molti metodi per approssimare l'integrale sopra - nel codice ho usato la funzione di integrazione di R che usa la quadratura adattativa.
Vedi ad esempio The Unscented Kalman Filter for Nonlinear Stimation di Eric A. Wan e Rudolph van der Merwe che descrive:
La trasformazione non profumata (UT) è un metodo per calcolare le statistiche di una variabile casuale che subisce una trasformazione non lineare
Il metodo prevede il calcolo di un piccolo numero di "punti sigma" che vengono poi trasformati da e viene presa una media ponderata. Ciò è in contrasto con il campionamento casuale di molti punti, trasformandoli con e prendendo la media.
Questo metodo è molto più efficiente dal punto di vista computazionale rispetto al campionamento casuale. Purtroppo non sono riuscito a trovare un'implementazione R online, quindi non l'ho inclusa nel codice seguente.
Il codice seguente crea dati con diversi valori di e fixed . Emette che è e approssimazioni di tramite e .f_mu
sampling
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)
}
produzione:
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
In realtà ho trovato una trasformazione non profumata facile da usare nel pacchetto python filterpy (anche se in realtà è abbastanza veloce da implementare da zero):
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}))
che produce:
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
Quindi la trasformazione inodore sembra avere prestazioni scarse per questi valori di e . Questo forse non è sorprendente poiché la trasformazione inodore tenta di trovare la migliore approssimazione normale a e in questo caso è tutt'altro che normale:
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()
Per valori inferiori di sembra essere OK.
La variabile ha una distribuzione normale logit o logistica normale i cui momenti non hanno una descrizione analitica nota. È possibile ottenere i valori a livello computazionale.
Ulteriori informazioni su queste distribuzioni sono descritte in un articolo disponibile gratuitamente: Atchison, J. e Sheng M. Shen. "Distribuzioni logistiche-normali: alcune proprietà e usi." Biometrika 67.2 (1980): 261-272.
In quel testo non danno alcuna espressione per limiti, approssimazioni o comportamenti dei momenti (tranne menzionare che esistono). Tuttavia, continuano con le espressioni per il valore di aspettativa per il rapporto tra due componenti in una variabile distribuita normale logistica multivariata.