glmやglmerのR2、多重共線性、正規性、過分散、ゼロ過剰を確認する (easystats)

# モデルの品質（model quality）のチェック
一般化線形モデルや一般化線形混合モデルのパラメータ推定をRで行う場合、よく用いられるのは`glm`や`glmer`（`lmer`）だと思います。

これらの関数による解析結果の妥当性を評価するために、タイトルに上げたようないくつかの事項を確認したい場合があります。
AICや対数尤度を確認するのとは異なり、これらを確認するにはオブジェクトからデータを抽出したりパッケージを使い分けたりする必要があります。よって結構面倒です。

しかしeasystatsパッケージ群に含まれるperformanceパッケージを使うとかなり簡単にこれらの事項を確認できます。ここではその一例を紹介したいと思います。

※　指標や検定について詳しい説明はしません（統計は勉強中なので踏み込んだ説明が出来ません。ごめんなさい）。あくまでパッケージの紹介と手順の確認のためのメモとして見てもらえればと思います。
※　指標の根拠や算出方法については、[performanceパッケージのマニュアル](https://cran.r-project.org/web/packages/performance/performance.pdf)（あるいは[レファレンス](https://easystats.github.io/performance/reference/index.html)）や[GitHubにあるソースコード](https://github.com/easystats/performance/tree/master/R)で確認できます。レポート等に使用されたい方はそちらを参照してください。


# インストール
CRANとGitHubどちらからでもインストールできます。GitHubは更新が速いので安定版を使いたいのであればCRANのほうがおすすめです。

- CRAN
 
以下のコマンドでインストールできます。

```R
install.packages("performance")
```

- GitHub

easystatsごとインストールすることでインストールできます。

```R
remotes::install_github("easystats/easystats")
```
すでにeasystatsに含まれるパッケージを部分的にインストールしている場合には、依存関係関連でエラーや警告が出たりします。そのため上記コマンドを実行する前にいったんそれらをアンインストールしたほうが良いです。


# 各事項の確認
ここでは以下のパッケージを使用します。

```R
library(performance)
library(MASS)
library(lme4)
library(glmmTMB)
````

テストデータ、テストコードについては各パッケージのヘルプを参考にしました。一部エラーが出ていますが、例示としては問題ないのでそのままにしてあります。

## R2の確認
performanceパッケージでは総称的関数である`r2`で各モデルに対する適切な決定係数（あるいは疑似決定係数）を計算できます。

各モデルに対応するR2は以下のようになっています：

- 線形モデル：R2および調整済みR2
- 一般化線形モデル：Nagelkerke’s R2
- ロジスティックモデル：Tjur’s R2
- 混合モデル：Nakagawa’s R2

参照：[Compute the model's R2](https://easystats.github.io/performance/reference/r2.html)

### lm
```R
> rm1 <- lm(mpg ~ wt + cyl + gear + disp, data = mtcars)
> r2(rm1)
# R2 for Linear Regression

       R2: 0.835
  adj. R2: 0.811
```
### glm
```R
> rm2 <- glm(Days ~ Sex/(Age + Eth*Lrn), data = quine, family = "poisson")
> r2(rm2)
$R2_Nagelkerke
Nagelkerke's R2 
      0.9905114 
```
```R
> # ロジスティックモデル
> rm3 <- glm(cbind(incidence, size - incidence) ~ period, family = binomial, data = cbpp)
> r2(rm3)
$R2_Tjur
  Tjur's R2 
0.001039836 
```
### glmer
```R
> # 一般化線形混合モデル
> rm4 <- glmer(cbind(incidence, size - incidence) ~ period + (1 | herd), family = binomial, data = cbpp)
> r2(rm4)
# R2 for Mixed Models

  Conditional R2: 0.187
     Marginal R2: 0.085
```





## 多重共線性の確認
performanceパッケージでは多重共線性の指標の一つであるVIF統計量を`check_collinearity`で確認できます。
各パラメータに対するVIFの値が示されると同時に、棒グラフで値が可視化できます。VIF<5の場合低い相関、5≤VIF≤10の場合中程度の相関、10<VIFの場合高い相関とみなされます。

参照：[Check for multicollinearity of model terms](https://easystats.github.io/performance/reference/check_collinearity.html)

### glm
```R
> cm1 <- glm(mpg ~ wt + cyl + gear + disp, data = mtcars, family = "gaussian")
> co1 <- check_collinearity(cm1)
> co1
# Check for Multicollinearity

Low Correlation

 Parameter  VIF Increased SE
      gear 1.53         1.24

Moderate Correlation

 Parameter  VIF Increased SE
        wt 5.05         2.25
       cyl 5.41         2.33
      disp 9.97         3.16
> plot(co1)
```
![glm_col.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/19423edf-34e1-87b8-5f45-d21942694640.png)


### glmer
```R
> form <- TICKS ~ YEAR + HEIGHT + (1|BROOD) + (1|INDEX) + (1|LOCATION)
> cm2 <- glmer(form, family = "poisson", data = grouseticks)
 警告メッセージ: 
 checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  で: 
  Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
> co2 <- check_collinearity(cm2)
> co2
# Check for Multicollinearity

Low Correlation

 Parameter  VIF Increased SE
      YEAR 1.00         1.00
    HEIGHT 1.00         1.00
> plot(co2)
```
![glmer_col.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/820e2995-b275-287b-780c-46caf0523bbd.png)



## 正規性の確認
performanceパッケージでは残差の正規性を`check_normality`で確認できます。
標準化された残差に対してシャピロ検定が実行されます。`lm`あるいは`glm`の結果に対してのみ使えます。

参照：[Check model for (non-)normality of residuals.](https://easystats.github.io/performance/reference/check_normality.html)

```R
> nm <- glm(mpg ~ wt + cyl + gear + disp, data = mtcars, family = "gaussian")
> no <- check_normality(nm)
OK: Residuals appear as normally distributed (p = 0.230).
> plot(no)
````
![glm_normal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/9fa0a5cc-c4ec-e3b3-1152-ae50d3476272.png)



## 過分散の確認
performanceパッケージでは`check_overdispersion`で過分散を確認できます。
過分散の指標としてピアソン残差の2乗和に対するカイ二乗検定の結果が示されます。dispersion rateは期待値との比、Pearson's Chi-Squaredはピアソン残差の2乗和、p-valueはp値です。確率分布がポアソン分布になっているモデルが対象です。
**サンプル数（正確には残差自由度）が十分大きい場合に、あくまで過分散のラフな指標として使用可能とのことです（[参考](http://bbolker.github.io/mixedmodels-misc/glmmFAQ.html#overdispersion)）。**

```math
ピアソン残差：pr_i = \frac{(y_i - \hat{\mu}_i)}{\sqrt{\hat{V}_i}}\quad  (y_i:観測iにおける観測値;\quad \hat{\mu}_i:観測iにおける予測値;\quad \hat{V}_i:観測iにおける予測値の分散)
```
（[参考](https://books.google.co.jp/books?id=CzwmBQAAQBAJ&pg=PA189&lpg=PA189&dq=s+pearson+residuals&source=bl&ots=Z2n494mqQB&sig=ACfU3U0Af8D8N3PrU07vbunC8T5fQS7TVg&hl=ja&sa=X&ved=2ahUKEwj5h66AyKnpAhVMfd4KHRgCCPAQ6AEwAHoECAcQAQ#v=onepage&q=s%20pearson%20residuals&f=false)）

※　ピアソン残差の2乗和が自由度＝残差自由度のカイ二乗分布に従うことを利用しているのですが、上記の参考を見てもいまいち導出過程がわかりませんでした。

参照：[Check overdispersion of GL(M)M's](https://easystats.github.io/performance/reference/check_overdispersion.html)

### glm
```R
> po1 <- glm(Days ~ Sex/(Age + Eth*Lrn), data = quine, family = "poisson")
> check_overdispersion(po1)
# Overdispersion test

       dispersion ratio =   10.534
  Pearson's Chi-Squared = 1390.436
                p-value =  < 0.001

Overdispersion detected.
```

### glmer
```R
> form <- TICKS ~ YEAR + HEIGHT + (1|BROOD) + (1|INDEX) + (1|LOCATION)
> po2 <- glmer(form, family = "poisson", data = grouseticks)
 警告メッセージ: 
 checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  で: 
  Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
> check_overdispersion(po2)
# Overdispersion test

       dispersion ratio =   0.412
  Pearson's Chi-Squared = 163.211
                p-value =       1

No overdispersion detected.
```

## ゼロ過剰の確認
performanceパッケージでは`check_zeloinflation`でモデルのゼロ過剰を確認できます。
実際の0の数とモデルから期待される0の数、およびその比が示されます。こちらも確率分布がポアソン分布になっているモデルが対象です。

参照：[Check for zero-inflation in count models](https://easystats.github.io/performance/reference/check_zeroinflation.html)

### glm
```R
> zi1 <- glm(count ~ spp + mined, family = "poisson", data = Salamanders)
> check_zeroinflation(zi1)
# Check for zero-inflation

   Observed zeros: 387
  Predicted zeros: 298
            Ratio: 0.77

Model is underfitting zeros (probable zero-inflation).
```

### glmer
```R
> zi2 <- glmer(count ~ spp + mined + (1|site), family = "poisson", data = Salamanders)
> check_zeroinflation(zi2)
# Check for zero-inflation

   Observed zeros: 387
  Predicted zeros: 311
            Ratio: 0.80

Model is underfitting zeros (probable zero-inflation).
```

# 備考
自己相関を確認する`check_autocorrelation`もあるのですが、これはデータに順序があると仮定してダービーワトソン検定を行うもののようです。残差がAR(1) かどうかを確認するためのものなので注意が必要です。

参照：[Check model for independence of residuals.](https://easystats.github.io/performance/reference/check_autocorrelation.html)

---
performanceパッケージは`glmmTMB`等の他のパッケージの関数にも対応しています。
また収束や外れ値などの確認もできるので気になる方は確認してみてください。


# 参考
- [easystatsについて①: パッケージ群の紹介](https://y-mattu.hatenablog.com/entry/easystats)
- [Package ‘performance’](https://cran.r-project.org/web/packages/performance/performance.pdf)
- [easystats/performance](https://github.com/easystats/performance/tree/master/R)
- [performance: Test if your model is a good model!](https://easystats.github.io/performance/)
- [Compute R2s and other performance indices for all your models!](https://easystats.github.io/blog/posts/performance_presentation/)
- [Check your (Mixed) Model for Multicollinearity with 'performance'](https://easystats.github.io/blog/posts/performance_check_collinearity/)
- [GLMM FAQ](http://bbolker.github.io/mixedmodels-misc/glmmFAQ.html#overdispersion)
- [Modern Applied Statistics with S](https://books.google.co.jp/books?id=CzwmBQAAQBAJ&pg=PA189&lpg=PA189&dq=s+pearson+residuals&source=bl&ots=Z2n494mqQB&sig=ACfU3U0Af8D8N3PrU07vbunC8T5fQS7TVg&hl=ja&sa=X&ved=2ahUKEwj5h66AyKnpAhVMfd4KHRgCCPAQ6AEwAHoECAcQAQ#v=onepage&q=s%20pearson%20residuals&f=false)
- [Package ‘lme4’](https://cran.r-project.org/web/packages/lme4/lme4.pdf)
- [Package ‘glmmTMB’](https://cran.r-project.org/web/packages/glmmTMB/glmmTMB.pdf)
- [DURBIN-WATSON 検定](https://www.xlstat.com/ja/solutions/features/durbin-watson-test)
- [ダービン・ワトソン検定](https://jp.mathworks.com/help/stats/durbin-watson-test.html)