首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用Stan编写自定义Probit函数

用Stan编写自定义Probit函数
EN

Stack Overflow用户
提问于 2019-05-15 21:16:33
回答 1查看 289关注 0票数 1

我试图在Stan中编写一个定制的Probit函数,以提高我对Stan语言和可能性的理解。到目前为止,我已经写了普通pdf的对数,但收到了一条错误信息,当我试图写出可能性时,我发现这条错误信息是无法理解的。我做错了什么?

Stan模型

代码语言:javascript
代码运行次数:0
运行
复制
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=粘贴(程序,崩溃= "\n"),model_name = model_cppname,:由于上面的错误,无法解析Stan模型'Probit_lpdf‘。

R代码模拟数据

代码语言:javascript
代码运行次数:0
运行
复制
## 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 )
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-15 21:47:45

完整的错误消息是

代码语言:javascript
代码运行次数:0
运行
复制
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函数除三个输入和一个垂直条外,将第一个输入和第二个输入分隔开来。

将函数与斯坦语言(如normal_lpdf )中的函数同名也不是一个好主意。

但是,您编写的函数并不实现probit模型的日志可能性。首先,错误的标准差不是由数据标识的,因此不需要sigma。那么,正确的表达式应该是类似于

代码语言:javascript
代码运行次数:0
运行
复制
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;

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

代码语言:javascript
代码运行次数:0
运行
复制
target += bernoulli_lpmf(y | Phi(mu));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56157744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档