nlmixr2を用いたRでの非線形混合モデル解析の実施とShiny GUIによるモデル探索

## はじめに
非線形混合効果モデルを用いたpopPK解析はFortranのNONMEMで実施されています。こちらのソフトウェアの起源は1980年代と非常に古く，少しずつ改善を加えられながら今日でもpopPK解析のスタンダードとして広く用いられています。
その中で上記のNONMEMにおけるライセンスや実行時間の問題を解決したライセンスフリーのソフトウェアとして開発されたのがRのnlmixr2になります。
ライセンスが要らず簡単にインストールが可能な上，NONMEMで母集団パラメータを推定する際に用いられているFO法や一次条件付き推定(FOCE, First-order Conditional Estination)法に加え，特に複雑なモデルにおいて計算時間や収束性，モデルの安定性，推定精度のベンチマークなどの面でアドバンテージを持った確率的近似期待最大化(Stochastic approximation-estimation maximization)法[1]を実装しているなど(注, NONMEM7.2においても並列化と併せて同様に実装済み)，随所にブラッシュアップがなされています。
現時点ではまだ当局申請で用いられた事例は僅少ないし存在しませんが，アカデミアを始めとして随所で活用が進んでおり，新たなスタンダードとなりつつあります。
また，RのGUIアプリケーションとShinyMixRパッケージを持ちいて連携させることでGUIですべての探索的な解析が行えるだけでなく，Server上で解析が動作するため，ローカルのメモリを圧迫せずに解析が実行できるという点も大きなアドバンテージとして挙げられます。
ShinyおよびRxODEに関しては，以前に執筆した以下の記事をご参照ください。
https://qiita.com/kentaro_BIC/items/886162d7163289c390ef

1. Bach, T., An, G. Comparing the performance of first-order conditional estimation (FOCE) and different expectation–maximization (EM) methods in NONMEM: real data experience with complex nonlinear parent-metabolite pharmacokinetic model. J Pharmacokinet Pharmacodyn 48, 581–595 (2021). https://doi.org/10.1007/s10928-021-09753-0


## 1. nlmixr2および関連パッケージのインストール(R=4.1.3)
nlmixr2ですが，R >= 4.2以上での利用が推奨されており，R=4.1系列の場合は下記の手順で依存関係をある程度指定した上でインストールする必要があります。
また，Windows環境下では別途Rtoolsのインストールと設定(必須かどうかは未確認)を行う必要があり，R，およびRtoolsのバージョンに留意してください。
### 1. 1. パッケージのインストール
今回基本的に必要となってくるパッケージは大別してsymengine, nlmixr2, xpose, Rtools, shinyMixRの5種類です。それぞれ異なったインストール方法が必要なため下記のコマンドでインストールします。
```R
library(remotes) #インストールされていない場合，install.packages("remotes")でインストールを行ってください。
library(devtools) # 同上
remotes::install_version("symengine",version="0.1.6")
install.packages("nlmixr2",dependencies=TRUE)
install.packages("xpose")
install.packages("xpose.nmxixr2")
install.packages("Rtools")
devtools::install_github("richardhooijmaijers/shinyMixR")
```
また，上記のパッケージの概略は下記の通りです，
1. symengine : シミュレーションをC++へコンパイルして実行する際に必要。remotesでインストール
2. nlmixr2 : Rで非線形混合モデル解析を行うためのパッケージ。NONMEMと類似の操作が可能
3. xpose/xpose.nlmixr2 : nlmixr2での解析結果を元にgofプロットなどを作成する際に使用。NONMEMに対しても利用可能
4. Rtools(version 4.0) : ソースファイル経由でパッケージのインストールを行う際に必要。R 4.0-4.13にはRtools 4.0が対応しているため，Versionに注意
5. shinyMixR : 解析結果およびモデルをGUIで表示する際に必要。解析自体には不要なため，GUIでの可視化を行わない場合はインストール不要
### 1. 2. Rtoolsのインストール(Windowsユーザーのみ)
Windowsユーザーの場合，C++などにコンパイルしたスクリプトを実行する際にmakeコマンドやgccコマンドのインストールが必要となります。
これらのコマンドはRtoolsに含まれておりますので，ご自身のRバージョンに対応するRtoolsを下記のサイトからインストールしてください。
https://cran.r-project.org/bin/windows/Rtools/
なお，LinuxやMacのユーザーに関してはこれらのコマンドはデフォルトでインストールされているため，Rtoolsのインストールは必要ありません。

