Rでスパースモデリング：glmnetの便利な補助ツール

@tekenuko さんの下記記事が大変勉強になりました。

- [Rでスパースモデリング：Adaptive Lasso - データサイエンティスト(仮)](http://tekenuko.hatenablog.com/entry/2017/11/02/014859)

ところで最近は **glmnet** を便利に使うための補助ツールがいくつか登場していますので、簡単に紹介したいと思います。

## **glmnetUtils**

**glmnetUtils** は **glmnet** を便利にしてくれるパッケージです。

**glmnet** では、データを目的変数と説明変数に分ける必要がありました。

```r:従来のやり方
library(MASS)

# 目的変数、説明変数
y <- as.matrix(Boston[, 14])
X <- as.matrix(Boston[, -14])

# モデリング
library(glmnet)
Lasso <- glmnet(x = X, y = y, alpha = 1)
```

R に使い慣れていると、これは不便です。他のモデルでやるように `y ~ x` のように指定したくなります。
**glmnetUtils** はモデルの指定にフォーミュラを使えるように拡張してくれます。

```r:フォーミュラを使う
library(glmnetUtils)

Lasso2 <- glmnet(medv ~ ., data = Boston)
```

Cross-Validation を使った場合も同様に書けます。

```r:フォーミュラを使う
fit.Lasso.cv2 <- cv.glmnet(medv ~ ., data = Boston,
                           nfolds = 10,
                           alpha = 1, 
                           standardize = TRUE)
```

## **ggfortify**

**ggfortify** は様々なモデルに対するプロットを **ggplot2** バージョンにしてくれるパッケージです。

上記記事では解パスのプロットを自作していますが、**ggfortify** を使えばほとんど同じものが1行で描けます。

```r:ggfortify
library(ggfortify)

autoplot(Lasso2, xvar = "lambda")
```

![glmnet_ggfortify.png](https://qiita-image-store.s3.amazonaws.com/0/2570/432e9dc1-533e-4857-4af8-14c24b245c95.png)

Cross-Validation 版についても同様です。

```r:ggfortify
autoplot(fit.Lasso.cv2)
```

![glmnet_ggfortify2.png](https://qiita-image-store.s3.amazonaws.com/0/2570/929b47ae-20ff-dd1d-23da-054c172662b4.png)

ただし、現在 CRAN にある **ggfortify** にはバグがあり、`xvar` 引数が効かないようです。

- https://github.com/sinhrks/ggfortify/issues/156

したがって、`xvar` を使いたい場合には github 版をインストールする必要があります。

```r:github上からパッケージをインストールする
library(githubinstall)

githubinstall("ggfortify")
```

```
Suggestion:
 - sinhrks/ggfortify  Define fortify and autoplot functions to allow ggplot2 to handle some popular R packages.
Do you want to install the package (Y/n)? 
```

本当にインストールするか確認されますので Y をタイプしてエンターキーを押してください。

## **broom**

**broom** パッケージは、モデルの学習結果を tidy 形式にしてくれます。

```r:tidy
library(broom)

tidied_cv <- tidy(fit.Lasso.cv2)
head(tidied_cv)
```

```
    lambda estimate std.error conf.high conf.low nzero
1 6.777654 84.00465  7.581133  91.58578 76.42351     0
2 6.175546 77.22933  7.550938  84.78027 69.67839     1
3 5.626927 70.74545  7.112371  77.85782 63.63308     2
4 5.127046 64.64968  6.747361  71.39704 57.90232     2
5 4.671574 59.19335  6.302313  65.49567 52.89104     2
6 4.256564 54.54324  5.841787  60.38503 48.70145     2
```

```r:glance
glance_cv <- glance(fit.Lasso.cv2)
glance_cv
```

```
  lambda.min lambda.1se
1 0.03073584  0.5009175
```

tidy 化すると何が嬉しいかというと、tidyverse ツール群によって扱いやすくなります。

例えば **ggplot2** パッケージでカスタマイズした可視化を行うことができます。

```r:ggplot2
library(ggplot2)

ggplot(tidied_cv, aes(lambda, estimate)) + geom_line(color = "red") +
  geom_ribbon(aes(ymin = conf.low, ymax = conf.high), alpha = .2) +
  scale_x_log10() +
  geom_vline(xintercept = glance_cv$lambda.min) +
  geom_vline(xintercept = glance_cv$lambda.1se, lty = 2)
```

![glmnet_tidy.png](https://qiita-image-store.s3.amazonaws.com/0/2570/fcd60bc2-a483-0a01-d7fa-a19cf9a5e568.png)

## まとめ

**glmnet** の便利な補助ツールとして下記3つを紹介しました。

- **glmnetUtils**
    - [Introduction to glmnetUtils](https://cran.r-project.org/web/packages/glmnetUtils/vignettes/intro.html)
- **ggfortify**
    - [Plotting Diagnostics for Linear Models](https://cran.r-project.org/web/packages/ggfortify/vignettes/plot_lm.html)
- **broom**
    - [Tidying glmnet objects](http://varianceexplained.org/broom-gallery/snippets/broom-glmnet.html)

## おまけ

今年もアドベントカレンダーの時期が来ました。
R関連のアドベントカレンダーがいくつか作られています。
簡単な記事でいいので参加してみると楽しいと思います。

- [R Advent Calendar 2017](https://qiita.com/advent-calendar/2017/rlang)
- [RStudio Advent Calendar 2017](https://qiita.com/advent-calendar/2017/rstudio)
- [Stan Advent Calendar 2017](https://qiita.com/advent-calendar/2017/stan)
- [tidyポエム Advent Calendar 2017](https://adventar.org/calendars/2188)

Enjoy!