R 中的 OpenBUGS 错误:"undefined variable"
OpenBUGS error in R: "undefined variable"
我正在尝试通过库 R2OpenBUGS
在 R 中使用 OpenBUGS 进行分层贝叶斯分析,但我在模型编译的早期阶段一直 运行ning 进入错误消息。我正在尝试将植物功能性状建模为植物大小和环境的函数。对于几种植物物种,我有性状、胸径 (dbh) 和海拔高度的数据。
我的模型和数据规范如下(不包括数据生成部分):
model = function() {
for(i in 1:22){
mu[i] ~ dnorm(0, 0.00001)
env[i] ~ dnorm(0, 0.00001)
s[i] ~ dnorm(0, 0.00001)
me[i] ~ dnorm(0, 0.00001)
for(j in 1:np[i]){
tr[i, j] ~ dnorm(eff[i, j], tau)
eff[i, j] <- mu[i] + s[i] * log(dbh[i, j]) + env[i] * pow(edev[i, j], 2) * (edev[i, j] / abs(edev[i, j]))
edev[i, j] <- e[i, j] - me[i]
}
}
tau ~ dnorm(0, 0.00001)
sig <- 1 / tau
}
library(R2OpenBUGS)
model.file = file.path(tempdir(), "model.txt")
write.model(model, model.file)
data.th = list(tr = tr.th, dbh = dbh, e = elevadj, np = np)
params = c("mu", "env", "s", "me", "sig")
inits = function() { list(mu = rep(1, 22), s = rep(1, 22), env = rep(1, 22), me = rep(1, 22), tau = 1) }
out.th = bugs(data.th, inits, params, model.file, n.iter = 10000, codaPkg = T)
要建模的参数说明:
mu
:物种平均值
s
:大小效应参数
env
:环境(海拔)影响参数
me
:每个物种的理论"optimal"高度
sig
:误差项,用方差表示
数据存储在矩阵 tr.th
、dbh
、elevadj
中,每一行代表每个植物物种。我的数据不平衡:每个物种包含不同数量的样本点。 np
是一个向量,其中包含每个植物物种的实际(非 NA
)样本点数。 (我不知道是否需要实际数据来发现错误,如果需要,我会 post 在这里提供样本)
每当我尝试 运行 这个模型时,我都会遇到一条错误消息,上面写着 "variable dbh is not defined",而且编译失败。这很奇怪,因为我已经成功地 运行 一个模型,之前它与我现在尝试 运行 的模型没有太大区别。我怀疑这可能只是格式或规范上的一个简单、愚蠢的错误,因为我现在才开始使用 Rfor 中的 OpenBUGS 进行贝叶斯分析几周,并且可能遗漏了一些关键点。
我查看了该网站并发现了以下问题,但我没有成功申请解决我的问题:
- OpenBUGS error undefined variable
- OpenBUGS - Variable is not defined
- Trying to create and loop through matrix of unbalanced data in R
阅读 manual 也没有帮助:它提供了以下文字,我无法理解:
'undefined variable' - undefined variables are allowed in the model so long as they are not used on the right hand side of a relation
我正在使用 RStudio,版本 0.98.1091 和 OpenBUGS,版本 3.2.3 rev 1012。
如果有人能帮我查明问题的根源和解决方法,我将不胜感激。
实际上我不确定是否应该编辑我的问题或添加评论,但我找到了问题的根源,所以我会首先尝试在这里解决它。简而言之,错误的不是代码,而是数据格式。
正如我上面所说,在我的模型中,我使用向量 np
来指定不同植物物种的实际(非 NA)样本点的数量,每个样本点都在 j
循环。事实证明,我用来生成np
的代码是不正确的,以至于它实际上与非NA样本点的数量不匹配。因此,当模型尝试调用数据时,它在我的不平衡数据中包含 NA
,我怀疑这是问题的根源,因为我在某处读过 elso.because 我将我的不平衡数据存储在一个矩阵。
为了防止这个问题成为个人博客post,我认为带回家的信息是:
- 彻底检查你的代码(呃)
- 如果您的数据包含
NA
,请小心
- 将数据存储在矩阵中似乎不是一个好主意,尤其是当数据不平衡时
我认为编辑我的问题以更直接地解决第二点和第三点可能会更好,但我还不确定该怎么做。
我正在尝试通过库 R2OpenBUGS
在 R 中使用 OpenBUGS 进行分层贝叶斯分析,但我在模型编译的早期阶段一直 运行ning 进入错误消息。我正在尝试将植物功能性状建模为植物大小和环境的函数。对于几种植物物种,我有性状、胸径 (dbh) 和海拔高度的数据。
我的模型和数据规范如下(不包括数据生成部分):
model = function() {
for(i in 1:22){
mu[i] ~ dnorm(0, 0.00001)
env[i] ~ dnorm(0, 0.00001)
s[i] ~ dnorm(0, 0.00001)
me[i] ~ dnorm(0, 0.00001)
for(j in 1:np[i]){
tr[i, j] ~ dnorm(eff[i, j], tau)
eff[i, j] <- mu[i] + s[i] * log(dbh[i, j]) + env[i] * pow(edev[i, j], 2) * (edev[i, j] / abs(edev[i, j]))
edev[i, j] <- e[i, j] - me[i]
}
}
tau ~ dnorm(0, 0.00001)
sig <- 1 / tau
}
library(R2OpenBUGS)
model.file = file.path(tempdir(), "model.txt")
write.model(model, model.file)
data.th = list(tr = tr.th, dbh = dbh, e = elevadj, np = np)
params = c("mu", "env", "s", "me", "sig")
inits = function() { list(mu = rep(1, 22), s = rep(1, 22), env = rep(1, 22), me = rep(1, 22), tau = 1) }
out.th = bugs(data.th, inits, params, model.file, n.iter = 10000, codaPkg = T)
要建模的参数说明:
mu
:物种平均值s
:大小效应参数env
:环境(海拔)影响参数me
:每个物种的理论"optimal"高度sig
:误差项,用方差表示
数据存储在矩阵 tr.th
、dbh
、elevadj
中,每一行代表每个植物物种。我的数据不平衡:每个物种包含不同数量的样本点。 np
是一个向量,其中包含每个植物物种的实际(非 NA
)样本点数。 (我不知道是否需要实际数据来发现错误,如果需要,我会 post 在这里提供样本)
每当我尝试 运行 这个模型时,我都会遇到一条错误消息,上面写着 "variable dbh is not defined",而且编译失败。这很奇怪,因为我已经成功地 运行 一个模型,之前它与我现在尝试 运行 的模型没有太大区别。我怀疑这可能只是格式或规范上的一个简单、愚蠢的错误,因为我现在才开始使用 Rfor 中的 OpenBUGS 进行贝叶斯分析几周,并且可能遗漏了一些关键点。
我查看了该网站并发现了以下问题,但我没有成功申请解决我的问题:
- OpenBUGS error undefined variable
- OpenBUGS - Variable is not defined
- Trying to create and loop through matrix of unbalanced data in R
阅读 manual 也没有帮助:它提供了以下文字,我无法理解:
'undefined variable' - undefined variables are allowed in the model so long as they are not used on the right hand side of a relation
我正在使用 RStudio,版本 0.98.1091 和 OpenBUGS,版本 3.2.3 rev 1012。
如果有人能帮我查明问题的根源和解决方法,我将不胜感激。
实际上我不确定是否应该编辑我的问题或添加评论,但我找到了问题的根源,所以我会首先尝试在这里解决它。简而言之,错误的不是代码,而是数据格式。
正如我上面所说,在我的模型中,我使用向量 np
来指定不同植物物种的实际(非 NA)样本点的数量,每个样本点都在 j
循环。事实证明,我用来生成np
的代码是不正确的,以至于它实际上与非NA样本点的数量不匹配。因此,当模型尝试调用数据时,它在我的不平衡数据中包含 NA
,我怀疑这是问题的根源,因为我在某处读过 elso.because 我将我的不平衡数据存储在一个矩阵。
为了防止这个问题成为个人博客post,我认为带回家的信息是:
- 彻底检查你的代码(呃)
- 如果您的数据包含
NA
,请小心
- 将数据存储在矩阵中似乎不是一个好主意,尤其是当数据不平衡时
我认为编辑我的问题以更直接地解决第二点和第三点可能会更好,但我还不确定该怎么做。