Saya memiliki variabel acak dan saya tahu .
Apakah ada cara untuk menghitung ? Saya telah mencoba untuk mengerjakan integral, tetapi belum membuat banyak kemajuan. Apakah itu mungkin?
Saya memiliki variabel acak dan saya tahu .
Apakah ada cara untuk menghitung ? Saya telah mencoba untuk mengerjakan integral, tetapi belum membuat banyak kemajuan. Apakah itu mungkin?
Jawaban:
Seperti yang sudah disebutkan dalam komentar pertanyaan dan jawaban oleh @ Martijn tampaknya tidak ada solusi analitis untuk terlepas dari kasus khusus di mana pemberian yang mana .
Selain itu oleh ketidaksetaraan Jensen kita memilikinya jika dan sebaliknya itu jika . Sejak cembung saat dan cekung kapan dan sebagian besar massa kerapatan normal akan terletak di wilayah tersebut tergantung pada nilai .
Ada banyak cara untuk memperkirakan , Saya telah merinci beberapa yang saya kenal dan menyertakan beberapa kode R pada akhirnya.
Ini cukup mudah dimengerti / diimplementasikan:
tempat kami mengambil sampel dari .
Ini mencakup banyak metode untuk mendekati integral di atas - dalam kode I menggunakan fungsi integrasi R yang menggunakan quadrature adaptif.
Lihat misalnya Filter Kalman Tanpa Wangi untuk Estimasi Nonlinear oleh Eric A. Wan dan Rudolph van der Merwe yang menjelaskan:
Transformasi unscented (UT) adalah metode untuk menghitung statistik dari variabel acak yang mengalami transformasi nonlinier
Metode ini melibatkan penghitungan sejumlah kecil "titik sigma" yang kemudian ditransformasikan oleh dan rata-rata tertimbang diambil. Ini berbeda dengan pengambilan sampel acak banyak titik, mengubahnya dengan dan mengambil mean.
Metode ini jauh lebih efisien secara komputasi daripada pengambilan sampel secara acak. Sayangnya saya tidak dapat menemukan implementasi R online sehingga belum memasukkannya dalam kode di bawah ini.
Kode berikut membuat data dengan nilai yang berbeda dari dan diperbaiki . Ini menghasilkan f_mu
yang, dan perkiraan melalui sampling
dan 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)
}
keluaran:
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
Saya benar-benar menemukan mudah untuk menggunakan transformasi tanpa wewangian dalam paket python filterpy (meskipun sebenarnya cukup cepat untuk diimplementasikan dari awal):
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}))
yang keluaran:
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
Jadi transformasi tanpa wewenang tampaknya berkinerja sangat buruk untuk nilai - nilai ini dan . Ini mungkin tidak mengejutkan karena transformasi tanpa wewenang mencoba untuk menemukan perkiraan normal terbaik dan dalam hal ini jauh dari 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()
Untuk nilai yang lebih kecil dari sepertinya tidak apa-apa.
Variabel memiliki distribusi normal logit atau normal logistik yang momennya tidak memiliki deskripsi analitis yang diketahui. Anda dapat memperoleh nilai secara komputasi.
Lebih lanjut tentang distribusi ini dijelaskan dalam artikel yang tersedia secara bebas: Atchison, J., dan Sheng M. Shen. "Distribusi logistik-normal: Beberapa properti dan penggunaan." Biometrika 67.2 (1980): 261-272.
Dalam teks itu mereka tidak memberikan ekspresi apa pun untuk batasan, perkiraan atau perilaku momen (kecuali menyebutkan bahwa mereka ada). Tetapi, mereka melanjutkan dengan ekspresi untuk nilai ekspektasi untuk rasio dua komponen dalam variabel terdistribusi normal logistik multivariat.