Eu tenho uma variável aleatória e eu sei.
Existe uma maneira de calcular ? Eu tentei descobrir a integral, mas não fiz muito progresso. Isso é possível?
Eu tenho uma variável aleatória e eu sei.
Existe uma maneira de calcular ? Eu tentei descobrir a integral, mas não fiz muito progresso. Isso é possível?
Respostas:
Como já mencionado nos comentários da pergunta e resposta de @Martijn, não parece haver uma solução analítica para além do caso especial em que que fornece .
Além disso, pela desigualdade de Jensen , temos que se e, inversamente, que se . Desde é convexo quandoe côncavo quandoe a maior parte da massa de densidade normal fica nessas regiões, dependendo do valor de.
Existem muitas maneiras de se aproximar de , detalhei algumas com as quais estou familiarizado e incluí algum código R no final.
Isso é muito fácil de entender / implementar:
Isso inclui muitos métodos de aproximação da integral acima - no código que usei a função de integração de R, que usa quadratura adaptativa.
Veja, por exemplo, O filtro de Kalman sem cheiro para estimativa não-linear de Eric A. Wan e Rudolph van der Merwe, que descreve:
A transformação sem cheiro (UT) é um método para calcular as estatísticas de uma variável aleatória que passa por uma transformação não linear
Esse método é muito mais eficiente em termos computacionais do que a amostragem aleatória. Infelizmente, não consegui encontrar uma implementação R online, por isso não a incluí no código abaixo.
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)
}
resultado:
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
Na verdade, encontrei uma transformação sem cheiro fácil de usar no pacote python filterpy (embora seja realmente muito rápido de implementar do 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}))
quais saídas:
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()
Mais sobre essas distribuições são descritas em um artigo disponível gratuitamente: Atchison, J. e Sheng M. Shen. "Distribuições logísticas-normais: algumas propriedades e usos." Biometrika 67,2 (1980): 261-272.
Nesse texto, eles não dão nenhuma expressão para limites, aproximações ou comportamento dos momentos (exceto mencionando que eles existem). Porém, eles continuam com expressões para o valor esperado para a razão de dois componentes em uma variável distribuída normal logística multivariada.