4

スクリプトでよく使用するいくつかの呼び出しを収集する関数を作成しようとしています
。例では lme4 パッケージの sleepstudy データを使用しています。これが
(簡略化されたバージョンの) 私が始めた関数です。

trimModel1 <- function(frm, df) {
  require(LMERConvenienceFunctions)
  require(lme4)

  lm<-lmer(frm,data=df)
  lm.trimmed = romr.fnc(lm, df)
  df = lm.trimmed$data
  # update initial model on trimmed data
  lm<-lmer(frm,data=df)
#   lm@call$formula<-frm
  mcp.fnc(lm)
  lm
}

以下のようにこの関数を呼び出すと:

(fm1<-trimModel1(Reaction ~ Days + (Days|Subject),sleepstudy))

出力の最初の 3 行は次のようになります。

Linear mixed model fit by REML 
Formula: frm    
Data: df

コンソールで trimModel1 関数のコマンドを呼び出した場合、モデルの概要の最初の 3 行は次のようになります。

Linear mixed model fit by REML 
Formula: Reaction ~ Days + (Days | Subject) 
   Data: sleepstudy 

lme4 パッケージを使用するいくつかのパッケージは式とデータ フィールドを使用するため、違いが問題になります。たとえば、効果パッケージはこれらのフィールドを使用し、上記の trimModel1 関数を使用すると、以下のようなコマンドは機能しません。

library(effects)
plot(allEffects(fm1))

解決策を求めて、stackoverflow と R のディスカッション グループを調べたところ、モデルの数式フィールドを変更できることがわかりました。trimModel1 関数の行のコメントをlm@call$formula<-frm外すと、集計の数式フィールドが正しく表示されます。残念ながら、エフェクト パッケージから関数を実行すると、まだエラーが発生します。

Error in terms.formula(formula, data = data) : 
  'data' argument is of the wrong type

これは、データ フィールドがまだ正しくないためです。
私が見つけた別の解決策は、次の関数です。

trimModel2 <- function(frm, df) {
  require(LMERConvenienceFunctions)
  require(lme4)

  lm<-do.call("lmer",list(frm,data=df))
  lm.trimmed = romr.fnc(lm, df)
  df = lm.trimmed$data
  # update initial model on trimmed data
  lm<-do.call("lmer",list(frm,data=df))
  mcp.fnc(lm)
  lm
}

コンソールに次のコマンドを入力すると、エラーは発生しません。

(fm2<-trimModel2(Reaction ~ Days + (Days|Subject),sleepstudy))
plot(allEffects(fm2))

allEffects 関数は機能しますが、問題は、fm2 モデルの要約に生の sleepstudy データが表示されることです。これは sleepstudy データでは大きな問題ではありませんが、非常に大きなデータセットでは、モデルを表示するときに Rstudio がクラッシュすることがありました。
これらの機能の 1 つ (または両方) を正しく機能させる方法を知っている人はいますか?
fm1@call$data フィールドを変更する必要があると思いますが、方法がわかりません。

4

1 に答える 1

4

次のようにします。

trimModel1 <- function(frm, df) {
  require(LMERConvenienceFunctions)
  require(lme4)
  dfname <- as.name(deparse(substitute(df)))

  lm<-lmer(frm,data=df)
  lm.trimmed = romr.fnc(lm, df)
  df = lm.trimmed$data
  # update initial model on trimmed data
  lm<-lmer(frm,data=df)
  lm@call$formula <- frm
  lm@call$data <- dfname
  mcp.fnc(lm)
  lm
}

オブジェクト自体からオブジェクト名を取得するのは、「deparse-substitute トリック」です。

于 2013-01-11T11:39:01.313 に答える