用Stan拟合Stan模型时的尺寸误差

时间:2018-11-12 18:01:45

标签: r logistic-regression rstan multilevel-analysis

尝试使用 rehinking 包中的 map2stan 进行多级逻辑回归时,出现了一个奇怪的错误。 map2stan 将模型的MAP规范转换为Stan(或我想更恰当的rstan)代码。

在给定一组环境和地球物理数据的情况下,该模型预测了在给定位置(30x30 m网格单元)中命中​​特定站点类型的可能性。我已经在整个研究区域中运行了具有完整池化的模型(仅出于比较的目的),没有分池的分水岭将数据分割了(失忆症变体),以及将数据再次聚类的多级模型的非中心参数化/由分水岭索引。当将参数估计值应用于数据以生成概率图时,一切都很好,并会产生明智的结果。毫不奇怪,像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, ...)
)

0 个答案:

没有答案