如何将逻辑R对象传递到Stan文件中的数据块

时间:2019-09-01 07:15:52

标签: rstan

如果数据列表包含逻辑变量x,即x=TRUEx=FALSE。 那么如何在Stan文件中声明这样的变量?

例如,如果R对象x是整数,则

data{

int <lower=0>x;

}

我想知道其逻辑版本。我猜

data{

               bool x;

    }

,它不能按以下方式工作;

SYNTAX ERROR, MESSAGE(S) FROM PARSER:
 error in 'foo' at line 16, column 0
  -------------------------------------------------
    14:   
    15: 
    16: bool x;
       ^
    17: 
  -------------------------------------------------

PARSER EXPECTED: <one of the following:
  a variable declaration, beginning with type,
      (int, real, vector, row_vector, matrix, unit_vector,
       simplex, ordered, positive_ordered,
       corr_matrix, cov_matrix,
       cholesky_corr, cholesky_cov
  or '}' to close variable declarations>
Error in stanc(filename, allow_undefined = TRUE) : 
  failed to parse Stan model 'foo' due to the above error.

2 个答案:

答案 0 :(得分:2)

Stan没有正确的布尔类型。像C和C ++一样,我们使用整数值0表示false,使用值1表示true。要在Stan中实现布尔类型,请将其声明为下限为0(假)和上限为1(真)的整数。

int<lower = 0, upper = 1> c;

R可以将整数类型与逻辑类型区分开,但是可以进行很多转换。例如,如果我们将b定义为将1与自身进行比较的结果,则其值为TRUE并且其类型为逻辑(R中的logi):

> b = (1 == 1)

> b
[1] TRUE

> str(b)
 logi TRUE

因此,如果我编写的Stan程序在传递的布尔值上的行为不同,

data {
  int<lower = 0, upper = 1> b;
}
parameters {
  real y;
}
model {
  if (b)
    y ~ normal(0, 1);
  else
    y ~ normal(10, 10);
}

RStan很乐意强制使用布尔值,所以可以拥有

fit <- sampling(model, data = list(b = b))

其中值b是R中的logi类型。

答案 1 :(得分:1)

我相信逻辑对于FALSE解析为0L,对于TRUE解析为1L的整数值,因此使用int是合适的。