### 1. 3. RtoolsのActivate(Windows, インストールが上手く行かない場合のみ実施)
Rtoolsですが，/Users/<ユーザー名>/Documents/ 以下に".Renviron"という名前のRコンフィグファイルが存在し，そこにRtoolsまでのパスを書き込む必要があります。
場合によってはこちらのファイル自体が存在しないことがありますので，その場合は新たに.Renvironの名前でファイルを作成して下記の内容を書き込んでください。
```Bash
PATH="${RTOOLS40_HOME}\usr\bin;${PATH}"
```
ちなみにこちらの記載内容ですが，GPT-4によると以下の内容になります。
```
コンピューティングにおいて、PATHはUnix系オペレーティングシステム、DOS、OS/2、そしてMicrosoft Windows上の環境変数で、実行可能なプログラムが格納されているディレクトリのセットを指定します。

あなたの質問の文脈において、この環境変数は、Rのパッケージを構築するためのツールの集合体であるRtools40の場所を指定するために使用されています。
Rtools40は一般的に、コードをコンパイルするためのgccのようなユーティリティを提供するためにWindowsシステムで使用されます。
これは、C、C++、またはFortranのコードが含まれているソースからRパッケージをインストールする際に必要とされます。

PATH="${RTOOLS40_HOME}\usr\bin;${PATH}"を分解してみましょう：

${RTOOLS40_HOME}\usr\bin：これは、RTOOLS40_HOME環境変数によって指定された場所、
つまりRtools40がインストールされているルートディレクトリ内の\usr\binディレクトリを指しています。

${PATH}：これは既存のPATH変数です。

PATH="${RTOOLS40_HOME}\usr\bin;${PATH}"：このコマンドは、既存のPATHの先頭に${RTOOLS40_HOME}\usr\binを追加しています。
これは、コマンドを実行するときに、システムがPATHにリストされている他のディレクトリをチェックする前に${RTOOLS40_HOME}\usr\binで関連する実行可能ファイルを探すことを意味しています。

; 文字は、PATH変数内の異なるディレクトリを区切るために使用されます。

${RTOOLS40_HOME}を、それが環境変数として設定されていない場合は、Rtoolsの実際のインストールパスに置き換えてください。

このようなコマンドは通常、Windowsのコマンドラインやスクリプト内で使用され、現在のセッションの間だけPATHを一時的に変更します。
また、システムの環境変数に追加して変更を永続的にすることも可能です。
```

作成したファイルをメモ帳で開いた場合このような形になります。なお，拡張子は不要なため，ファイルを開く際には"メモ帳"か"ワードパッド"アプリで開く必要があります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142725/4a0663c2-37a0-2ef0-ce25-c5a08336626f.png)
これはR起動時にパス(使いたいアプリがどこに存在するかを明示したもの)を読み込むために必要で，今回はRtooksが実際にインストールされた場所(¥usr¥bin)を明示しています。

