Ini adalah upaya pertama saya untuk seseorang yang datang dari kamp frequentist untuk melakukan analisis data Bayesian. Saya membaca sejumlah tutorial dan beberapa bab dari Bayesian Data Analysis oleh A. Gelman.
Sebagai contoh analisis data pertama yang kurang lebih independen saya memilih adalah kereta menunggu waktu. Saya bertanya pada diri sendiri: apa distribusi waktu tunggu?
Dataset disediakan di blog dan dianalisis sedikit berbeda dan di luar PyMC.
Tujuan saya adalah memperkirakan waktu tunggu kereta yang diharapkan diberikan 19 entri data.
Model yang saya buat adalah sebagai berikut:
di mana berarti data dan adalah standar deviasi data dikalikan dengan 1000.
Saya dimodelkan waktu tunggu yang diharapkan sebagai menggunakan distribusi Poisson. Parameter laju untuk distribusi ini dimodelkan menggunakan distribusi Gamma karena merupakan distribusi konjugat ke distribusi Poisson. Hyper-priors dan dimodelkan masing-masing dengan distribusi Normal dan Setengah-Normal. Standar deviasi dibuat seluas mungkin untuk menjadi non-komital mungkin ..
Saya punya banyak pertanyaan
- Apakah model ini masuk akal untuk tugas tersebut (beberapa cara untuk membuat model?)?
- Apakah saya membuat kesalahan pemula?
- Bisakah modelnya disederhanakan (saya cenderung mempersulit hal-hal sederhana)?
- Bagaimana saya bisa memverifikasi jika posterior untuk parameter tingkat ( ) benar-benar cocok dengan data?
- Bagaimana saya bisa menggambar beberapa sampel dari distribusi Poisson yang dipasang untuk melihat sampel?
Posisi setelah 5000 langkah Metropolis terlihat seperti ini:
Saya dapat memposting kode sumber juga. Pada tahap pemasangan model saya melakukan langkah-langkah untuk parameter dan menggunakan NUTS. Kemudian pada langkah kedua saya melakukan Metropolis untuk parameter rate . Akhirnya saya memplot jejak menggunakan alat inbuilt.σ ρ
Saya akan sangat berterima kasih atas komentar dan komentar yang memungkinkan saya memahami pemrograman yang lebih probabilistik. Mungkin ada contoh lebih klasik yang layak untuk dicoba?
Berikut adalah kode yang saya tulis dalam Python menggunakan PyMC3. File data dapat ditemukan di sini .
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import pymc3
from scipy import optimize
from pylab import figure, axes, title, show
from pymc3.distributions import Normal, HalfNormal, Poisson, Gamma, Exponential
from pymc3 import find_MAP
from pymc3 import Metropolis, NUTS, sample
from pymc3 import summary, traceplot
df = pd.read_csv( 'train_wait.csv' )
diff_mean = np.mean( df["diff"] )
diff_std = 1000*np.std( df["diff"] )
model = pymc3.Model()
with model:
# unknown model parameters
mu = Normal('mu',mu=diff_mean,sd=diff_std)
sd = HalfNormal('sd',sd=diff_std)
# unknown model parameter of interest
rate = Gamma( 'rate', mu=mu, sd=sd )
# observed
diff = Poisson( 'diff', rate, observed=df["diff"] )
with model:
step1 = NUTS([mu,sd])
step2 = Metropolis([rate])
trace = sample( 5000, step=[step1,step2] )
plt.figure()
traceplot(trace)
plt.savefig("rate.pdf")
plt.show()
plt.close()
Jawaban:
Saya akan memberi tahu Anda terlebih dahulu apa yang akan saya lakukan dan kemudian saya akan menjawab pertanyaan spesifik yang Anda miliki.
Apa yang akan saya lakukan (paling tidak pada awalnya)
Inilah yang saya kumpulkan dari pos Anda, Anda memiliki waktu tunggu pelatihan untuk 19 pengamatan dan Anda tertarik untuk mengambil kesimpulan tentang waktu tunggu yang diharapkan.
Ada beberapa asumsi model yang mungkin yang dapat digunakan dan dengan 19 pengamatan mungkin sulit untuk menentukan model mana yang lebih masuk akal. Beberapa contoh adalah log-normal, gamma, eksponensial, Weibull.
Menjawab pertanyaan Anda
Lihat komentar sebelumnya.
Juga, itu akan sangat membantu jika matematika dan kode Anda setuju, misalnya di manaλ
Prioritas Anda tidak harus bergantung pada data.
Ya dan seharusnya. Lihat pendekatan pemodelan saya.
Saya yakin Anda menginginkan distribusi prediksi posterior. Untuk setiap iterasi di MCMC Anda, Anda memasukkan nilai parameter untuk iterasi itu dan mengambil sampel.
sumber