我正在尝试使用Stan和R拟合一个模型,该模型模拟观察结果 y_i = 16、9、10、13、19、20、18、17、35、55,这些结果来自于一个二项分布随机变量Y_i,其参数为m_i(试验次数)和p_i(每次试验的成功概率)。
yi = c(16, 9, 10, 13, 19, 20, 18, 17, 35, 55)
为了这个实验的目的,我假设所有的m_i都是固定的,并且由m_i = 74、99、58、70、122、77、104、129、308、119给出。
mi = c(74, 99, 58, 70, 122, 77, 104, 129, 308, 119)
我将使用杰弗里先验分布:\alpha=0.5 和 \beta=0.5。
alpha = 0.5, beta = 0.5
我正在尝试:
我对第二个问题的尝试是以下代码段:
real k;
real mx = 0;
real mn = 0;
if (p > mx)
mx = p;
if (mn > p) {
mn = p;
}
k = mx - mn;
我的Stan代码如下所示:
```{stan output.var="BinModBeta"}
data {
int <lower = 1> mi[10];
int <lower = 0> yi[10];
real <lower = 0> alpha;
real <lower = 0> beta;
}
parameters {
real <lower = 0, upper = 1> p[10];
}
transformed parameters {
real k;
real mx = 0;
real mn = 0;
if (p > mx)
mx = p;
if (mn > p) {
mn = p;
}
k = mx - mn;
}
model {
yi ~ binomial(mi, p);
p ~ beta(alpha, beta);
}
```
我的R代码如下:
```{r}
library(rstan)
```
```{r}
data.in <- list(mi = c(74, 99, 58, 70, 122, 77, 104, 129, 308, 119), yi = c(16, 9, 10, 13, 19, 20, 18, 17, 35, 55), alpha = 0.5, beta = 0.5)
model.fit1 <- sampling(BinModBeta, data=data.in)
```
```{r}
print(model.fit1, pars = c("p"), probs=c(0.1,0.5,0.9), digits = 5)
```
现在,我刚开始学习Stan,所以我真的不确定这是否正确。然而,这份代码似乎对我的第一个目标有用(至少,我编码的部分似乎是起作用的……)。但当我尝试编写我的第二个目标时,问题就来了。
当我尝试编译上面的Stan代码时,我得到以下错误:
根据这个错误信息,看起来我的问题是因为p是一个包含10个实数值的向量,而不是一个单一的实数。然而,由于我对Stan的经验不足,我不知道如何解决这个问题。
parameters
块中将p
声明为长度为10的实数向量。因此,这导致了if
语句中的错误。 - Maurits Eversp
声明为实数标量。 - Maurits Eversm_1
是什么?你在“转换参数”块中做了什么?我看不出问题陈述和你的模型之间有什么联系。你能详细说明一下吗? - Maurits Eversmi
只是值为 74、99、58、70、122、77、104、129、308 和 119。在“转换参数”块中,我只是尝试做我在问题 2 中所说的(找到 p_i 的范围)。如果我们删除我描述为“我的尝试 2.”的代码,那么我们剩下的代码就解决了问题 1。但是,据我所见,我的代码适用于问题 1,但不适用于问题 2,这就是我请求帮助的原因。正如您所说,由于p
是实数向量,它不适用于我的 if 语句。那么我该怎么办呢? - The Pointer