Winbugs_节点sigma的多重定义

时间:2017-03-10 16:41:13

标签: winbugs

我试图在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

1 个答案:

答案 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)