当我运行代码时,我不断收到此错误消息,我不确定我需要做什么来修复它。
我的代码如下:
gwmh<-function(target,N,x,sigmasq){
p<-add.var()
samples<-c(x,p)
for(i in 2:N){
prop<-rnorm(1,0,sqrt(sigmasq))
if(runif(1)<min(1,(target(x+abs(prop)*p))/target(x))){
x<-x+prop
samples<-rbind(samples,c(x,p))} else{
p<--p
samples<-rbind(samples,c(x,p))
}
}
samples[(1:N)] ##delete after testing
}
错误说: if (runif(1)
(add.var 是我创建的函数,用于在 {-1,1} 中随机生成 p)
我测试了我的评论,并更愿意将其作为答案提供。
尝试以下操作
if(TRUE){print("Test")}
# prints "Test"
if(FALSE){print("Test")}
# prints nothing
if(NA){print("Test")}
# throws your error
所以在这个表达式中:
runif(1)<min(1,(target(x+abs(prop)*p))/target(x))
结果既不是TRUE
也不是FALSE
而是NA
,并且看到runif()
不应该在比较的 RHS 中抛出任何缺失。
假设target
、x
和sigmasq
都是来自 df 的值,而不是函数,那么那里可能缺少一个值。如果是这种情况,并且还打算添加异常来捕获和处理这些可能如下所示的缺失:
# test being your test expression
if(
if(is.na(test) {Do Stuff for missing values}
else {original IF statement}
您需要将na.rm=TRUE
添加到min
函数中以考虑x
中可能的NA
。如果函数包含 NA,则函数将失败x
。
target <- function(x) dnorm(x, 0, 1)
add.var <- function() runif(1, -1, 1)
gwmh <- function(target,N,x,sigmasq){
p <- add.var()
samples<-c(x,p)
for(i in 2:N){
prop<-rnorm(1,0,sqrt(sigmasq))
if(runif(1) < min(1, (target(x+abs(prop)*p))/target(x), na.rm=TRUE)){ # <- Here
x<-x+prop
samples<-rbind(samples,c(x,p))} else{
p<--p
samples<-rbind(samples,c(x,p))
}
}
samples[(1:N)] ##delete after testing
}
现在尝试:
gwmh(target, N=2, x=c(1,2,NA,3), sigmasq=2)
# [1] 1.00 3.14