2014-09-03 78 views
2

我在學習rstan,此刻我正在從Gelmans「貝葉斯數據分析」中解答練習。作爲參考,這是約5的示例在第3章stan/R中的均勻分佈導致抽樣誤差

它保持與失敗:

Initialization failed after 100 attempts. 
Try specifying initial values, reducing ranges of constrained values, or reparameterizing the model. 
error occurred during calling the sampler; sampling not done 

這是我的R代碼裏面:

library(rstan) 
scode <- " 
transformed data { 
    real o_data[5]; 
    o_data[1] <- 10; 
    o_data[2] <- 10; 
    o_data[3] <- 12; 
    o_data[4] <- 11; 
    o_data[5] <- 9; 
} 

parameters { 
    real mu; 
    real<lower=0> sigma; 
    real tru_val[5]; 
} 

model { 
    mu ~ uniform(0.0,20.0); 
    sigma ~ gamma(2,1); 
    for (i in 1:5) {  
    tru_val[i] ~ normal(mu,sigma); 
    tru_val[i] ~ uniform(o_data[i]-0.5, o_data[i]+0.5); 
    } 
} 
" 

afit <- stan(model_code = scode, verbose=TRUE) 

有趣的是 - 如果我改變第二個tru_val取樣到tru_val[i] ~ normal(o_data[i],0.5);該模型將評估得很好。

到目前爲止,我試圖在斯坦代碼:

  • 重新安排採樣陳述
  • 引入輔助變量
  • 明確地寫increment_log_p聲明
  • 變化的變量名的情況下,我已經accidentially使用的關鍵字
  • 在斯坦編碼中添加打印語句
  • settin克畝至10
  • 放鬆/加寬約束在均勻分佈的上述

我發現了一些令人驚訝

  • 和組合,我印刷的tru_val這些值 - 不管何種順序語句 - 我使它的打印值通常在-2和+2之間,即使我設置了mu <- 10; sigma <- 1;(在數據部分)和採樣語句tru_val[i] ~ uniform(9.5,10.5)。我真的不知道如何獲得這些數字。

    我真的希望有人可以照亮一些光。

  • 回答

    1

    變量的約束條件需要與您使用的分佈支持相匹配。對於tru_val[i] ~ uniform(9.5, 10.5),tru_val必須定義爲real<lower=9.5,upper=10.5> tru_val[5]

    在本聲明中,tru_val[i] ~ normal(mu, sigma),Stan未從正態分佈中抽取樣本並將其設置爲tru_val[i]。它正在計算聯合分佈函數(在日誌空間中);在這種情況下,它正在評估給定musigma(在日誌空間中)的tru_val[i]的正態概率分佈函數。

    (提問最好的地方是在斯坦用戶郵件列表。)

    +0

    你能否詳細說明如何對我的問題的定義會是什麼樣子 - tru_val [I]〜均勻(o_data [I] -0.5, o_data [i] +0.5)每個條目需要不同的範圍(基於數據)。如何定義這樣一個數組? – bdecaf 2014-09-03 18:42:28

    +0

    做一些reparametrization我最終可以解決這個問題。我對所有這些複雜的代碼並不滿意,但可能應該在抱怨之前瞭解更多STAN;) – bdecaf 2014-09-05 08:28:03

    +1

    斯坦的範圍目前沒有向量化。它們可以是數據或參數,但不是矢量。真正的問題在於你建立模型的方式。有一個不連續點,基本上打破了哈密頓蒙特卡羅。 你可以做的一件事是定義一個從統一變量(0,1)偏移的變換參數。 – syclik 2014-09-17 19:16:48