ошибка размерности при подгонке модели Стэна к рстану - PullRequest
0 голосов
/ 12 ноября 2018

Я получаю странную ошибку при попытке подбора многоуровневой логистической регрессии с использованием map2stan из пакета переосмысления . map2stan переводит спецификацию MAP модели в код Stan (или, я полагаю, более корректно).

Модель прогнозирует вероятность попадания на конкретный тип площадки в заданном месте (ячейки сетки 30x30 м) с учетом набора экологических и геофизических данных.Я уже запускал модели с полным пулом для всей исследуемой области (просто для сравнения), данные разбиты по водоразделам без пулов (вариант амнезии) и нецентрированная параметризация многоуровневой модели, где данные снова кластеризуются/ индексируется водоразделами.Все отлично подходит и дает ощутимые результаты, когда оценки параметров применяются к данным для составления карт вероятности.Неудивительно, что метрики сравнения моделей, такие как WAIC, показывают, что многоуровневая модель подавляет две другие.Я работаю с огромным количеством данных, поэтому время работы моделей очень, очень длинное.Я начал с нецентрированной параметризации, поскольку она, кажется, работает быстрее для многих многоуровневых моделей, но для этого потребовалось 92 часа при 5% выборке данных и 366 часов (2 недели) при 10% выборке.данные.Оба использовали:

chains=2, cores=2, warmup=500, iter=1500

Я хочу запустить нормальную параметризацию модели, а также сравнить время выполнения, так как я видел несколько вариантов, что это будет работать быстрее для некоторых моделей с большими наборами данных,Я использовал это для адаптивного априора нецентрированной модели, которая прекрасно работает:

c(a_watershed, b_COST_DIST_ECOTONE_watershed, …)[WATERSHED_INDEX] ~ dmvnormNC(sigma_watershed, rho_watershed)

Но с использованием точно таких же данных и спецификации модели и изменения адаптивного до этого:

c(a_watershed, b_COST_DIST_ECOTONE_watershed, …)[WATERSHED_INDEX] ~ dmvnorm2(0, sigma_watershed, rho_watershed)

выдает ошибку:

SYNTAX ERROR, MESSAGE(S) FROM PARSER:

Indexed expression must have at least as many dimensions as number of indexes supplied: 
    indexed expression dimensionality = 0; indexes supplied = 1

Это меня немного сбило с толку.Я не смог придумать ничего полезного об этой ошибке на форумах Stan, форумах Google, Stack Exchange и т. Д. Я действительно не знаю, почему нецентрированная параметризация работала бы нормально, но обычная версия сразу дает сбой ссинтаксическая ошибка.Вы видели эту ошибку раньше?Если так, что это обычно указывает?

Приведенный ниже код не является полной моделью (включает больше переменных), но он должен дать вам лучшее представление о ее структуре:

library(rstan)
library(rethinking)

log_stan_multi <- map2stan(
  alist(
    #likelihood
    SITE_NONSITE ~ dbinom( 1 , p ),

    #linear models
    logit(p) <- A + 
      B_COST_DIST_ECOTONE*COST_DIST_ECOTONE +
      B_COST_DIST_HEA*COST_DIST_HEA +
      ... ,

    A <- a + a_watershed[WATERSHED_INDEX],
    B_COST_DIST_ECOTONE <- b_COST_DIST_ECOTONE + b_COST_DIST_ECOTONE_watershed[WATERSHED_INDEX],
    B_COST_DIST_HEA <- b_COST_DIST_HEA + b_COST_DIST_HEA_watershed[WATERSHED_INDEX],
      ..., 


    #adaptive priors
    c(a_watershed, b_COST_DIST_ECOTONE_watershed, b_COST_DIST_HEA_watershed, ...)[WATERSHED_INDEX] ~ dmvnorm2(0,sigma_watershed, rho_watershed),

    #fixed priors
    c(a, b_COST_DIST_ECOTONE, b_COST_DIST_HEA, ...) ~ dnorm(0,10),

    sigma_watershed ~ dcauchy(0,2), 
    rho_watershed ~ dlkjcorr(4)

  ), data=dcc.s.dummy_index_sample, chains=2, cores=2, warmup=500, iter=1000,
  start=list(a=mean(dcc.s.dummy_index_sample$SITE_NONSITE), b_COST_DIST_ECOTONE=0, b_COST_DIST_HEA=0, ... a_watershed=0, b_COST_DIST_ECOTONE_watershed=0, b_COST_DIST_HEA_watershed=0, ...)
)
...