零膨胀模型加年份随机效应报错:object of type 'symbol' is not subsettable
解决思路
1. 修正参数拼写错误
模型中dzipois(pbar,lamba)的lamba是拼写错误,需改为lambda,否则Stan会将其识别为未定义符号,触发维度相关报错。
2. 修正随机效应的先验语法
随机效应a_yearr的先验写法错误,不能直接在左侧添加[yearr]索引。正确逻辑是先定义整个a_yearr向量的分布,再在预测器中索引对应年份的效应:
# 错误写法 a_yearr[yearr]~dunif(6,sigma1) # 正确写法(以常用的正态随机效应为例,可按需调整分布) a_yearr ~ dnorm(0, sigma1)
另外,dunif(6,sigma1)的参数顺序不符合均匀分布定义(应为dunif(下限, 上限)),若你希望随机效应在0到sigma1区间内,需改为dunif(0, sigma1),但随机效应通常使用正态分布更合理。
3. 修正先验分布函数语法
z1~rnorm(1.85,2.76)中的rnorm是R语言生成随机数的函数,在Stan先验定义中需使用概率密度函数dnorm:
z1 ~ dnorm(1.85, 2.76)
4. 补充完整起始值
当前起始值start=list(z1=1,a=0,d=0)未覆盖a_yearr和sigma1,可能导致初始化失败,需补充对应起始值:
start=list(z1=1,a=0,d=0,a_yearr=rep(0,12),sigma1=1)
修正后的完整代码示例
PredatorFishCountL2 <- rnorm(12067, .12, .23) PreyFishCountL2 <- rnorm(12067, .28, 1.04) yearr <- sample(1:12, 12067, replace=TRUE) FinalTBData2 <- data.frame(PredatorFishCountL2, PreyFishCountL2, yearr) Model1GTB <- ulam( alist( PredatorFishCountL2 ~ dzipois(pbar, lambda), logit(pbar) <- z1, log(lambda) <- a + d*PreyFishCountL2 + a_yearr[yearr], a ~ dnorm(0.26, 0.44), d ~ dnorm(1.3, 2.5), z1 ~ dnorm(1.85, 2.76), a_yearr ~ dnorm(0, sigma1), sigma1 ~ dunif(0, 10) ), data = FinalTBData2, start=list(z1=1,a=0,d=0,a_yearr=rep(0,12),sigma1=1), iter=3000,warmup=2000,chains=3, cores=6, log_lik=TRUE )
内容的提问来源于stack exchange,提问作者user21584544
相关产品推荐
相关产品推荐