## 2. nlmixr2を用いた非線形混合効果モデルによる母集団PK解析の実施
### 2. 1. ライブラリの読み込み
先程インストールしたライブラリに加え，データ加工のためのdplyr, data.table, 行列計算のためのMASS, 作図のためのggplot2, gridExtra, 常微分方程式計算のためのrxode2の読み込みが必要となります。必要であればこれらのライブラリをインストールしてください。
Rxode2に関してはこちらの記事中に詳細を記載しております。
https://qiita.com/kentaro_BIC/items/886162d7163289c390ef
```R
## LIBRARY
library(rxode2)
library(nlmixr2)
library(xpose)
library(xpose.nlmixr2)
library(dplyr)
library(ggplot2)
library(MASS)
library(gridExtra)
library(data.table)
```
### 2. 2. 濃度データの読み込み
基本的にnlmixr2ではNONMEMと同様のデータ形式に対応しています。本例では文献中にあるcsv形式で作成されたテストデータを例に紹介します。
*注 nlmixr2はパスに日本語(全角文字)が含まれている場合正常に動作しません。したがって日本語を含まないフォルダで作業を行ってください。
```R
## PATH
deposit <- "/PATH/TO/YOUR/DEPOSIT" # multibyte path is not allowed
setwd(deposit)

## TABLE
dat <- read.csv("examplomycin.csv",na.strings=c("."))
```
データ列としては下記のようにID, TIME, DV(血中濃度), AMT(投与タイミングでの投与量)に加え，Event IdentifierであるEVID，および共変量としてSEX(バイナリ), WTが格納されています。DVとAMTの詳細に関しては下記のとおりです。
#### DV
- 経口投与 : 投与タイムポイントに投与量の記載。単位はμg/mL
- i.v. bolus : 同上
- i.v. infusion
    - 開始時点 : infusion rate
    - 終了時点 : -1 * infusion rate (マイナス表記)

#### EVID(NONMEMのCMTが相当)
- 観察期 : 0
- 経口投与 : 100 * (コンパートメント番号) + 1  
- i.v. bolus : 10000 + 100 * (コンパートメント番号) + 1
- i.v. infusion : AMTと同様の記載
    - 開始時点 : infusion rate
    - 終了時点 : -1 * infusion rate
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142725/1f74acfa-5bbd-5d9e-35d0-fcc201328ef7.png)

