我创建了一个用户函数来计算 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()
了,但这是完全相同的问题。)