Un Anova multidirezionale a misure ripetute non parametrico in R?


16

La seguente domanda è uno di quei santi graal per me da qualche tempo, spero che qualcuno possa essere in grado di offrire un buon consiglio.

Vorrei eseguire una ripetizione non parametrica di anova a più vie usando R.

Ho fatto alcune ricerche e letture online da un po 'di tempo, e finora sono stato in grado di trovare soluzioni solo per alcuni dei casi: test di Friedman per misure ripetute non parametriche anova, regressione ordinale con funzione {car} Anova per non parametriche multidirezionali anova e così via. Le soluzioni parziali NON sono ciò che sto cercando in questo thread di domande. Ho riassunto i miei risultati finora in un post che ho pubblicato qualche tempo fa (intitolato: Misure ripetute ANOVA con R (funzioni ed esercitazioni) , nel caso in cui potesse aiutare chiunque)


Se ciò che leggo online è vero, questo compito potrebbe essere realizzato usando un modello misto di regressione ordinale (alias: Proportional Odds Model).

Ho trovato due pacchetti che sembrano rilevanti, ma non sono riuscito a trovare alcuna vignetta sull'argomento:

Quindi, essendo nuovo sull'argomento, speravo in alcune indicazioni da parte delle persone qui.

Ci sono tutorial / letture consigliate sull'argomento? Ancora meglio, qualcuno può suggerire un semplice esempio di codice su come eseguirlo e analizzarlo in R (es: "misure ripetute non parametriche anova a più vie")?


Tal, posso chiederti se hai trovato una soluzione per questo? Sto riscontrando lo stesso problema e le seguenti risposte potrebbero essere utili per aiutare a trovare una risposta, ma in realtà non forniscono una risposta definitiva. Ho 9 DV ordinali e 2 punti temporali e sto cercando lo stesso test che volevi eseguire.
Torvon,

1
Ciao Torvon. Non ho mai trovato una soluzione. Immagino che i test di permutazione saranno la strada più sicura, ma non ho mai avuto il tempo di sedermi e farlo funzionare. Se lo fai, per favore, vieni di nuovo per pubblicare la tua risposta. Saluti, T
Tal Galili,

Grazie per la tua rapida risposta. Dovrò risolverlo e te lo farò sapere.
Torvon,

Risposte:


8

Il pacchetto ez , di cui sono l'autore, ha una funzione chiamata ezPerm () che calcola un test di permutazione, ma probabilmente non fa correttamente le interazioni (la documentazione ammette altrettanto). L'ultima versione ha una funzione chiamata ezBoot (), che consente di eseguire il ricampionamento del bootstrap che tiene conto delle misure ripetute (ricampionando i soggetti, quindi all'interno dei soggetti), utilizzando i mezzi di cella tradizionali come statistica di previsione o utilizzando la modellazione di effetti misti per fare previsioni per ogni cella nel design. Non sono ancora sicuro di quanto siano "non parametrici" gli elementi di configurazione bootstrap dalle previsioni del modello di effetti misti; la mia intuizione è che potrebbero ragionevolmente essere considerati non parametrici, ma la mia fiducia in quest'area è bassa dato che sto ancora imparando a conoscere modelli di effetti misti.


Ciao Mike Grazie per la risposta e per il tuo pacchetto - è davvero fantastico!
Tal Galili,

@ Mike, il tuo pacchetto sembra essere l'unico che funziona per progetti a più fattori misti. L' aovpalternativa - dal lmpermpacchetto orfano - produce enormi variazioni per i valori p, vedi questo . Ho alcune domande: dove posso trovare riferimenti bibliografici per l'implementazione di ezPerm? Come posso interpretare che la funzione probabilmente non fa correttamente le interazioni ? Quale potrebbe essere un test post-hoc in questo caso? Grazie!
toto_tico,

@ Mike, qualcosa di simile ezPerm( data = DATA, dv = DV, wid = WID, within = interaction(A,B), perms = 1e3)avrebbe senso ricontrollare se l'interazione è significativa?
toto_tico,

5

In caso di dubbio, bootstrap! Davvero, non conosco una procedura fissa per gestire un simile scenario.

Il bootstrap è un modo generalmente applicabile per generare alcuni parametri di errore dai dati a portata di mano. Anziché basarsi sui presupposti parametrici tipici, le procedure bootstrap sfruttano le caratteristiche del campione per generare una distribuzione empirica rispetto alla quale è possibile confrontare le stime del campione.

Google scholar è l'oro ... è stato fatto prima ... almeno una volta.

Lunneborg, Clifford E .; Tousignant, James P .; 1985 "Bootstrap di Efron con applicazione al progetto di misure ripetute". Ricerca comportamentale multivariata; Aprile85, vol. 20 Numero 2, p161, 18p


1
Grazie per il vantaggio Brett! Mi chiedo se qualcuno lo abbia implementato ormai in R (immagino di no).
Tal Galili,

1
Giusto. R ha molte routine per aiutare con bootstrap e altri metodi di randomizzazione, ma non so che troverai qualcosa di specifico a questo problema.
Brett

Prima frase molto bella. Spero che non sia protetto da copyright, perché ho intenzione di usarlo: D
gui11aume

0

C'è un "trucco" menzionato in alcuni forum e mailing list - l'ho trovato anche menzionato nel libro "Analisi multilivello" di Joop Hox (seconda edizione, 2010), pp. 189.

L'idea è: riformatta i tuoi dati lunghi in un set di dati lungo e lungo in cui crei un nuovo DV che includa tutte le tue risposte DV e usi una variabile indice che contiene informazioni sulla natura dei DV per prevedere questo risultato.

Supponiamo che tu abbia 9 sintomi depressivi (ordinali), 2 punti di misurazione e 300 soggetti. Quindi, mentre hai 300 righe nel tuo set di dati normale e nel tuo set di dati lungo ne avrai 600, questo nuovo set di dati avrà 9 (sintomi) x 2 (tempo) x 300 (soggetti).

La nuova variabile DV "sintomi" ora contiene la gravità dei sintomi dei partecipanti su 9 sintomi, le variabili "indice" contiene le informazioni sulla natura del sintomo (da 1 a 9), e poi ci sono le due variabili "tempo" e " ID utente".

Ora puoi usare il ordinalpacchetto per eseguire questo.

data<-read.csv("data_long_long.csv", head=T)

data$symptoms <- factor(data$symptoms)
data$time <- factor(data$time)
data$index <-factor(data$index)

m1<-clmm2(symptoms ~ index+time, random=UserID, data = data, Hess=TRUE, nAGQ=10)

Nel mio caso specifico, ero interessato al fatto che ci fosse un'interazione significativa tra indice e tempo, quindi ho eseguito un modello aggiuntivo e li ho confrontati:

m2<-clmm2(symptoms ~ index+time, random=UserID, data = data, Hess=TRUE, nAGQ=10)
anova(m1,m2)

CLMM2 utilizza un modello di intercettazione casuale (per quanto ordinalne so , il pacchetto non esegue pendenze casuali), se non lo fai con un modello di intercettazione casuale puoi eseguire i modelli invece usando CLM, ad esempio:

m3<-clm(symptoms ~ index+time, data = data)

1
non sono esattamente gli stessi m1 e m2, forse intendevi clmm2(symptoms ~ index*time, random=UserID, data = data, Hess=TRUE, nAGQ=10) anova(m1,m2). Sai per caso come esprimerlo con la nuova funzione clmm? Non sono sicuro della notazione.
toto_tico,
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.