Jest to interesujący problem zwany „próbkowaniem gatunków”, który przez lata cieszył się dużym zainteresowaniem i obejmuje wiele innych problemów z szacowaniem (takich jak przechwytywanie znaków). Wystarczy powiedzieć, że JAGS nie pomoże ci w tym przypadku - JAGS nie obsługuje łańcuchów Markowa o zmiennym wymiarze w iteracjach. Należy skorzystać ze schematu MCMC zaprojektowanego dla takich problemów, takich jak MCMC z odwracalnym skokiem.
Oto jedno podejście, które jest odpowiednie dla opisywanego modelu, które po raz pierwszy spotkałem w pracy Jeffa Millera ( opracowane ).
Część I (oryginalne pytanie)
Przyjmę jedno założenie, że obserwacja danej kategorii implikuje istnienie kategorii o niższej randze. Oznacza to, że obserwowanie rzutu kostką na stronie 9 implikuje istnienie stron 1-8. To nie muszą być w ten sposób - kategorie może być dowolna - ale będę zakładać, więc w moim przykładzie. Oznacza to, że można zaobserwować wartości 0, w przeciwieństwie do innych problemów z szacowaniem gatunków.
Powiedzmy, że mamy próbkę wielomianową,
Y={y1,y2,…,ym,ym+1,…,yn}∼M({p1,p2,…,pm,pm+1,…,pn})
gdzie to maksymalna zaobserwowana kategoria, to (nieznana) liczba kategorii, a wszystkie równe 0. Parametr jest skończony i potrzebujemy przeor za to. Każdy dyskretny, odpowiedni wcześniej ze wsparciem dla będzie działał; weźmy na przykład skróconą przez zero Poissona:mn{ym+1,…,yn}n[1,∞)
n∼P(λ),n>0
Dirichlet jest wygodnym wstępem dla prawdopodobieństw wielomianowych,
P={p1,…,pn}∼D({α1,…,αn})
I dla uproszczenia załóżmy, że .α1=α2=⋯=αn=α~
Aby uprościć problem, marginalizujemy wagi:
p(Y|α~,n)=∫Pp(Y|P,n)p(P|α~,n)dP
Co w tym przypadku prowadzi do dobrze zbadanego rozkładu wielomianowego Dirichleta . Celem jest zatem oszacowanie warunkowego tylnego,
p(n|Y,α~,λ)=p(Y|n,α~)p(n|λ)p(Y|α~,λ)
Tam, gdzie wyraźnie zakładam, że i są stałymi hiperparametrami. Łatwo zauważyć, że:α~λ
p(Y|α~,λ)=∑n=1∞p(Y|n,α~)p(n|λ)
Gdzie gdzie . Ta nieskończona seria powinna zbiegać się dość szybko (o ile ogon poprzedzający nie jest zbyt ciężki), a zatem jest łatwy do przybliżenia. Dla obciętego Poissona ma on postać:p(Y|n,α~)=0n<m
p(Y|α~,λ)=1(eλ−1)∑n=m∞Γ(nα~)∏ni=1Γ(yi+α~)Γ(nα~+∑ni=1yi)Γ(α~)n⋅λnn!
Prowadzący do:
p(n|Y,α~,λ)=Γ(nα~)∏ni=1Γ(yi+α~)Γ(nα~+∑ni=1yi)Γ(α~)n⋅λnn!⋅(∑j=m∞Γ(jα~)∏ji=1Γ(yi+α~)Γ(jα~+∑ji=1yi)Γ(α~)j⋅λjj!)−1
Który ma wsparcie dla . W tym przypadku nie ma potrzeby MCMC, ponieważ nieskończoną serię w mianowniku reguły Bayesa można przybliżać bez większego wysiłku.[m,∞)
Oto niechlujny przykład w języku R:
logPosteriorN <- function(max, Y, lambda, alpha){
m <- length(Y)
sumy <- sum(Y)
pp <- sapply(1:max, function(j){
prior <- log(lambda)*j - log(exp(lambda)-1) - lgamma(j+1)
posterior <- lgamma(alpha*j) + sum(lgamma(Y + alpha)) - j*lgamma(alpha) - lgamma(sumy + j*alpha)
if( j > m ) { posterior <- posterior + (j-m)*lgamma(alpha) }
else if( j < m ) { posterior = -Inf }
prior + posterior
})
evidence <- log(sum(exp(pp))) # there's no check that this converges
pp - evidence
}
## with even representation of sides
Y <- c(10, 10, 10, 10)
post <- logPosteriorN(30, Y, 10, 1.2)
plot(1:30, exp(post), pch=19, type="b")
## with uneven representation of sides
Y <- c(1, 2, 1, 0, 0, 2, 1, 0, 1)
post <- logPosteriorN(30, Y, 10, 1.2)
plot(1:30, exp(post), pch=19, type="b")
Twoja intuicja jest prawidłowa: rzadkie pobieranie próbek między kategoriami prowadzi do większej niepewności co do całkowitej liczby kategorii. Jeśli chcesz traktować jako nieznany parametr, musisz użyć MCMC i alternatywnych aktualizacji i .α~nα~
Oczywiście jest to jedno podejście do szacowania. Z łatwością znajdziesz inne (smaki bayesowskie i nie bayesowskie) z odrobiną poszukiwań.
Część II (odpowiedź na komentarz)
Y={y1,…,ym,ym+1,…,yn} to częściowo obserwowany wektor wielomianowy z odpowiednimi prawdopodobieństwami :
Ω={ω1,…,ωm,ωm+1,…,ωn}
Pr(Y|Ω,n)=Γ(∑ni=1yi+1)∏ni=1Γ(yi+1)∏i=1nωyii
Gdzie , i ale poza tym indeksy są arytmetyczne. Tak jak poprzednio, problemem jest wnioskowanie o prawdziwej liczbie kategorii , a zaczynamy od znaku poprzedzającego na takiego jak Poisson o zerowym skróceniu:
y∈Ny1…ym>0ym+1…yn=0nn
Pr(n|λ)=λn(exp{λ}−1)n!, n∈Z+
Podobnie jak poprzednio, traktujemy prawdopodobieństwa wielomianowe jak Dirichleta dystrybuowanego z hiperparametrem symetrycznym , tj. Dla danego ,
Ωα~n
Pr(Ω|α~,n)=Γ(nα~)Γ(α~)n∏i=1nωα~−1i
Całkowanie (marginalizacja) ponad wektorem prawdopodobieństw daje wielomianowy Dirichlet:
Pr(Y|α~,n)=∫Pr(Y|Ω,n)Pr(Ω|α~,n)=Γ(nα~)Γ(∑ni=1yi+nα~)Γ(α~)n∏i=1nΓ(yi+α~)
Tutaj odbiegamy od modelu w części I powyżej. W części I zawarto niejawne uporządkowanie kategorii: na przykład w matrycy stronnej kategorie (boki) mają domyślny porządek, a obserwacja dowolnej kategorii implikuje istnienie mniejszych kategorii . W części II mamy częściowo zaobserwowany wielomianowy losowy wektor, który nie ma niejawnego uporządkowania. Innymi słowy, dane reprezentują nieuporządkowany podział punktów danych na obserwowanych kategorii. Oznaczę nieuporządkowaną partycję wynikającą z powiększonej o nieobserwowane kategorie, jako .ni∈{1…n}j<im≤nYn−mP[Y]
Prawdopodobieństwo nieuporządkowanej partycji uwarunkowanej prawdziwą liczbą kategorii można znaleźć, biorąc pod uwagę liczbę permutacji kategorii, które prowadzą do tej samej partycji:
n
Pr(P[Y]|α~,n)=n!(n−m)!Pr(Y|α~,n)
I można to zintegrować za pomocą aby uzyskać:
n
Pr(P[Y]|α~,λ)=∑j=m∞Pr(P[Y]|α~,n)Pr(n|λ)
Użycie reguły Bayesa do pobrania tylnej:
Pr(n|P[Y],α~,λ)=Pr(P[Y]|n,α~)Pr(n|λ)Pr(P[Y]|α~,λ)
Po prostu podłącz powyższe definicje. Ponownie mianownik jest nieskończoną serią, która szybko się zbiegnie: w tym prostym modelu MCMC nie wymaga odpowiedniego przybliżenia.
Zmieniając kod R z części I:
logPosteriorN_2 <- function(max, Y, lambda, alpha){
m <- length(Y)
sumy <- sum(Y)
pp <- sapply(1:max, function(j){
prior <- log(lambda)*j - log(exp(lambda)-1) - lgamma(j+1)
likelihood <- lchoose(j, m) + lgamma(m + 1) + lgamma(alpha*j) + sum(lgamma(Y + alpha)) - j*lgamma(alpha) - lgamma(sumy + j*alpha)
if( j > m ) { likelihood <- likelihood + (j-m)*lgamma(alpha) }
else if( j < m ) { likelihood = -Inf }
prior + likelihood
})
evidence <- log(sum(exp(pp))) # there's no check that this converges
pp - evidence
}
Y_1 <- rep(10, 15)
pos_1 <- logPosteriorN_2(50, Y_1, 6, 1)
plot(1:50, exp(pos_1))