2017-11-23 10 views
3

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()を試してみましたが、それはまったく同じ問題です。)

+3

ifelse(...、...、...)の代わりに 'if(...)else ... {...}'を使ってみましたか? – Heikki

+0

@Heikki:可能ですが、ベクトルに適用すると正しく動作しません。 'ifelse()'はそれをベクトル化できるようにします。 –

答えて

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 
+0

私の答えにあなたのコメントに対する答えとして、私はあなたが正しいと信じて、私は 'ifelseのソースを読んで覚えていると私は両方のベクトルを作成するという印象を持って、'はい 'と'いいえ 'サブセット。私は確信していないし、今は時間がないが、明日これに戻ります。 –

+0

私は 'casewhen'でテストし、すべての値も計算します。 –

+0

@Moody_Mudskipper - うん、' case_when'は各比較のすべての論理結果の大きなリストを作成し、最初の 'TRUE'値を探してループします。それで、残りのケースは常にTRUE〜...です。それぞれの比較と 'max.col(result、" first ")'を呼び出すことによって 'case_when'をかなり近似することができます。 – thelatemail

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 

警告が消えました。

関連する問題