2014-11-25 5 views
0

В Стан, я получаю следующее сообщение об ошибке:Ошибка узла: требуется декларация без ограничений. найдено симплекс

SYNTAX ERROR, MESSAGE(S) FROM PARSER: 
require unconstrained variable declaration. found simplex. 

ERROR at line 48 
46: for (j in 1:records) { 
47:   real phenology_predictor; 
48:   simplex[7] pi; 
         ^

Я не совсем понимаю, в чем проблема. Когда я использовал real pi[7] вместо simplex[7] pi, я получил другую ошибку:

SYNTAX ERROR, MESSAGE(S) FROM PARSER: 
no matches for function name="categorical_log" 
    arg 0 type=int 
    arg 1 type=real[1] 
available function signatures for categorical_log: 
0. categorical_log(int, vector) : real 
1. categorical_log(int[1], vector) : real 
unknown distribution=categorical 

ERROR at line 63 
62:  
63:     Y[j] ~ categorical(pi); 
            ^
64:  

, которые я не понимаю, либо ... весь мой код:

data { 
    int sites; 
    int records; 
    int Y[records]; 
    vector[records] yday; 
    int site[records]; 
} 
transformed data { 
    int M[sites]; 
} 
parameters { 
    real<lower=0,upper=1> psi; 
    real<lower=0,upper=1000> phi_phen_scale; 
    real phi_alpha; 
    real q_date; 
    real q_date2; 
    real q_site[sites]; 
} 
model { 
    real p[records]; 
    real q[records]; 

// priors 
phi_phen_scale ~ normal(0, 10); 
phi_alpha ~ normal(0, 10); 
q_date ~ normal(0, 10); 
q_date2 ~ normal(0, 10); 

// vectorized 
M ~ bernoulli(psi); 
q_site ~ normal(0, 10); 

for (j in 1:records) { 
    real phenology_predictor; 
    simplex[7] pi; 

    phenology_predictor <- q_date * yday[j] + q_date2 * yday[j]^2; 
    p[j] <- M[site[j]] * inv_logit(phi_alpha + phi_phen_scale * phenology_predictor); 
    q[j] <- inv_logit(q_site[site[j]] + phenology_predictor); 

    pi[1] <- 1-p[j] + p[j]*(1-q[j])^6; 
    pi[2] <- p[j]*q[j] ; 
    pi[3] <- p[j]*(1-q[j])*q[j]; 
    pi[4] <- p[j]*(1-q[j])^2*q[j]; 
    pi[5] <- p[j]*(1-q[j])^3*q[j]; 
    pi[6] <- p[j]*(1-q[j])^4*q[j]; 
    pi[7] <- p[j]*(1-q[j])^5*q[j]; 

    Y[j] ~ categorical(pi); 

} 

} 
+0

Ограниченные локальные параметры, такие как симплексы, не могут быть объявлены внутри блока модели, поскольку они не проверяются. Итак, вы должны просто объявить pi равным вектором длины 7, например '' 'vector [7] pi;' ''. Тем не менее, pi должен быть на симплексе, чтобы быть допустимым аргументом категориальной функции. Не очевидно, что ваше построение pi гарантирует, что все семь элементов неотрицательны и суммируются до единицы, но, возможно, это и есть причина, и они только нарушают эти ограничения из-за числовой неточности. Если это так, вы можете попробовать перенормировать pi, прежде чем передавать его. –

+0

@BenGoodrich, pi должен фактически суммировать до 1 по определению. Вы предполагаете, что мне, возможно, придется перенормировать только из-за ошибок округления? Это такая грандиозная сделка? Пожалуйста, отправьте это как ответ, я соглашусь. – TMS

ответ

3

стесненных локальные параметры, такие как симплексов, не может быть объявлены внутри блока модели, потому что они не проверяются. Итак, вы должны просто объявить pi равным вектором длины 7, например vector[7] pi;. Тем не менее, pi должен быть на симплексе, чтобы быть допустимым аргументом категориальной функции.

Если это так, что символически pi неотрицательно и суммируется с 1, то речь идет о том, чтобы численно они были достаточно близки к неотрицательным и суммировались с чем-то достаточно близким к 1. Я не уверен, что числовой толерант для симплекса в Стэне, но есть место для маневра. Если числовая ошибка является проблемой, то выполнение pi <- pi/sum(pi); перед прохождением pi в функцию categorical может помочь.

+0

Спасибо Бен. Я выполнил ваш ответ, используя ваш комментарий выше. – TMS