我创建了一个用户函数,用于计算 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
,但问题完全相同。)
答案 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
警告消失了。