2017-08-13 20 views
1

スタンでディリクレ分布を使用する方法を学びたいと思います。値が来る確率、つまり、私は単純にディリクレパラメータを推定したいディリクレの分布パラメータに適合する標準の多項式モデル?

 counts n  factor_var 
    -------- ------ ------------ 
     3710 4386 level 1 
     252  4386 level 2 
     332  4386 level 3 
     59  4386 level 4 
     29  4386 level 5 
     4  4386 level 6 

私は因子変数の6つのレベルのそれぞれの観測値の合計数を持つテーブルを持っています与えられたレベルから。私はそれがR(gtools::rdirichlet(number_of_samples, df$counts))でやり遂げることができることを知っていますが、私は最終的にその推定に基づいた階層的モデルを目指しています。


これまでに得たスタンモデルです。カテゴリ分布の結果は、< 1、n_levels>の離散数であるため、モデルはコンパイルされません。ここで

data { 
     int<lower=1> n_levels; 
     int counts[n_levels]; 
    } 

    parameters { 
     vector<lower=0>[n_levels] priors; 
     simplex[n_levels] level_p; 
    } 

    model { 
     level_p ~ dirichlet(priors); 
     counts ~ categorical_logit(level_p); 
    } 

はRコードです:

df <- 
     data.frame(
     counts=c(3710, 252, 332, 59, 29, 4), 
     n = c(4386, 4386, 4386, 4386, 4386, 4386), 
     factor_var = factor(1:6, labels=paste0('level ', 1:6))) 


    data<-list(
     n_levels=6, 
     counts<-df$counts 
    ) 

    fit1<-stan(
     file='model.stan') 

それを実行している場合は、コンパイル後、私は次のエラーを持っている:

SAMPLING FOR MODEL 'model' NOW (CHAIN 1). 
    Rejecting initial value: 
     Error evaluating the log probability at the initial value. 
    Exception: categorical_logit_lpmf: categorical outcome out of support is 3710, but must be in the interval [1, 6] (in 'model6fffc8dd594_proba_stan' at line 13) 

    ... 

    Initialization between (-2, 2) failed after 100 attempts. 
    Try specifying initial values, reducing ranges of constrained values, or reparameterizing the model. 
    [1] "Error in sampler$call_sampler(args_list[[i]]) : Initialization failed." 
    error occurred during calling the sampler; sampling not done 
+0

level_pの合計が1であると宣言しましたが、それをロジットスケールで使用しました。 _logitを省略すべきですか?カテゴリー別の結果は、単一の結果ではなく、カテゴリー内のカウントに対する多項式であるか? –

+0

'categorical'は数字<1...6>を出力します。累積数があるときは使用できません。 'categorical'は' bernoulli'の分布に似ていますが、私が必要とするのは '二項分布 'です。 @Björn –

+0

それは問題の主要な部分です。したがって多項式です。 –

答えて

0

あなたは多項分布を使用する必要があります。

categorical_logitは、シンプレックスではなくログオッズパラメータを前提としています。

いくつかの一般化されたプリオリを含むマニュアルにディリクレを収める方法の例があります。

関連する問題