本文へスキップ
からだにいいもの

Rのトピックスを中心に『まだ、まだ、知らない、役に立つ情報?』を発信します。

Rで解析:ECMEアルゴリズムで線形混合モデルを高速に推定する「lmm」パッケージの紹介

医療や生物統計学の分野では、多くの因子が複雑に絡み合って生じるデータを分析することがあります。特に、個体間や測定時点間の変動を考慮したモデルを構築する必要があります。例えば、臨床試験での治療効果評価や遺伝子発現データの解析などです。このような作業では、線形混合モデルの適用が有効な手法とされることがあります。

「lmm」パッケージは、ECME(Expectation/Conditional Maximization Either)アルゴリズムによる最尤推定・制限付き最尤推定に加え、より高速に収束するアルゴリズム、そしてギブスサンプラーやMCMCによるベイズ推定を実装しています。特に、Schafer (1998) “Some improved procedures for linear mixed models” で示された手法を基盤としています。

同じ引数の枠組みの中で、最尤推定・制限付き最尤推定・ベイズ推定を目的に応じて切り替えられる点が、このパッケージの特長です。

パッケージバージョンは1.4。Windows 11 x64 (build 26200)のR version 4.6.0で確認しています。

パッケージのインストール

下記コマンドを実行してください。

# パッケージのインストール
install.packages("lmm")
# パッケージの読み込み
library("lmm")
スポンサーリンク

コマンド例

詳細はコメント、パッケージのヘルプを確認してください。

ECME=Expectation/Conditional Maximization Either。EMアルゴリズムを拡張した反復計算法で、Eステップの後に、パラメータの一部を固定した条件付き最大化(CM)ステップと通常の最大化(M)ステップを組み合わせて尤度関数を最大化します。ML=最尤推定(maximum likelihood)。RML=制限付き最尤推定(restricted maximum likelihood)。

marijuanaデータを用いて、最尤推定・制限付き最尤推定・ベイズ推定を一通り試す例です。

marijuanaデータは、9人の男性被験者に低用量・高用量・プラセボの3種類のマリファナ入りシガレットを投与した臨床試験のデータです(3×3のラテン方格デザイン)。投与15分後・90分後の心拍数の変化が記録されており、54個のデータのうち5個が欠測しています。

ecmeml()・fastml()・ecmerml()・fastrml()・mgibbs()・fastmcmc()に共通するオプション:

オプション意味初期値
y応答変数のベクトル。各被験者(クラスタ)のyiを縦に積んだもの。なし(必須)
subjyと同じ長さのベクトルで、各要素がどの被験者(クラスタ)に属するかを示す。なし(必須)
predyを予測する説明変数の行列。行数はlength(y)と一致し、通常1列目は切片項(定数1)。なし(必須)
xcolpredのうち固定効果Xiに使う列番号。なし(必須)
zcolpredのうち変量効果Ziに使う列番号。なし(必須)
vmaxVi行列を抽出する元になる行列(省略可能)。指定しない場合は単位行列が使われる。単位行列
occyと同じ長さのベクトルで、各要素の測定時点(occasion)を示す。vmaxを指定した場合のみ必要。NULL
startパラメータ(beta・psi・sigma2)の初期値をリストで指定(省略可能)。自動設定

コマンド別に追加される主なオプション:

オプション該当するコマンド意味初期値
maxitsecmeml, ecmerml最大反復回数。ECMEは収束が遅いため反復回数が多めに設定されている。1000
maxitsfastml, fastrml最大反復回数。50
maxitsfastmcmc事後モード探索(fastmode相当)の最大反復回数。100
epsecmeml, fastml, ecmerml, fastrml, fastmcmc収束判定基準。全パラメータの相対変化がepsを下回ると収束とみなす。0.0001
priormgibbs, fastmcmcsigma2・psiに対する事前分布のハイパーパラメータ。a・b・c・Dinvの4要素からなるリストで指定する。なし(必須)
seedmgibbs, fastmcmc乱数生成のシード(正の整数)。なし(必須)
itermgibbs修正Gibbsサンプラーの反復回数。1000
iterfastmcmcMCMC本体の反復回数。1000
start.modefastmcmc事後モード探索の初期値(省略可能)。自動設定
start.mcmcfastmcmcMCMCの初期値(省略可能)。事後モードから開始
dffastmcmcMetropolis-Hastings法で用いる多変量t分布近似の自由度。4
# marijuanaデータセットを読み込む
data(marijuana)

# 欠測値(NA)を除いた完全データのみを使用する
marijuana <- subset(marijuana,!is.na(y))

# 列名で変数を直接参照できるようにデータフレームをアタッチする
attach(marijuana)

