niszetの日記

細かい情報を載せていくブログ

(R) 隠れtidyverse modelr編 とりあえず使ってみる 3回目 誤差の指標関係

前回の続き

niszet.hatenablog.com

niszet.hatenablog.com

本題

mae

Mean Absolute Errorを計算してくれます。

modelr::mae(lm(iris$Sepal.Length ~ iris$Petal.Length), iris)
# [1] 0.3264736

実際に定義に従って計算してみます。

iris %>%  modelr::add_residuals(lm(iris$Sepal.Length ~ iris$Petal.Length)) %>% select(resid) %>%  abs() %>% unlist() %>% mean()
# [1] 0.3264736

一致しました。しかし、以降の関数も含めてpipeフレンドリーではない(データが第2引数)なのが惜しい…
ただし、pipe受け付けないわけではなく、以下のように.を置いてあげれば書けます。

iris %>% modelr::mae(lm(iris$Sepal.Length ~ iris$Petal.Length), .)
# [1] 0.3264736

記述量がかなり減るので便利感ありますね。

qae

quantiles of absolute errorのことだそうです。

modelr::qae(lm(iris$Sepal.Length ~ iris$Petal.Length), iris)
#         5%        25%        50%        75%        95% 
# 0.02893018 0.12853812 0.29006196 0.47718642 0.74273864 

先の残差の絶対値をstats::quantileを使って上記の%の値を表示しています。

rmse

Root Mean Square Errorを計算してくれます。

modelr::rmse(lm(iris$Sepal.Length ~ iris$Petal.Length), iris)
# [1] 0.4043516

こちらも定義にしたがって計算。

iris %>%  modelr::add_residuals(lm(iris$Sepal.Length ~ iris$Petal.Length)) %>% select(resid) %>%  abs() %>% unlist() %>% `^`(2) %>%  mean() %>%  sqrt()
# [1] 0.4043516

一致しました。

rsquare

ヘルプによれば、the variance of the predictions divided by by the variance of the response.とのことですが、これって普通にbroom::glanceでとってくれば良いのでは…?

やってみます。

modelr::rsquare(lm(iris$Sepal.Length ~ iris$Petal.Length), iris)
# [1] 0.7599546
iris %>%  modelr::fit_with(lm, formulas(~Sepal.Length, model1=~Petal.Length) ) %>%  map(broom::glance)
# $model1
#   r.squared adj.r.squared     sigma statistic      p.value df    logLik      AIC      BIC deviance df.residual
# 1 0.7599546     0.7583327 0.4070745  468.5502 1.038667e-47  2 -77.02021 160.0404 169.0723 24.52503         148
# 

glanceの結果に含まれていますね。これを抜き出せば良いはずですが、値がそのまま出るという意味では便利…かも?ですね。

次以降は重い…

これでmodelrの簡単な方の関数が概ね終わり?
あとはresample系が結構重いので全部見るのは9月に入ってしまうかも。

あ、TokyoR 64 でLTやります。
タイトルは「Rからmidiファイルを読んで
plotしてみたお話」になる予定。。。

なので、この続きは週明けから。動作を確認していかなくては…

個人的には前回のfit_withがかなり便利だと思っていて、データとモデルの式を分離できる。しかもモデルの関数部分も分離できるということで、あれはかなり汎用性が高いのではないかと思いました。
broomとあわせて使いこなしたいですね…

Enjoy!