線形回帰モデルの評価と比較はperformanceパッケージ一択？

# 1.はじめに
回帰モデルは使って終わりではありません。モデルの仮定をしっかり認識した上で評価する必要があります。例えば線形回帰モデルだと
- 線形性
- 多重共線性
- 等分散性の仮定
- 影響値
- 事後予測チェック
- 正規性
- 情報量規準(AIC,BIC,R2,ICC,RMSE等)

さらに、モデルは複数個作成することも当然ありますので、モデル群の比較も並行して行わなければなりません。しかし、それぞれの指標やプロットを出力しようとすると、たくさんのパッケージを使わなければならず、非常に大変です。

しかし、そういった煩わしさを解決してくれるR言語のパッケージ(performance package)があるらしいので、共有したいと思いました(*本記事では各指標についての解釈や説明は扱いません)。

# 2.performanceパッケージ
performanceパッケージで用いる関数とのワークフローは以下の通りです。
(参考：https://easystats.github.io/performance/)

![スクリーンショット 2024-07-18 14.39.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381702/95f635c5-fc61-67c3-9013-eddfc743bde6.png)

このように、たった4つの関数で複数の指標を一気に表示させ、モデル比較まで可能にしてくれます。とても便利ですね！


# 3.ハンズオン
データはRのdatariumパッケージに存在するmarktingデータを使います。
```
install.packages("datarium")
library(datarium)
mkt <- as.data.frame(marketing)
head(mkt, 3)

#output
  youtube facebook newspaper sales
1  276.12    45.36     83.04 26.52
2   53.40    47.16     54.12 12.48
3   20.64    55.08     83.16 11.16
```

この時、予測したい従属変数をsalesとしてこれをyoutubeのみで予測するモデル1、youtube,facebookを独立変数とするモデル2、youtube, facebook,newspaperの三つ全ての変数を入れるモデル2を作るとします。
(*この記事ではモデルについての考察や踏み込んだ議論は致しません)

```
#モデルの作成
model_1 = lm( formula = sales ~ youtube, data = mkt)
model_3 = lm( formula = sales ~ youtube + facebook + newspaper, data = mkt)
```

次にモデルチェックに入ります。check_model()を使うだけで一気に可視化できます。
```
check_model(model_1)
check_model(model_2)
```

### モデル1の評価
![スクリーンショット 2024-07-19 10.32.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381702/0bc97cc3-0dd5-abd2-ad94-1d8d095ceca7.png)

### モデル2の評価
![スクリーンショット 2024-07-19 10.56.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381702/4ee3e973-0355-995e-a5f9-737204932224.png)


### モデル3の評価![スクリーンショット 2024-07-19 10.33.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381702/c217d404-3eb9-2482-67bd-fc6ec2219a83.png)

単一のモデルの評価指標についてはmodel_performance()を使い、複数のモデル指標の比較にはcompare_performance()を使うことで、複数の評価指標を出すことができます。
さらにrank=TRUEとすることで、モデルパフォーマンスの複合的な指標を簡単に計算し、モデルの出力を最良順に並び替えてくれます。

### モデル比較
```
#モデル1のみの評価指標を出力する
model_performance(model_1)

#output
> model_performance(model_1)
# Indices of model performance

AIC      |     AICc |      BIC |    R2 | R2 (adj.) |  RMSE | Sigma
------------------------------------------------------------------
1117.020 | 1117.142 | 1126.915 | 0.612 |     0.610 | 3.891 | 3.910

#複数のモデルの評価指標を最良順に一気に出力する
compare_performance(model_1,model_2,model_3,rank = TRUE,verbose = FALSE)

#output
# Comparison of Model Performance Indices

Name    | Model |    R2 | R2 (adj.) |  RMSE | Sigma | AIC weights | AICc weights | BIC weights | Performance-Score
------------------------------------------------------------------------------------------------------------------
model_2 |    lm | 0.897 |     0.896 | 2.002 | 2.018 |       0.728 |        0.738 |       0.933 |           100.00%
model_3 |    lm | 0.897 |     0.896 | 2.002 | 2.023 |       0.272 |        0.262 |       0.067 |            68.51%
model_1 |    lm | 0.612 |     0.610 | 3.891 | 3.910 |    3.99e-58 |     4.22e-58 |    2.66e-57 |             0.00%

```

モデル2のパフォーマンスが一番良さそうですね！ではさらに、上の指標を可視化してもっとわかりやすくしてみましょうか。
上のコードをplot関数で囲ってあげると可視化できます。

### モデル比較の可視化
```
plot(compare_performance(model_1, model_2,model_3,rank = TRUE, verbose = FALSE))
```
![スクリーンショット 2024-07-19 11.13.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381702/5a4eeffa-7ebb-b7f5-67df-4233ef89fab5.png)

このように、モデル2は全部の独立変数を入れるモデル3に比べて、AICやBICの点で優位であることがわかりました。


# 4.まとめ
いかがでしょうか。これまで、各診断プロットを全て出力させようとすると、様々なパッケージを扱わないといけませんでしたが、performenceパッケージを利用することで、全て一貫させることができました。これにより、モデル作成後のモデルチェックやモデル比較が非常に簡単になるのはいうまでも無いでしょう。

また、今回はデフォルトのlm関数でハンズオンを行いましたが、glm関数や、rstanarmパッケージで用いるstan_glm関数にも適用することもできます(この時はwaicを算出してくれます)。
是非とも皆さんも使ってみてください！