### 2. 3. モデル構造の決定
モデル構造や初期値，固定/変量効果についてもNONMEMと同様の形で記述していきます。記述方式自体はRxODEと同様の記法を用いるため，下記の記事も併せて参考にしてください。
https://qiita.com/kentaro_BIC/items/886162d7163289c390ef
model自体はfunction()関数のfunction(){以下にそれぞれ初期値とモデル構造を記載していきます。この際注意すべき事項としてkaやclといったPKパラメータの初期値がlog対数で与えられることがNONMEMとの違いです。log()関数を用いて設定することで初期値設定がコードから見て取れるため，下記のような記法が推奨されています。

```R
## Define 2-compartment model, inits, residual and additive error
model.2cpt.ode <- function() {
    ini({
        tka <- log(1.05) # log(ka)
        tcl <- log(0.121) # log(CL)
        tv2 <- log(1.939) # log(V2)
        tv3 <- log(5.65) # log(V3)
        tq <- log(0.282) # log(Q)
        eta.ka ~ 0.1 # IIV on ka
        eta.cl ~ 0.1 # IIV on CL 
        eta.v2 ~ 0.1 # IIV on V2
        eta.v3 ~ 0.1 # IIV on V3
        eta.q ~ 0.1 # IIV on Q
        prop.err <- 0.075
    })
    model({
        ka <- exp(tka + eta.ka)
        cl <- exp(tcl + eta.cl)
        v2 <- exp(tv2 + eta.v2)
        v3 <- exp(tv3 + eta.v3)
        q <- exp(tq + eta.q)
        d/dt(depot) = -ka * depot
        d/dt(center) = ka * depot - cl / v2 * center + q/v3 * periph - q/v2 * center
        d/dt(periph) = q/v2 * center - q/v3 * periph
        cp = center / v2
        cp ~ add(prop.err)
    })
}
```
#### ini block(initial estimates)の設定
ini blockはNONMEMにおける"THETA", "OMEGA", "SIGMA"ブロックに相当します。
ini({})中にはそれぞれpkパラメータの初期値(THETA), 個体間変動(OMEGA), 個体内変動(SIGMA)を記載していく必要があります。
- PKパラメータ初期値 : THETA
PKパラメータの初期値は"tka <- log(1.05)"のように対数変換されたパラメータを入力します。検討したいコンパートメントモデルに応じてパラメータの必要数は変化するため，モデルに併せた設定が必要です，本例では2コンパートメントモデルを対象としています。
また，ベクトルを用いて"tka <- c(log(0.01), log(1.05), log(10))"といった形で初期値を設定することでパラメータ探索における最小値と最大値の指定も同様に可能です。
- 共変量探索
実際に探索したい共変量の重みに関しても"wteff <- 0.35"のようにini block中で設定します。実際に共変量が関与するパラメータに関してはmodel({})中に式で表すことが可能です。
- 個体間変動(付加誤差，比例誤差，指数誤差) : OMEGA
個体間変動にはそれぞれ付加誤差モデル，比例誤差モデル，指数誤差モデルが存在します。NONMEMで言うETAに相当し"eta.ka ~ 0.1"のような形でそれぞれ値を設定していきます。
誤差モデルに関しては後述のmodel({})中の式にそれぞれ記載することで設定します。
- 個体内変動(付加,比例，指数，混合誤差モデル) : SIGMA
主に血中濃度の誤差を対象にした個体内変動も同様に"prop.err <- 0.075"といった形で設定します。個体内変動に関しても同様にmodes({})中で誤差モデルの定義を行います。

#### model block(NONMEMのPK, PRED, ERRORブロックに該当)
次にini block中で設定したパラメータをもとにコンパートメントモデルおよび誤差モデルの設定，算出パラメータの定義を行っていきます。
基本的にはNONMEMと同様の記法ですが，NONMEMとは異なり，パラメータの順序ではなく変数名で定義するため，やや柔軟かつ読みやすい設定になっています。また，ここで血中濃度などのシミュレーションしたいパラメータも同時に宣誓することが可能です。
ここではclとv2の共変量としてそれぞれWT, SEXを用い，誤差モデルとして付加誤差モデルを設定した2-Compartment modelによるFinal Modelの記載例を示しました。
- PKパラメータ : NONMEMの"PK"ブロックに相当
本項目ではNONMEM様の記述()ではなく，"ka <- exp(tka + eta.ka)"のように定義していますが，これはパラメータ推定法としてNONMEMのFOCE法(METHOD=CONDITIONAL)ではなく，SAEM法(est="saem")を用いているためこのような記述になっています。したがって，後述するコンパイル過程で選んだ推定法に従って記述をしてください。
また，ここでは同様に共編量解析における共変量における重み付けも"cl <- exp(tcl + wteff*WT + eta.cl)"のような形でinit block中で選択した共変量に基づいて設定可能です。
- 物質収支式 : NONMEMのADVAN6,"DES"ブロックに相当
ここで選択したコンパートメントモデルにおける物質収支式を"d/dt(depot) = -ka * depot"といった形で記述します。NONMEMのSUBROUTINEでADVAN6を選択した時と概ね同様の記載になりますが，PKパラメータ同様，init blockで宣誓した変数名を用いて記載可能なためやや柔軟性と可読性に富んでいます。
- 算出パラメータ,個体内変動
最後に求めたいデータ(血中濃度)とそれに対する個体内変動("SIGMA")を規程します。本例では血中濃度に対してadd()ファンクションを用いてinit blockで宣誓した比例誤差(prop.err)を加味する形で個体内変動の影響を考慮しています。


### 2. 3. nlmixr2でのモデルコンパイル
次にfunction(){}中に記載したモデルと読み込んだデータフレームにnlmixr2()ファンクションを用いてC++にコンパイルしていきます。ここでは同時に推定法"est"，および出力テーブル"table"の決定も行っていきます。NONMEMにおける"EST"および"TABLE"ブロックが相当します。
```R
## Compile 2-compartment model with nlme method
fit.2cpt.ode.saem <- nlmixr2(model.2cpt.ode,dat = dat,est="saem", table=tableControl(cwres=TRUE, npde=TRUE))
```
この例では推定法として"saem"を，出力するパラメータとして"cwres(Conditional Weighted RESiduals)"と"npde(Normalized Prediction Distribution Error)"を選択しています。npdeはsaemを推定法に選んでいた場合のみ出力可能です。
他にもsaemによる推定のパラメータを規定する"control"オプションなどがあります。
また推定法としてNONMEMと同様のFOCEi法を用いた"nlme"も選択可能で，その場合はAICやBICなどの出力も可能です。
詳細は下記のurlを参照してください。
https://nlmixr2.org/reference/nlmixr2.html

### 2. 4. xposeでの可視化
解析結果はそのままシームレスにxposeでgofプロットの作成などの可視化をすることが可能です。
xposeはNONMEMでの解析結果可視化に用いられるxpose4と同等の機能を持ったggplot2ベースの可視化パッケージで，xpose.nlmixr2はnlmixr2の解析結果をxposeに渡す役割をもったパッケージになります。
基本的な使い方はxpose_data_nlmixrでxposeのフィッティング結果をxposeオブジェクトへと変換し，それらのデータをもとにGoodness-of-Fitプロットを作図していく形になります。
下記の例ではそれぞれ"dv vs pred", "dv vs ipred", "res vs idv", "res vs pred"の4種類を作図して，最後にgrid.arrangeで2×2のグリッドとして表示しています。


```R
## print the results with xpose 
xp.2cpt.ode.saem <- xpose_data_nlmixr(fit.2cpt.ode.saem, xp_theme = theme_xp_nlmixr2())

# store the result from xpose data object
result <- get_data(xp.2cpt.ode.saem)

# generate each figures 
xp1 <- dv_vs_pred(xp.2cpt.ode.saem, title = "DV vs PRED",subtitle = NULL, caption = NULL) +
  coord_cartesian(ylim=c(0,1000), xlim=c(0,1000)) +
  scale_x_continuous("Population predictions") +
  scale_y_continuous("Observed concentrations")

xp2 <- dv_vs_ipred(xp.2cpt.ode.saem, titile= "DV vs iPRED", subtitle= NULL,caption = NULL) +
    coord_cartesian(ylim=c(0,1000), xlim=c(0,1000)) +
    scale_x_continuous("Population predictions") +
    scale_y_continuous("Observed concentration")
 
xp3 <- res_vs_idv(xp.2cpt.ode.saem, res="CWRES", title="CWRES vs time",subtitle=NULL,caption=NULL) +
    coord_cartesian(ylim=c(-3.5,3.5))+
    scale_x_continuous("Time(h)") +
    scale_y_continuous("Conditional weighted residuals")

xp4 <- res_vs_pred(xp.2cpt.ode.saem, res="CWRES", title="CWRES vs PRED")+
    coord_cartesian(ylim=c(-3.5,3.5))+
    scale_x_continuous("Population predictions") +
    scale_y_continuous("Conditional weighted residuals")

grid.arrange(xp1, xp2, xp3, xp4, nrow=2)
```
上記にある通り，直接xposeオブジェクトを対象とし，dv_vs_pred()ファンクションでggplot2と同様に軸やラベルを追加していくことが可能です。
結果として下記のようなgoodness-of-fitプロットが得られます。
これらをもとに共変量探索やモデルのvalidationを行っていくことが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142725/b19d0b4e-69b5-10c2-155c-00e28c13c0be.png)
なお，xposeの詳しい機能は下記のgithubを参照にしてください。
- xpose : https://github.com/UUPharmacometrics/xpose
- xpose.nlmixr2 : https://github.com/nlmixr2/xpose.nlmixr2

