Come posso adattare un modello di effetti misti non lineari per dati di misure ripetute usando nlmer ()?


12

Sto cercando di analizzare i dati di misure ripetute e sto lottando per farli funzionare R. I miei dati sono essenzialmente i seguenti, ho due gruppi di trattamento. Ogni soggetto in ciascun gruppo viene testato ogni giorno e viene assegnato un punteggio (la percentuale corretta su un test). I dati sono nel formato lungo:

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

I dati assomigliano a una curva logistica, i soggetti fanno molto male per alcuni giorni seguiti da un rapido miglioramento, seguito da un plateau. Vorrei sapere se il trattamento ha un effetto sulla curva delle prestazioni del test. Il mio pensiero era quello di utilizzare nlmer()nel lme4pacchetto in R. Posso adattare le linee per ciascun gruppo usando quanto segue:

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

Riesco a confrontare i gruppi guardando le stime per i diversi parametri e deviazioni standard delle linee stimate, ma non sono sicuro che questo sia il modo corretto di farlo. Qualsiasi aiuto sarebbe molto apprezzato.

Risposte:


4

È possibile utilizzare i normali test del rapporto di verosimiglianza. Ecco un semplice esempio. Innanzitutto, creiamo osservazioni da 10 individui in base ai tuoi parametri:

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)))

Ora lascia che la metà di essi abbia diversi asintoti e parametri del punto medio:

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)

Possiamo simulare i valori di risposta per tutti gli individui, in base al modello:

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")

Trame di spaghetti dei dati

Possiamo vedere chiare differenze tra i due gruppi, differenze che i modelli dovrebbero essere in grado di rilevare. Ora proviamo innanzitutto ad adattare un modello semplice , ignorando i gruppi:

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

Forse come previsto, le stime per Asyme xmidsono da qualche parte tra i valori dei parametri reali per i due gruppi. (Che questo sarebbe il caso non è ovvio, sebbene, poiché anche il parametro scale è cambiato, per adattarsi alla errata specificazione del modello.) Ora adattiamo un modello completo , con parametri diversi per i due gruppi:

> 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

Poiché i due modelli sono nidificati, possiamo eseguire un test del rapporto di verosimiglianza:

> 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

Il valore p estremamente piccolo mostra chiaramente che il modello semplice era troppo semplice; i due gruppi non differiscono nelle loro parametri.

Tuttavia, le stime dei due parametri di scala sono quasi identiche, con una differenza di appena .1. Forse abbiamo bisogno solo di un parametro di scala? (Naturalmente sappiamo che la risposta è sì, poiché abbiamo simulato i dati.)

(La differenza tra i due parametri asintoti è anche solo .1, ma questa è una grande differenza quando prendiamo in considerazione gli errori standard - vedi summary(fm2).)

Quindi inseriamo un nuovo modello, con un scaleparametro comune per i due gruppi, ma diverso Asyme xmidparametri, come prima:

> 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

E poiché il modello ridotto è nidificato nel modello completo, possiamo nuovamente eseguire un test del rapporto di verosimiglianza:

> 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

Il grande valore p indica che il modello ridotto si adatta così come il modello completo, come previsto.

Ovviamente possiamo fare test simili per verificare se sono necessari valori di parametri diversi per just Asym, just xmido entrambi. Detto questo, non consiglierei di fare una regressione graduale come questa per eliminare i parametri. Invece, basta testare il modello completo ( fm2) rispetto al modello semplice ( fm1) ed essere soddisfatti dei risultati. Per quantificare eventuali differenze, i grafici saranno utili.


è un'ottima risposta. Come cambieresti questa analisi se alcuni individui fossero misurati due volte e volessi controllare la correlazione all'interno dell'individuo? Se mi puoi aiutare, apprezzerei i tuoi due centesimi! ( stats.stackexchange.com/questions/203040/… )
Nova

In che modo questo approccio si confronta con l'uso nlmer()per tenere conto delle misure ripetute sui campioni nel tempo? Potresti fare lo stesso tipo di strategia ma adattarti a 1 modello con effetti casuali per subjecte groupcontro un altro modello con effetti casuali per subjectsolo e confrontare.
Stefan Avey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.