我试图在winbugs中运行一个模型,但是我得到了一个输出,上面写着“节点sigma的多个定义”,我不知道如何修复它。有人能帮助我吗?
这是代码:
model{
for(i in 1:10){
for (t in 1:2){
# y[i,t] =collision at intersection i in year t
# mi[i,t] and ma [i,t] = major and minor traffic volume at intersection i at year t
#likehood
y[i,t] ~ dpois(theta[i,t])
# link function (for collision rate)
theta[i,t] <- lambda[i,t] * rate[i,t]
rate [i,t] <- (mi[i,t] + ma[i,t]) /1000
log(lambda[i,t]) <- beta0 + beta1*log(mi[i,t]) + beta2*log(ma[i,t]) + c[i]
c[i] ~ dnorm (0.0, tau)
}
# prior distribution
beta0 ~ dnorm(0.0, 1.0E-6)
beta1 ~ dnorm(0.0, 1.0E-6)
beta2 ~ dnorm(0.0, 1.0E-6)
tau ~ dgamma(0.01, 0.01)
sigma <- 1/ sqrt(tau)
}
}
#data
y[ ,1] y[ ,2] mi[ ,1] ma[ ,1] mi[ ,2] ma[ ,2]
5 3 550 660 561 680
2 1 600 720 612 742
3 5 580 696 591.6 717
4 7 620 744 632.4 766
5 6 700 840 714 865
4 3 710 852 724.2 878
5 3 680 816 693.6 840
8 4 800 960 816 989
7 5 750 900 765 927
10 8 810 972 826.2 1001
END
答案 0 :(得分:0)
for(i于1:10)循环的末端括号位于错误的位置 - 它目前位于模型的末尾,因此beta0,beta1,beta2,tau和sigma被定义了10次。相反,你想要:
public class Repository<T> : IRepository<T>
where T : class, IDisposable
{
internal MyDbContext context;
internal DbSet<T> dbSet;
public Repository()
{
context = new MyDbContext();
this.dbSet = context.Set<T>();
}
public bool Add(T entity)
{
var query = dbSet.Add(entity);
if (query != null)
return true;
return false;
}
public bool Update(T entity)
{
dbSet.Attach(entity);
var query = context.Entry(entity).State = EntityState.Modified;
if (query == EntityState.Modified)
return true;
return false;
}
public bool Delete(T entity)
{
var query = dbSet.Remove(entity);
if (query != null)
return true;
return false;
}
public bool Delete(Guid id)
{
var query = dbSet.Remove(dbSet.Find(id));
if (query != null)
return true;
return false;
}
public T GetById(Guid id)
{
var query = dbSet.Find(id);
if (query != null)
return query;
else
return null;
}
public ICollection<T> GetAll()
{
return dbSet.AsEnumerable<T>().ToList();
}
public void Save()
{
context.SaveChanges();
}
public void Dispose()
{
if (context != null)
{
context.Dispose();
context = null;
}
}
}
在模型代码中使用更严格/一致的缩进有助于使这样的错误更加明显。
- 编辑 -
以下行也存在问题:
model{
for(i in 1:10){
for (t in 1:2){
# y[i,t] =collision at intersection i in year t
# mi[i,t] and ma [i,t] = major and minor traffic volume at intersection i at year t
#likehood
y[i,t] ~ dpois(theta[i,t])
# link function (for collision rate)
theta[i,t] <- lambda[i,t] * rate[i,t]
rate [i,t] <- (mi[i,t] + ma[i,t]) /1000
log(lambda[i,t]) <- beta0 + beta1*log(mi[i,t]) + beta2*log(ma[i,t]) + c[i]
c[i] ~ dnorm (0.0, tau)
}
}
# prior distribution
beta0 ~ dnorm(0.0, 1.0E-6)
beta1 ~ dnorm(0.0, 1.0E-6)
beta2 ~ dnorm(0.0, 1.0E-6)
tau ~ dgamma(0.01, 0.01)
sigma <- 1/ sqrt(tau)
}
c [i]在(t in 1:2)循环中定义,因此每个c [i]定义两次。要么在t循环外定义c [i],要么用i AND t定义c。我猜测它是前者,因此c [i]是交叉的随机效应,但是在观察水平上有这个也是有意义的(因此它是一个过度分散的泊松模型)或者每个中的一个。交集的随机效果如下:
c[i] ~ dnorm (0.0, tau)