## 3. ShinyMixRでのGUIによる可視化
最後にこれらの結果をShinyMixRを用いて可視化します。
この際に下記のフォルダが必要になります。create_proj()でカレントディレクトリ以下に自動生成されますが，その中でmodels/~以下のファイルに関してはご自身で作成していく必要があります。
#### ディレクトリ構造
- analysis : GUI上で出力/保存した図表が格納されるフォルダ。初期状態では空フォルダ
- data : .rds形式で保存されたmodelファイル。create_proj()で作成され，デフォルト名だと"theo_sd.rds"
- models : run1など，実際に走らせたい解析のモデルが記載されたファイル。前述したinitブロックとmodelブロックをペーストするなどして自ら作成して追加していく。詳細は後述
- scripts : create_proj()で自動生成される以下の3スクリプトからなるディレクトリ。基本的に編集する必要はない
    - combined.results.html.r : 解析結果の受け渡しや処理を行うスクリプト
    - eta.plot.r : etaを作図するためのスクリプト
    - vpc.plot.r : vpcを作図するためのスクリプト
- ShinyMixR
    - app : Shiny appの設定を行うためのスクリプトが格納
        - server.R: server側の処理を記載したスクリプト
        - ui.R: GUIの設定を行うスクリプト
    - temp : 解析の一時ファイルが格納
    - "*.rds" : サーバー上で処理されたRのオブジェクトファイル
 sever.R/ui.Rの詳細はこちらの記事を参考にしてください。