# 固定効果・変量効果の説明変数となる計画行列を作成する
pred <- cbind(int,dummy1,dummy2,dummy3,dummy4,dummy5)

# Xi(固定効果)に使う列番号を指定する
xcol <- 1:6

# Zi(変量効果)に使う列番号を指定する(ここでは切片のみ)
zcol <- 1

# ECMEアルゴリズムで最尤推定を行う(212サイクルで収束)
ecmeml.result <- ecmeml(y,subj,pred,xcol,zcol)

# 高速アルゴリズムで最尤推定を行う(8サイクルで収束)
fastml.result <- fastml(y,subj,pred,xcol,zcol)

# 固定効果の推定値(切片=最終時点の平均、残りは各時点との差)を取り出す
beta.hat <- fastml.result$beta

# 6時点分の推定平均値を求める
muhat <- c(beta.hat[2]+beta.hat[1], beta.hat[3]+beta.hat[1],
   beta.hat[4]+beta.hat[1], beta.hat[5]+beta.hat[1],
   beta.hat[6]+beta.hat[1], beta.hat[1]) 

# ECMEアルゴリズムで制限付き最尤推定を行う
ecmerml.result <- ecmerml(y,subj,pred,xcol,zcol)

# 高速アルゴリズムで制限付き最尤推定を行う
fastrml.result <- fastrml(y,subj,pred,xcol,zcol)

# 変量効果の経験ベイズ推定値を取り出す
b.hat <- as.vector(fastrml.result$b.hat)

# 分散パラメータの不確実性を考慮した新しい標準誤差を求める
se.new <- sqrt(as.vector(fastrml.result$cov.b.new))

# 従来の(分散パラメータを固定した)標準誤差を求める
se.old <- sqrt(as.vector(fastrml.result$cov.b))

# 従来法と改良法の95%区間を比較する表を作成する(Table 2を再現)
table2 <- cbind(round(b.hat,3),round(cbind(b.hat-2*se.old,b.hat+2*se.old,
      b.hat-2*se.new,b.hat+2*se.new),2),round(100*(se.new-se.old)/se.old))
dimnames(table2) <- list(paste("Subject",format(1:9)),
   c("Est.","Lower.old","Upper.old","Lower.new","Upper.new","Increase (%)"))
print(table2)

# 事前分布のハイパーパラメータを指定する
prior <- list(a=3*100,b=3,c=3,Dinv=3*5)

# 修正Gibbsサンプラーでベイズ推定を行う(5000サイクル)
gibbs.result <- mgibbs(y,subj,pred,xcol,zcol,prior=prior,seed=1234,iter=5000)

# 高速MCMCアルゴリズムでベイズ推定を行う(5000サイクル)
fmcmc.result <- fastmcmc(y,subj,pred,xcol,zcol,prior=prior,seed=2345,iter=5000)

# tsパッケージのacf()を使う場合はlibrary(ts)を読み込む(base Rのacf()でも動作する)
# 2つのアルゴリズムで得られたpsiの自己相関を比較するグラフを描画する
par(mfrow=c(2,1))
acf(log(gibbs.result$psi.series[1,1,]),lag.max=10, ylim=0:1)
acf(log(fmcmc.result$psi.series[1,1,]),lag.max=10, ylim=0:1)

# アタッチしたデータフレームをデタッチする
detach(marijuana)

実行結果:

Performing ECME...
Performing FAST-ML...
Performing ECME for RML estimation...
Performing FAST-RML...
            Est. Lower.old Upper.old Lower.new Upper.new Increase (%)
Subject 1  0.190     -2.39      2.77     -3.21      3.59           32
Subject 2 -0.168     -2.75      2.41     -3.43      3.09           26
Subject 3  0.011     -2.57      2.59     -2.59      2.61            1
Subject 4  0.215     -2.40      2.83     -3.46      3.89           40
Subject 5 -0.459     -3.06      2.14     -6.50      5.58          133
Subject 6 -0.288     -2.87      2.29     -4.54      3.96           65
Subject 7  0.668     -1.91      3.25     -7.52      8.86          218
Subject 8 -0.482     -3.06      2.10     -6.68      5.71          140
Subject 9  0.313     -2.31      2.93     -4.27      4.90           75
Performing modified Gibbs...
Performing FAST-MODE...
Performing FAST-MCMC...

この記事が誰かの役に立ちますように。

スポンサーリンク
価格および配送状況は変更される場合があります。購入時は商品ページをご確認ください。
当サイトに表示されている商品情報はAmazonから提供されたものであり、更新または削除される場合があります。
karada-goodはAmazonアソシエイトとして、適格販売により収入を得ています。