初心者にとって素晴らしい質問です!!!
θ1、… 、θMθM
#normal data with 100 observations
x=rnorm(100)
#observed summaries
sumx=c(median(x),mad(x))
#normal x gamma prior
priori=function(N){
return(cbind(rnorm(N,sd=10),1/sqrt(rgamma(N,shape=2,scale=5))))
}
ABC=function(N){
prior=priori(N) #reference table
#pseudo-data
summ=matrix(0,N,2)
for (i in 1:N){
xi=rnorm(100)*prior[i,2]+prior[i,1]
summ[i,]=c(median(xi),mad(xi)) #summaries
}
#normalisation factor for the distance
mads=c(mad(summ[,1]),mad(summ[,2]))
#distance
dist=(abs(sumx[1]-summ[,1])/mads[1])+(abs(sumx[2]-summ[,2])/mads[2])
#selection
posterior=prior[dist<quantile(dist,.05),]
return(posterior)
}
あなたがプロットした場合
res=ABC(10^5);hist(res[,1])
通常の平均の限界ABC事後を取得します。
ただし、事後予測チェックを実行する場合、事後の1つのコンポーネントを一度に生成して、疑似データと対応する要約を取得することはできません。新しい正規標本を取得するには、平均と分散の両方が必要です!だから私のRコードは
postsample=res[sample(1:length(res[,1]),10^3),]
ABC-posteriorからサンプルを引き出すと、疑似データが以前のように生成されます。
#pseudo-data
summ=matrix(0,M,2)
for (i in 1:M){
xi=rnorm(100)*postsample[i,2]+postsample[i,1]
summ[i,]=c(median(xi),mad(xi)) #summaries
}