Wie verwende ich lmer in einer Funktion?

Ich versuche, eine Funktion zu schreiben, die einige Aufrufe sammelt, die ich häufig in Skripten verwende
In meinen Beispielen verwende ich die Schlafstudiendaten des lme4-Pakets
Hier ist (eine vereinfachte Version von) der Funktion, mit der ich angefangen habe:

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
}

Wenn ich diese Funktion wie folgt aufrufe:

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

Die ersten drei Zeilen der Ausgabe sehen folgendermaßen aus:

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

Wenn ich die Befehle der trimModel1-Funktion in der Konsole aufgerufen hätte, sehen die ersten drei Zeilen der Zusammenfassung des Modells folgendermaßen aus:

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

Der Unterschied ist ein Problem, da mehrere Pakete, die das lme4-Paket verwenden, die Formel- und Datenfelder verwenden. Zum Beispiel verwendet das Effektpaket diese Felder und ein Befehl wie unten funktioniert nicht, wenn ich die Funktion trimModel1 oben verwende:

library(effects)
plot(allEffects(fm1))

Ich habe mich in Stackoverflow- und R-Diskussionsgruppen nach einer Lösung umgesehen und festgestellt, dass Sie das Formelfeld des Modells ändern können. Wenn Sie das Kommentarzeichen entfernenlm@call$formula<-frm Zeile in der trimModel1 Funktion wird das Formelfeld in der Zusammenfassung korrekt angezeigt. Leider bekomme ich immer noch den Fehler, wenn ich eine Funktion aus dem Effektpaket starte:

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

Dies liegt daran, dass das Datenfeld immer noch falsch ist.
Eine andere mögliche Lösung, die ich gefunden habe, ist diese Funktion:

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
}

Wenn ich jetzt die folgenden Befehle in die Konsole eingebe, erhalte ich keine Fehler:

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

Die allEffects-Funktion funktioniert, aber jetzt besteht das Problem darin, dass in der Zusammenfassung des fm2-Modells die Rohdaten der Schlafstudie angezeigt werden. Das ist kein großes Problem mit den Schlafstudiendaten, aber bei sehr großen Datensätzen stürzte Rstudio manchmal ab, wenn ein Modell angezeigt wurde.
Weiß jemand, wie eine (oder beide) dieser Funktionen richtig funktionieren?
Ich glaube, ich muss das Datenfeld fm1 @ call $ ändern, aber ich weiß nicht wie.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage