Wie passe ich ein nichtlineares Mischeffektmodell für Daten mit wiederholten Messungen mit nlmer () an?

11

Ich versuche, Daten mit wiederholten Messungen zu analysieren, und habe Probleme, sie zum Laufen zu bringen R. Meine Daten sind im Wesentlichen die folgenden, ich habe zwei Behandlungsgruppen. Jedes Subjekt in jeder Gruppe wird jeden Tag getestet und erhält eine Punktzahl (der Prozentsatz, der bei einem Test korrekt ist). Die Daten sind im Langformat:

Time Percent Subject   Group
   1       0    GK11 Ethanol
   2       0    GK11 Ethanol
   3       0    GK11 Ethanol
   4       0    GK11 Ethanol
   5       0    GK11 Ethanol
   6       0    GK11 Ethanol

Die Daten ähneln einer logistischen Kurve, die Probanden schneiden einige Tage lang sehr schlecht ab, gefolgt von einer raschen Verbesserung, gefolgt von einem Plateau. Ich würde gerne wissen, ob sich die Behandlung auf die Testleistungskurve auswirkt. Mein Gedanke war, nlmer()in dem lme4Paket in zu verwenden R. Ich kann Linien für jede Gruppe wie folgt anpassen:

print(nm1 <- nlmer(Percent ~ SSlogis(Time,Asym, xmid, scal) ~ Asym | Subject,
salinedata, start = c(Asym =.60,  xmid = 23, scal = 5)), corr = FALSE)

Ich kann dann Gruppen vergleichen, indem ich mir die Schätzungen für die verschiedenen Parameter und Standardabweichungen der geschätzten Linien ansehe, aber ich bin nicht sicher, ob dies der richtige Weg ist. Jede Hilfe wäre sehr dankbar.

Ian
quelle

Antworten:

4

Sie können normale Likelihood-Ratio-Tests verwenden. Hier ist ein einfaches Beispiel. Lassen Sie uns zunächst anhand Ihrer Parameter Beobachtungen von 10 Personen erstellen:

Asym = .6
xmid = 23
scal = 5

n = 10
time = seq(1,60,5)

d = data.frame(time=rep(time,10),
               Asym, xmid, scal, group=0)
d$subj = factor(rep(1:n, each=length(time)))

Lassen Sie nun die Hälfte von ihnen unterschiedliche Asymptoten und Mittelpunktsparameter haben:

ind = (nrow(d)/2):nrow(d)
d$Asym[ind] = d$Asym[ind] + .1
d$xmid[ind] = d$xmid[ind] + 10
d$group[ind] = 1
d$group=factor(d$group)

Wir können Antwortwerte für alle Personen basierend auf dem Modell simulieren:

set.seed(1)
d = transform(d, y = Asym/(1+exp((xmid-time)/scal)) +
                     rnorm(nrow(d), sd=.04))
library(lattice)
xyplot(y~time | group, group=subj,
       data=d, type=c("g","l"), col="black")

Spaghetti-Diagramme der Daten

Wir können deutliche Unterschiede zwischen den beiden Gruppen erkennen, Unterschiede, die die Modelle erkennen sollten. Versuchen wir nun zunächst, ein einfaches Modell anzupassen, wobei Gruppen ignoriert werden:

> fm1 = nls(y ~ SSlogis(time, Asym, xmid, scal), data=d)
> coef(fm1)
      Asym       xmid       scal 
 0.6633042 28.5219166  5.8286082

Möglicherweise liegen die Schätzungen für Asymund xmidirgendwo wie erwartet irgendwo zwischen den tatsächlichen Parameterwerten für die beiden Gruppen. (Dass dies der Fall wäre, ist jedoch nicht offensichtlich, da der Skalierungsparameter ebenfalls geändert wird, um die Fehlspezifikation des Modells auszugleichen.) Nun passen wir ein vollständiges Modell mit unterschiedlichen Parametern für die beiden Gruppen an:

