避免来自ifelse()的FALSE部分的警告

时间:2017-11-23 22:16:31

标签: r if-statement metafor

我创建了一个用户函数,用于计算 g 的Hedges'c()偏差校正(Hedges,1981)。它直接基于metafor::.cmicalc()的{​​{1}}函数。它这样做:

library(metafor)

当应用于包含值&lt; = 1的向量时,hedges_c <- function(df) { return(exp(lgamma(df / 2) - log(sqrt(df / 2)) - lgamma((df - 1)/2))) } 会生成警告,因为lgamma()(以及任何负值)会生成lgamma(0)。所以,我的解决方案(以及NaN所做的)包含metafor::.cmicalc()语句:

ifelse()

但是,这是我似乎找不到解决方案的问题,它仍会生成hedges_c <- function(df) { cdf <- ifelse(df <= 1, NA, exp(lgamma(df / 2) - log(sqrt(df / 2)) - lgamma((df - 1)/2))) return(cdf) } ,即使所有值都正确呈现为warnings()

示例:

NA

我理解(例如,来自this answer)即使条件为hedges_c(c(0, 0, 20, 14, 0, 0, 0, 0)) #[1] NA NA 0.9619445 0.9452877 NA NA NA NA #Warning messages: #1: In ifelse(df <= 1, NA, exp(lgamma(df/2) - log(sqrt(df/2)) - lgamma((df - : # value out of range in 'lgamma' #(...) ,也会评估FALSE的第三个(ifelse())参数(反之,如果我改变了条件和参数的顺序)......但我根本不知道如何解决这个问题(除了隐藏警告之前和之后......)。

(注意:我也尝试了TRUE,但问题完全相同。)

2 个答案:

答案 0 :(得分:3)

我非常确定无论如何计算这些值,只需按ifelse进行子集计算。您可以随时将您的函数应用于有效值,并将其余部分NA

hedges_c <- function(df) {
  ss <- df >= 1

  hc <- function(x) exp(lgamma(x / 2) - log(sqrt(x / 2)) - lgamma((x - 1)/2))

  df[ss]  <- hc(df[ss])
  df[!ss] <- NA
  df
}

hedges_c(c(0, 0, 20, 14, 0, 0, 0, 0))
#[1]        NA        NA 0.9619445 0.9452877        NA        NA        NA        NA

答案 1 :(得分:3)

尝试使用其他方法。如下所示。

hedges_c <- function(df) {
  cdf <- rep(NA, length(df))
  inx <- df > 1
  cdf[inx] <- exp(lgamma(df[inx] / 2) - log(sqrt(df[inx] / 2)) - lgamma((df[inx] - 1)/2))
  return(cdf)
}

hedges_c(c(0, 0, 20, 14, 0, 0, 0, 0))
#[1]        NA        NA 0.9619445 0.9452877        NA        NA        NA
#[8]        NA

警告消失了。