https://qiita.com/kentaro_BIC/items/886162d7163289c390ef

### 3. 1. フォルダの作成
GUIでの可視化に必要なフォルダはShinyMixRのcreate_proj()コマンドでカレントディレクトリ以下に新たに作成されます。
```R
## LIBRARY
library(shinyMixR) # if required

## PATH
setwd("PATH/TO/YOUR/DIRECTORY")

# Create the directory and needed files
create_proj()
```
これでカレントディレクトリ以下に先述した4つのディレクトリが作成されました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142725/89aabc9b-b882-b2b6-6c86-e349133d0a13.png)

### 3. 2. modelsファイルの作成
GUIでの解析を行う前にmodels/以下の解析内容を記したファイルだけは自前で準備をする必要があります。
create_proj()でテンプレートファイルが作成されるのでそれをもとに，"run1.r"といった形でそれぞれのrun内容を記載したスクリプトを作成していきます。
なお，こちらのスクリプト作成はGUI上でも実行が可能です。
#### 必要項目
- data = "theo_sd(デフォルト)" 
data/ディレクトリ中にある.rdsファイル名のみを記載します。デフォルトではtheo_sd.rdsの名前で出力されていますので，その場合は"theo_sd"の名称で格納してください
- desc = "" 
解析概要。複数のモデルを比較する際に任意の記載を加えてください
- ref = "" 
 referenceモデルがある場合は指定してください
- imp = 1 
モデルの重要性です。複数の解析を比較する際に数値を変えて使ってください
- est = "saem(デフォルト)/nlme" 
パラメータ推定に用いるメソッドを選択します。デフォルトではSAEM法ですがNONMEM同様にFOCE法を使いたい場合は"nlme"を選択してください
- control = list()
パラメータ推定での設定をlist形式で渡します。特に制限を加えない場合，このままの記載で問題ありません。
- ini({})
パラメータ探索の初期値と分散，誤差を記入します。記載内容は前述した内容と同じで，複数のモデルを検討する際は"run1.r", "run2.r",...といった形で記載を行っていきます。
- model({})
こちらも前述した内容と同様に，パラメータの定義と微分方程式の記述を行っていきます。ini({})同様，こちらを書き換えることでモデル探索を行っていきます。
下記に2-compartmentモデル解析での例を示します。
```R
run1 <- function() {
  data = "theo_sd" 
  desc = "2-compartment base model" # free writing
  ref  = ""
  imp  = 1 #importance of model
  est  = "saem"
  control = list()
  ini({ # copy the init bloc below
    tka <- log(1.05) # log(ka)
    tcl <- log(0.121) # log(CL)
    tv2 <- log(1.939) # log(V2)
    tv3 <- log(5.65) # log(V3)
    tq <- log(0.282) # log(Q)
    eta.ka ~ 0.1 # IIV on ka
    eta.cl ~ 0.1 # IIV on CL 
    eta.v2 ~ 0.1 # IIV on V2
    eta.v3 ~ 0.1 # IIV on V3
    eta.q ~ 0.1 # IIV on Q
    prop.err <- 0.075
  })
  model({
    ka <- exp(tka + eta.ka)
    cl <- exp(tcl + eta.cl)
    v2 <- exp(tv2 + eta.v2)
    v3 <- exp(tv3 + eta.v3)
    q <- exp(tq + eta.q)
    d/dt(depot) = -ka * depot
    d/dt(center) = ka * depot - cl / v2 * center + q/v3 * periph - q/v2 * center
    d/dt(periph) = q/v2 * center - q/v3 * periph
    cp = center / v2
    cp ~ add(prop.err)
    })
}
```
GUI上ではオブジェクト名(本例ではrun1)がモデル名として表示されます。したがって，複数のrunを行う場合はそれぞれ"run1","run2"といったオブジェクト名で格納してください。
ShinyMixR上では下記のようにGUIで確認と編集ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142725/3d6ec4b1-5842-74d9-9bcb-da7bf5322948.png)

