0

我正在使用Richard McElreath 在R 中的“重新思考”包运行以下模型。每个物种(由species_dummy 表示)都有几棵与之相关的树(由索引[tree] 表示)。我想使用嵌套索引或以某种方式使用物种虚拟变量来允许 r_sigma_species 的两个不同值,每个物种一个。我不知道如何使索引工作。我不相信 McElreath 的 Statistical Rethinking 书中包含任何这样的例子。

我尝试了以下方法:

  • r_tree[tree_index] ~ dnorm(0, r_sigma_species[species_dummy]) ... 但这不起作用,因为重新考虑不会接受 ~ 右侧的索引

  • 分别定义 r_sigma_oak 和 r_sigma_juniper(即两个物种),然后使用虚拟变量: r_sigma_tree[tree_index] ~ r_sigma_juniper * (1-species_dummy) + r_sigma_oak * species_dummy .... 但重新思考不会解释这一点,因为它没有根据[tree_index]自动过滤species_dummy的数据,所以数据行数不匹配。

  • 试图组合索引,如 r_sigma_tree[tree_index][species_dummy] ~ r_sigma_species[species_dummy] ...重新思考似乎并不喜欢组合索引。

由于我已经有了使用“rethinking”包的模型版本,我现在不想切换到 rstan 或任何其他语法。

model <- map2stan(
  alist(
    avg_v_cent ~ dnorm(mu,sigma),
    mu <- a * exp(r * day_cent),
    a <- a_base + a_species*species_dummy + a_tree[tree_index],
    r <- r_base + r_species*species_dummy + r_tree[tree_index][species_dummy],
    
    a_base ~ dnorm(0,1),
    a_species ~ dnorm(0,1),
    a_tree[tree_index] ~ dnorm(0, a_sigma_tree),
    
    r_base ~ dnorm(0,1),
    r_species ~ dnorm(0,1),
    r_tree[tree_index][species_dummy] ~ dnorm(0, r_sigma_species[species_dummy]),
    
    sigma ~ dcauchy(0,1), 
    a_sigma_tree ~ dcauchy(0,1), 
    r_sigma_species[species_dummy] ~ dcauchy(0,1)
  ),
  data=as.data.frame(dataset_2017_2.trim.test), 
  iter=2000,
  warmup = 1000, 
  control = list(max_treedepth = 13, adapt_delta = 0.9),
  chains = 1
)
4

0 回答 0