stan - 在 Stan 中编写自定义 Probit 函数

标签 stan

我正在尝试在 Stan 中编写自定义 Probit 函数,以提高我对 Stan 语言和可能性的理解。到目前为止,我已经写出了正常 pdf 的对数,但当我尝试写出可能性时,我收到一条错误消息,我发现该消息难以理解。我做错了什么?

斯坦模型

functions {
    real normal_lpdf(real mu, real sigma) {
      return -log(2 * pi()) / 2 - log(sigma) 
             - square(mu) / (2 * sigma^2);
    }
    real myprobit_lpdf(int y | real mu, real sigma) {
      return normal_lpdf(mu, sigma)^y * (1 - normal_lpdf(mu, sigma))^(1-y);
    }
}

data {
    int N;
    int y[N];
}

parameters {
    real mu;
    real<lower = 0> sigma;
}

model {
    for (n in 1:N) {
        target += myprobit_lpdf(y[n] | mu, sigma);
    }
}

错误

解析器预期: stanc 中的错误(model_code = Paste(program,collapse =“\n”),model_name = model_cppname,: 由于上述错误,无法解析 Stan 模型“Probit_lpdf”。

模拟数据的 R 代码

## DESCRIPTION

# testing a Probit model

## DATA
N <- 2000
sigma <- 1
mu <- 0.3
u <- rnorm(N, 0, 2)
y.star <- rnorm(N, mu, sigma)
y <- ifelse(y.star > 0,1, 0)

data = list(
    N = N,
    y = y
)

## MODEL
out.stan <- stan("Probit_lpdf.stan",data = data, chains = 2, iter = 1000 )

最佳答案

完整的错误消息是

SYNTAX ERROR, MESSAGE(S) FROM PARSER:
Probabilty functions with suffixes _lpdf, _lpmf, _lcdf, and _lccdf,
require a vertical bar (|) between the first two arguments.
 error in 'model2a7252aef8cf_probit' at line 7, column 27
  -------------------------------------------------
     5:     }
     6:     real myprobit_lpdf(real y,  real mu, real sigma) {
     7:       return normal_lpdf(mu, sigma)^y * (1 - normal_lpdf(mu, sigma))^(1-y);
                                  ^
     8:     }
  -------------------------------------------------

这告诉您 normal_lpdf 函数不包括三个输入和分隔第一个输入和第二个输入的竖线。

将函数命名为与 Stan 语言中已有函数相同的名称(例如 normal_lpdf)也不是一个好主意。

但是您编写的函数无论如何都没有实现概率模型的对数似然。首先,数据无法识别误差的标准差,因此您不需要sigma。那么,正确的表达方式应该是这样的

real Phi_mu = Phi(mu);
real log_Phi_mu = log(Phi_mu);
real log1m_Phi_mu = log1m(Phi_mu);
for (n in 1:N)
  target += y[n] == 1 ? log_Phi_mu : log1m_Phi_mu;

虽然这只是一个缓慢的做法

target += bernoulli_lpmf(y | Phi(mu));

关于stan - 在 Stan 中编写自定义 Probit 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56157744/

相关文章:

r - 超过了 R 中 DLL 的最大数量

c++ - 安装 Stan for R 和使用 Rcpp 时编译出错

简单多元线性模型的 Rstan 代码

r - 将 Jags 模型转换为 stan 模型

c++ - 错误 : failed to lock directory 'C:/Program Files/R/R-3.0.2/library' for modifying when installing RStan in Rstudio in Windows 7

statistics - 在 stan 中具有单纯形列的矩阵

r-package - 使用 rstan::rstan.package.sculpture 添加到现有 R 包

bayesian - 使用 Stan 的分层模型的 Hyperpriors