### 3. 2. ShinyMixR appの起動
上記のファイルをもとにshinyを実行していきます。ファイルの実行自体は簡単で，上記のフォルダがあるディレクトリで下記のコマンドを入力することで自動的にサーバーアプリケーションが立ち上がります。
```R
run_shinymixr()
```
このコマンドにより別ウィンドウ，あるいはRstudioのフレーム中にGUIが下記のように立ち上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142725/56e15a51-71a3-b45d-f7c0-f98c54eddef0.png)
移行の操作は基本的にShinyMixR上で行っていきますが，ターミナルでの実行も引き続き可能です。

## 4. ShinyMixR GUI上での操作
ShinyMixRのGUI上では左側のツールバーを利用してモデルの構築→解析→パラメータ推定→フィッティング→モデルの改良→...のサイクルを結果を比較しつつ実行可能です。具体的には以下の機能が存在します。
- Model overview
本画面では各runの概要や結果を一覧で把握することが可能です。Overviewには各runの概要や結果が，Tree Viewにはiterationプロセスが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142725/dae07c51-c473-0dfb-ab50-a33b96c7f855.png)
- Edit model(s)
こちらにはmodelsディレクトリ中の各スクリプトが表示されます。概要を確認するだけでなく，既存モデルの修正や新規モデルの追加，保存なども同様にGUI上で実行可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142725/a7968ca3-ef18-72a0-ce8b-ec2e1e35ff63.png)
- Run model(s)
実際に解析を行う際はこちらのタブから"Run Model(s)"を行うことで実施可能です。
ターミナルに表示されるアウトプットは下のwindowに保持されており，解析途中の確認も同様に行うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142725/450c0cba-6071-2def-2d3d-2a82aafe949c.png)
- Parameter estimates
こちらの画面ではRun model(s)で実行したパラメータ推定の結果が表示されます。OBJFや信頼区間なども表示されるため，こちらの結果を確認しつつ解析を勧めていってください。Save parameter tableで結果をcsvとして出力することも可能です。これらの結果はすべてanalysis/ディレクトリ中に格納されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142725/113278e4-ebbc-b21a-e59c-0fca287e7e8b.png)
- Goodness of fit
このタブでRun modelsで実行したモデルを選択して”Create plot”ボタンを押すことでそれぞれipred.dv, pred.dv, idv.res, pred.resのGoFプロットが作成されます。こちらの図もanalysis/ディレクトリ中に保存されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142725/e1c19308-3ce8-f00b-cca8-3513250b3690.png)
- Fit plots
こちらのタブでは個々の被験者に対してのfitplotを確認することができます。
Settingsのパネルからグルーピングや描画したい数値を選択することができ，その結果は同様にggplot2のオブジェクトとしてディレクトリ中に保存可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142725/a0c4f012-2a01-3223-0f9a-2caf7b12a16e.png)

- Data exploration
こちらのタブでは"Create plots"および"Create table","Create plotly"ボタンを押すことでggplot2の図表を詳細に設定しつつ出力することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142725/64d471b9-3830-5478-9f89-83e66752c948.png)

このようにして一連のpopPK解析をすべてGUI上で繰り返すことができ，また，Server上で動作するため多くのCPUを必要としないなどのメリットがあります。


### 参考文献
1. Fidler, M., Wilkins, J.J., Hooijmaijers, R., Post, T.M., Schoemaker, R., Trame, M.N., Xiong, Y. and Wang, W. (2019), Nonlinear Mixed-Effects Model Development and Simulation Using nlmixr and Related R Open-Source Packages. CPT Pharmacometrics Syst. Pharmacol., 8: 621-633. https://doi.org/10.1002/psp4.12445
2. Bach, T., An, G. Comparing the performance of first-order conditional estimation (FOCE) and different expectation–maximization (EM) methods in NONMEM: real data experience with complex nonlinear parent-metabolite pharmacokinetic model. J Pharmacokinet Pharmacodyn 48, 581–595 (2021). https://doi.org/10.1007/s10928-021-09753-0
3.　https://nlmixr2.org/
4.　https://qiita.com/kentaro_BIC/items/886162d7163289c390ef