> fm2 = nls(y ~ SSlogis(time, Asym[group], xmid[group], scal[group]),
          data=d,
          start=list(Asym=rep(.6,2), xmid=rep(23,2), scal=rep(5,2)))
> coef(fm2)
    Asym1     Asym2     xmid1     xmid2     scal1     scal2 
 0.602768  0.714199 22.769315 33.331976  4.629332  4.749555

Da die beiden Modelle verschachtelt sind, können wir einen Likelihood-Ratio-Test durchführen:

> anova(fm1, fm2)
Analysis of Variance Table

Model 1: y ~ SSlogis(time, Asym, xmid, scal)
Model 2: y ~ SSlogis(time, Asym[group], xmid[group], scal[group])
  Res.Df Res.Sum Sq Df  Sum Sq F value    Pr(>F)    
1    117    0.70968                                 
2    114    0.13934  3 0.57034  155.54 < 2.2e-16 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Der extrem kleine p- Wert zeigt deutlich, dass das einfache Modell zu einfach war; die beiden Gruppen sich in ihren Parametern.

Die Schätzungen der beiden Skalenparameter sind jedoch mit einer Differenz von nur 0,1 nahezu identisch. Vielleicht brauchen wir nur einen Skalenparameter? (Natürlich wissen wir, dass die Antwort ja ist, da wir Daten simuliert haben.)

(Der Unterschied zwischen den beiden Asymptotenparametern beträgt ebenfalls nur 0,1, aber das ist ein großer Unterschied, wenn wir die Standardfehler berücksichtigen - siehe summary(fm2).)

So passen wir ein neues Modell, mit einem gemeinsamen scaleParameter für die beiden Gruppen, aber anders Asymund xmidParametern nach wie vor:

> fm3 = nls(y ~ SSlogis(time, Asym[group], xmid[group], scal),
          data=d,
          start=list(Asym=rep(.6,2), xmid=rep(23,2), scal=5))
> coef(fm3)
     Asym1      Asym2      xmid1      xmid2       scal 
 0.6035251  0.7129002 22.7821155 33.3080264  4.6928316

Und da das reduzierte Modell im vollständigen Modell verschachtelt ist, können wir erneut einen Likelihood-Ratio-Test durchführen:

> anova(fm3, fm2)
Analysis of Variance Table

Model 1: y ~ SSlogis(time, Asym[group], xmid[group], scal)
Model 2: y ~ SSlogis(time, Asym[group], xmid[group], scal[group])
  Res.Df Res.Sum Sq Df     Sum Sq F value Pr(>F)
1    115    0.13945                             
2    114    0.13934  1 0.00010637   0.087 0.7685

Der große p- Wert zeigt an, dass das reduzierte Modell erwartungsgemäß genauso gut passt wie das vollständige Modell.

Wir können natürlich ähnliche Tests durchführen, um zu überprüfen, ob unterschiedliche Parameterwerte für just Asym, just xmidoder beides benötigt werden. Trotzdem würde ich nicht empfehlen , eine solche schrittweise Regression durchzuführen, um Parameter zu eliminieren. Testen Sie stattdessen einfach das vollständige Modell ( fm2) mit dem einfachen Modell ( fm1) und seien Sie mit den Ergebnissen zufrieden. Um Unterschiede zu quantifizieren, sind Diagramme hilfreich.

Karl Ove Hufthammer
quelle
Das ist eine großartige Antwort. Wie würden Sie diese Analyse ändern, wenn einige Personen zweimal gemessen würden und Sie die Korrelation innerhalb der Person kontrollieren wollten? Wenn Sie helfen können, würde ich Ihre zwei Cent schätzen! ( stats.stackexchange.com/questions/203040/… )
Nova
Wie ist dieser Ansatz mit der Verwendung nlmer()zu vergleichen, um wiederholte Messungen an Proben im Laufe der Zeit zu berücksichtigen? Sie könnten die gleiche Strategie anwenden, aber 1 Modell mit zufälligen Effekten für subjectund groupgegen ein anderes Modell mit zufälligen Effekten subjectnur für anpassen und vergleichen.
Stefan Avey