g(Hedges、1981)のHedgesのc()バイアス補正を計算するユーザー関数を作成しました。それは直接metafor::.cmicalc()
の機能に基づいてlibrary(metafor)
からです。なお、この処理を行います。FelSEからの警告を避ける
hedges_c <- function(df) {
return(exp(lgamma(df/2) - log(sqrt(df/2)) - lgamma((df - 1)/2)))
}
値< = 1を含むベクターに適用された場合lgamma(0)
(ならびに任意の負の値)NaN
を生成するので、lgamma()
は、警告を生成します。だから、私のifelse()
声明を含めたソリューション(ともmetafor::.cmicalc()
が何をするのか):ここ
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'
#(...)
ifelse()
の第三(FALSE
)の引数は、私は条件の順序を変更する場合の条件はTRUE
(と逆であっても評価されていることと、議論)...しかし、私は単にそれを解決する方法を知らない(おそらく、前後の警告を隠すことを除いて...)。
(注:私はまたdplyr::case_when()
を試してみましたが、それはまったく同じ問題です。)
ifelse(...、...、...)の代わりに 'if(...)else ... {...}'を使ってみましたか? – Heikki
@Heikki:可能ですが、ベクトルに適用すると正しく動作しません。 'ifelse()'はそれをベクトル化できるようにします。 –