【发布时间】:2018-06-25 00:34:36
【问题描述】:
我有一个 Stan 代码,其中一个模型参数取决于另一个参数。我总共有 5 个参数:mu、alpha、beta、gamma、delta。现在 beta 在某种程度上依赖于 alpha-
beta> 1- (alpha/1.17)
.参数块目前的样子:
parameters{
real<lower=0> mu;
real<lower=0,upper=1.17> alpha;
real beta;
real<lower=1> gamma;
real<lower=0> delta;
}
如何将 beta 的下限放入参数块中?
代码是:
expcode="
functions{
real loglikelihood(int N,
real mu,
real alpha,
real beta,
real gamma,
real delta,
real[] t,
real[] m,
real[] rts,
real magmin,
real tmax,
real betalim){
real tempA;
real sumtermA;
real a;
real tempB;
real final;
sumtermA=log(mu);
for(j in 2:N){
tempA=mu;
for(i in 1:(j-1)){
tempA += beta*(exp(alpha*(m[i]-magmin)))*(gamma - 1) * delta^(gamma- 1) *(1 / (t[j]-t[I]+delta)^gamma);
}
sumtermA += log(tempA);
}
tempB=0;
for(j in 1:N){
tempB += beta*(exp(alpha*(m[j]-magmin)))*(1-((delta^(gamma- 1))/((tmax-t[j]+delta)^(gamma-1))));
}
a= mu*tmax;
final= sumtermA-a-tempB+sum(rts);
return(final);
}
}
data{
int<lower=0> N;
real<lower=0> t[N];
real<lower=0> m[N];
real rts[N];
real<lower=0> tmax;
real<lower=0> magmin;
real<lower=0> betalim;
}
parameters{
real<lower=0> mu;
real<lower=0,upper=betalim> alpha;
real<lower=0> beta;
real<lower=1> gamma;
real<lower=0> delta;
}
model{
mu~normal(1.5,1.5);
alpha~normal(0,0.1);
beta~normal(0,0.1);
gamma~normal(1.12,0.16);
delta~gamma(0.1,0.1);
//likelihood
target+= (loglikelihood(N,mu,alpha,beta,gamma,delta,t,m,rts,magmin,tmax,betalim));
}
"
data<- list(N=300,t=runif(300,0,1),m=runif(300,2,9),rts=runif(300,-3,3),tmax=1,magmin=2,betalim=1.17)
【问题讨论】:
-
“如何将 beta 的下限放入参数块中?” 什么意思?您已经在
parameter块中声明了beta(作为下界real)。 -
@MauritsEvers 是的,但它应该大于 1- (alpha/1.17)。我该怎么做?
-
@MauritsEvers 只是做了一点编辑。现在没有设置任何下限。但 beta 应该大于 1- (alpha/1.17)。是否可以将这种约束放在rstan的参数块中?
-
但是你定义了
beta = 1 - alpha / 1.17,所以我不明白你的意思是什么“beta应该大于1-(alpha/1.17)”。beta是1 - alpha / 1.17. -
好的。现在我明白了!抱歉,我把上面的
>符号误认为是损坏的->。您能否提供一个最小示例,包括示例数据(类似于我在下面所做的)以及用于估计alpha和beta的 stan 模型?