有意差でたよっ


R Advent Calendar 2014 の初日の dichika 氏『有意差でたよっ』からネタを拝借します。

せっかくセリフが「有意差でたよっ」なので,本当に有意差が出たときにしゃべっていただきたい。より具体的には, t.test を行った結果,有意差が認められた場合に「有意差でたよっ」と言ってもらいます。

まずオリジナルの t.test を持ってきます。簡単のために数値ベクトルを受け取る t.test.default を取得します。

tt <- stats:::t.test.default

t.test.default の中身を見てみましょう。

print(tt)
# 前略
    rval <- list(statistic = tstat, parameter = df, p.value = pval, 
        conf.int = cint, estimate = estimate, null.value = mu, 
        alternative = alternative, method = method, data.name = dname)
    class(rval) <- "htest"
    return(rval)
}

最後に rval という値を返していることがわかります。この直前に有意差判定を行い,有意ならしゃべってもらえばよさそうです。そこで最後の return の直前に,以下の文を挿入することにします。

if (rval$p.value < 0.05) yeah::detayo()

これを挿入するには,関数の body に対して quote して挿入すればよいです。

tt.body <- body(tt)
ret <- tt.body[[length(tt.body)]]
tt.body[[length(tt.body)]] <- quote(if (rval$p.value < 0.05) yeah::detayo())
tt.body[[length(tt.body) + 1]] <- ret
body(tt) <- tt.body

これで tt の最後の処理の直前に detayo が挿入された状態になりました。

この tt を元の stats 名前空間に戻してやりましょう。

assignInNamespace("t.test.default", tt, getNamespace("stats"))

後は普通に t.test を呼べば OK です。

set.seed(123L)
t.test(rnorm(10, 3))