3

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

hedges_c <- function(df) {
  return(exp(lgamma(df / 2) - log(sqrt(df / 2)) - lgamma((df - 1)/2)))
}

当应用于包含值 <= 1 的向量时,会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.

例子:

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

(注意:我也试过dplyr::case_when()了,但这是完全相同的问题。)

4

2 回答 2

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
于 2017-11-23T22:28:09.770 回答
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

警告消失了。

于 2017-11-23T22:28:17.563 回答