Стандартная ошибка: требуется объявление неограниченной переменной. нашел симплекс

В Стэне я получаю следующую ошибку:

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);

}

}

person Tomas    schedule 25.11.2014    source источник
comment
Ограниченные локальные параметры, такие как симплексы, не могут быть объявлены внутри блока модели, потому что они не проверяются. Итак, вы должны просто объявить pi как простой вектор длины 7, например vector[7] pi;. Тем не менее, чтобы быть допустимым аргументом категориальной функции, пи должно быть на симплексе. Не очевидно, что ваша конструкция числа Пи гарантирует, что все семь элементов неотрицательны и равны единице, но, возможно, это причина, и они только нарушают эти ограничения из-за числовой неточности. Если это так, вы можете попробовать перенормировать число пи, прежде чем передавать его.   -  person Ben Goodrich    schedule 26.11.2014
comment
@BenGoodrich, число Пи по определению должно быть равно 1. Вы предполагаете, что мне, возможно, придется перенормировать только из-за ошибок округления? Неужели это так важно? Пожалуйста, опубликуйте это как ответ, я приму.   -  person Tomas    schedule 26.11.2014


Ответы (1)


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

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

person Ben Goodrich    schedule 26.11.2014
comment
Спасибо, Бен. Я завершил ваш ответ, используя ваш комментарий выше. - person Tomas; 27.11.2014