我正在使用包rethinking
的包,其中包含函数map()
和map2stan()
来执行贝叶斯估计(后者作为rstan
的接口)。 map()
和map2stan()
采用alist()
个公式来定义可能性和先验,例如:
alist(
height ~ dnorm(mu, sigma),
mu ~ dnorm(178, 20),
sigma ~ dunif(0, 50)
)
打印为:
[[1]]
height ~ dnorm(mu, sigma)
[[2]]
mu ~ dnorm(178, 20)
[[3]]
sigma ~ dunif(0, 50)
我正在尝试探索先验的效果,所以我希望能够通过不同的手段和标准偏差。我可以将先验分成一个分号分隔的字符串,如:
s <- "height ~ dnorm(mu, sigma); mu ~ dnorm(178, 20); sigma ~ dunif(0, 50)"
我认为我应该能够在;
上拆分并分配给alist()
。但我无法弄清楚这最后一步。
我尝试过各种变体:
do.call("alist", unlist(strsplit(s,";")))
和
as.vector(unlist(strsplit(s,";")), mode = "alist")
前者因second argument must be a list
失败而后者失败,因为as.vector()
没有“alist”模式。
也许更普遍的问题是:如何将字符串输入alist()
?我已经在this question中阅读了答案,但我无法弄清楚如何针对这个特定问题进行调整。
答案 0 :(得分:2)
alist
只返回一个列表,所以你应该能够通过创建一个公式列表来逃脱。
library(magrittr)
s %>%
strsplit("; ", fixed = TRUE) %>%
extract2(1) %>%
lapply(as.formula)
答案 1 :(得分:2)
这将完成这项工作:
lapply(strsplit(s, ";")[[1]], function(x) parse(text = x)[[1]])