Код ошибки Отсутствует значение, в котором значение ИСТИНА / ЛОЖЬ требуется в R - PullRequest
0 голосов
/ 16 апреля 2020

Я продолжаю получать это сообщение об ошибке, когда запускаю свой код, и я не уверен, что мне нужно сделать, чтобы это исправить.

Мой код выглядит следующим образом:

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 - это функция, которую я создал для случайного генерирования p в {-1,1})

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Я проверил свой комментарий и чувствую себя более комфортно, предлагая его в качестве ответа.

Попробуйте следующее

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() не должен пропускать пропуски, это должно быть в правой части сравнения.

Предполагая, что target, x и sigmasq - это все значения из df, а не функции, там, вероятно, отсутствует значение. Если это так, и вы намереваетесь добавить исключение для отлова и обработки этих пропусков, которое может выглядеть следующим образом:

# test being your test expression
if(
  if(is.na(test) {Do Stuff for missing values}
  else {original IF statement}
0 голосов
/ 16 апреля 2020

Вам необходимо добавить na.rm=TRUE к функции min, чтобы учесть возможный NA в x.

Ваша функция не будет выполнена, если x содержит NA.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...