Regressione lineare con misure ripetute in R


12

Non sono riuscito a capire come eseguire la regressione lineare in R per un disegno di misura ripetuto. In una domanda precedente (ancora senza risposta) mi è stato suggerito di non usare lmma piuttosto di usare modelli misti. Ho usato lmnel modo seguente:

lm.velocity_vs_Velocity_response <- lm(Velocity_response~Velocity*Subject, data=mydata)

(maggiori dettagli sul set di dati sono disponibili al link sopra)

Tuttavia non sono riuscito a trovare su Internet alcun esempio con il codice R che mostra come eseguire un'analisi di regressione lineare.

Quello che voglio è da un lato un diagramma dei dati con la linea che si adatta ai dati, e dall'altro il valore insieme al valore p per il test di significato per il modello.R2

C'è qualcuno che può fornire alcuni suggerimenti? Qualsiasi esempio di codice R potrebbe essere di grande aiuto.


Modifica In
base al suggerimento che ho ricevuto finora, la soluzione per analizzare i miei dati al fine di capire se esiste una relazione lineare tra le due variabili Velocity_response (derivante dal questionario) e Velocity (derivante dalle prestazioni) dovrebbe essere questa:

library(nlme)
summary(lme(Velocity_response ~ Velocity*Subject, data=scrd, random= ~1|Subject))

Il risultato del riepilogo fornisce questo:

    > summary(lme(Velocity_response ~ Velocity*Subject, data=scrd, random= ~1|Subject))
    Linear mixed-effects model fit by REML
     Data: scrd 
           AIC      BIC   logLik
      104.2542 126.1603 -30.1271

    Random effects:
     Formula: ~1 | Subject
            (Intercept) Residual
    StdDev:    2.833804 2.125353

Fixed effects: Velocity_response ~ Velocity * Subject 
                              Value Std.Error DF    t-value p-value
(Intercept)               -26.99558  25.82249 20 -1.0454288  0.3083
Velocity                   24.52675  19.28159 20  1.2720292  0.2180
SubjectSubject10           21.69377  27.18904  0  0.7978865     NaN
SubjectSubject11           11.31468  33.51749  0  0.3375754     NaN
SubjectSubject13           52.45966  53.96342  0  0.9721337     NaN
SubjectSubject2           -14.90571  34.16940  0 -0.4362299     NaN
SubjectSubject3            26.65853  29.41574  0  0.9062674     NaN
SubjectSubject6            37.28252  50.06033  0  0.7447517     NaN
SubjectSubject7            12.66581  26.58159  0  0.4764880     NaN
SubjectSubject8            14.28029  31.88142  0  0.4479188     NaN
SubjectSubject9             5.65504  34.54357  0  0.1637076     NaN
Velocity:SubjectSubject10 -11.89464  21.07070 20 -0.5645111  0.5787
Velocity:SubjectSubject11  -5.22544  27.68192 20 -0.1887672  0.8522
Velocity:SubjectSubject13 -41.06777  44.43318 20 -0.9242591  0.3664
Velocity:SubjectSubject2   11.53397  25.41780 20  0.4537754  0.6549
Velocity:SubjectSubject3  -19.47392  23.26966 20 -0.8368804  0.4125
Velocity:SubjectSubject6  -29.60138  41.47500 20 -0.7137162  0.4836
Velocity:SubjectSubject7   -6.85539  19.92271 20 -0.3440992  0.7344
Velocity:SubjectSubject8  -12.51390  22.54724 20 -0.5550080  0.5850
Velocity:SubjectSubject9   -2.22888  27.49938 20 -0.0810519  0.9362
 Correlation: 
                          (Intr) Velcty SbjS10 SbjS11 SbjS13 SbjcS2 SbjcS3 SbjcS6 SbjcS7 SbjcS8 SbjcS9 V:SS10 V:SS11 V:SS13 Vl:SS2 Vl:SS3
Velocity                  -0.993                                                                                                         
SubjectSubject10          -0.950  0.943                                                                                                  
SubjectSubject11          -0.770  0.765  0.732                                                                                           
SubjectSubject13          -0.479  0.475  0.454  0.369                                                                                    
SubjectSubject2           -0.756  0.751  0.718  0.582  0.362                                                                             
SubjectSubject3           -0.878  0.872  0.834  0.676  0.420  0.663                                                                      
SubjectSubject6           -0.516  0.512  0.490  0.397  0.247  0.390  0.453                                                               
SubjectSubject7           -0.971  0.965  0.923  0.748  0.465  0.734  0.853  0.501                                                        
SubjectSubject8           -0.810  0.804  0.769  0.624  0.388  0.612  0.711  0.418  0.787                                                 
SubjectSubject9           -0.748  0.742  0.710  0.576  0.358  0.565  0.656  0.386  0.726  0.605                                          
Velocity:SubjectSubject10  0.909 -0.915 -0.981 -0.700 -0.435 -0.687 -0.798 -0.469 -0.883 -0.736 -0.679                                   
Velocity:SubjectSubject11  0.692 -0.697 -0.657 -0.986 -0.331 -0.523 -0.607 -0.357 -0.672 -0.560 -0.517  0.637                            
Velocity:SubjectSubject13  0.431 -0.434 -0.409 -0.332 -0.996 -0.326 -0.378 -0.222 -0.419 -0.349 -0.322  0.397  0.302                     
Velocity:SubjectSubject2   0.753 -0.759 -0.715 -0.580 -0.360 -0.992 -0.661 -0.389 -0.732 -0.610 -0.563  0.694  0.528  0.329              
Velocity:SubjectSubject3   0.823 -0.829 -0.782 -0.634 -0.394 -0.622 -0.984 -0.424 -0.799 -0.667 -0.615  0.758  0.577  0.360  0.629       
Velocity:SubjectSubject6   0.462 -0.465 -0.438 -0.356 -0.221 -0.349 -0.405 -0.995 -0.449 -0.374 -0.345  0.425  0.324  0.202  0.353  0.385
Velocity:SubjectSubject7   0.961 -0.968 -0.913 -0.740 -0.460 -0.726 -0.844 -0.496 -0.986 -0.778 -0.718  0.886  0.674  0.420  0.734  0.802
Velocity:SubjectSubject8   0.849 -0.855 -0.807 -0.654 -0.406 -0.642 -0.746 -0.438 -0.825 -0.988 -0.635  0.783  0.596  0.371  0.649  0.709
Velocity:SubjectSubject9   0.696 -0.701 -0.661 -0.536 -0.333 -0.526 -0.611 -0.359 -0.676 -0.564 -0.990  0.642  0.488  0.304  0.532  0.581
                          Vl:SS6 Vl:SS7 Vl:SS8
Velocity                                      
SubjectSubject10                              
SubjectSubject11                              
SubjectSubject13                              
SubjectSubject2                               
SubjectSubject3                               
SubjectSubject6                               
SubjectSubject7                               
SubjectSubject8                               
SubjectSubject9                               
Velocity:SubjectSubject10                     
Velocity:SubjectSubject11                     
Velocity:SubjectSubject13                     
Velocity:SubjectSubject2                      
Velocity:SubjectSubject3                      
Velocity:SubjectSubject6                      
Velocity:SubjectSubject7   0.450              
Velocity:SubjectSubject8   0.398  0.828       
Velocity:SubjectSubject9   0.326  0.679  0.600

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-1.47194581 -0.46509026 -0.05537193  0.39069634  1.89436646 

Number of Observations: 40
Number of Groups: 10 
Warning message:
In pt(q, df, lower.tail, log.p) : NaNs produced
> 

Ora, non capisco dove posso trovare R ^ 2 e i corrispondenti valori p che mi indicano se esiste o meno una relazione lineare tra le due variabili, né ho capito come i miei dati possono essere tracciati con la linea che si adatta al regressione.

Qualcuno può essere così gentile da illuminarmi? Ho davvero bisogno del tuo aiuto ragazzi ...


"Modelli di effetti misti ed estensioni in ecologia con R" di Zuur et al. è una bella introduzione ai modelli lineari di effetti misti, che si concentra meno sulla teoria e più sull'applicazione della metodologia.
Roland,

Caro Roland, credo che quel libro sia utile, ma sto piuttosto cercando qualcosa on line ... hai qualche pagina web da suggerire?
L_T

1
Come ho detto nel tuo precedente post, lm () ha una trama associata. Quindi, se il tuo modello è M1 puoi usare la trama (M1).
Peter Flom - Ripristina Monica

caro @PeterFlom sì, ma mi hai anche detto di evitare di usare lm per la progettazione di misure ripetute. Quindi, la mia domanda è se devo usare lm per analizzare i miei dati o un'altra funzione. Qualche suggerimento?
L_T

1
Come ho detto, guarda nei modelli multi-livello. In R, puoi guardare il nlmepacchetto. Inoltre, cerca questo sito per l'argomento, qui è scritto molto a riguardo.
Peter Flom - Ripristina Monica

Risposte:


17

Quello che fai dipende dagli obiettivi dell'analisi. Non sono sicuro di quali siano esattamente gli obiettivi della tua analisi, ma esaminerò diversi esempi e spero che uno di essi sia applicabile alla tua situazione.

Caso 1 : una variabile quantitativa misurata due volte

Supponiamo che tu abbia condotto uno studio sulla materia umana in cui hai fatto partecipare due volte un test statistico ai partecipanti e volevi scoprire se i punteggi medi sulla seconda misurazione erano diversi dalla prima (per determinare se l'apprendimento è avvenuto). Se i punteggi test1 e test2 sono memorizzati nel frame di dati d, è possibile farlo interamente utilizzando la funzione lm (), come in:

mod <- lm(test2 - test1 ~ 1, data = d)
summary(mod)

Il test dell'intercetta è il test della differenza tra test1 e test2. Nota che non avrai delta-R ^ 2 per la differenza tra test1 e test2 - invece, la tua misura della dimensione dell'effetto dovrebbe essere qualcosa come cohen's d.

Caso 2a : una variabile quantitativa misurata due volte, una variabile dicotomica, misurata totalmente tra i soggetti

Diciamo che abbiamo lo stesso disegno di studio, ma vogliamo sapere se si sono verificati tassi di apprendimento diversi per uomini e donne. Quindi, abbiamo una variabile quantitativa (test performance) che viene misurata due volte e una variabile dicotomica, misurata una volta. Supponendo che test1, test2 e gender siano tutti contenuti nel frame di dati d, potremmo anche testare questo modello solo usando lm (), come in:

mod <- lm(test2 - test1 ~ gender, data = d)
summary(mod)
lm.sumSquares(mod) # lm.sumSquares() is located in the lmSupport package, and gives the change in R^2 due to the between-subjects part of the model

Supponendo che il genere sia centrato (cioè codificato, ad esempio, maschio = -.5 e femmina = +.5), l'intercetta in questo modello è il test della differenza tra test 1 e test 2, mediata tra maschi e femmine. Il coefficiente per il genere è l'interazione tra tempo e genere. Per ottenere l'effetto del genere, mediato nel tempo, dovresti fare:

mod <- lm(rowMeans(cbind(test2, test1)) ~ gender, data = d)
summary(mod)

Caso 2b : una variabile quantitativa misurata due volte, una variabile quantitativa, misurata una sola volta

Supponiamo che di nuovo abbiamo misurato una variabile quantitativa due volte e una variabile quantitativa misurata una volta. Quindi, ad esempio, supponiamo di avere un certo interesse di base nelle statistiche e volevamo determinare se le persone che avevano livelli di interesse di base più alti imparassero di più da 1 a 2 volte. Prima di tutto dovremmo centrare l'interesse, come in :

d$interestc <- d$interest - mean(d$interest)

Supponendo che test1, test2 e interestc siano tutti nel frame di dati d, questa domanda potrebbe quindi essere testata in modo molto simile al caso 1a:

mod <- lm(test2 - test1 ~ interestc, data = d)
summary(mod)
lm.sumSquares(mod)

Ancora una volta, l'intercettazione in questo modello verifica se, in base all'interesse, i punteggi dei test sono cambiati da tempo 1 a tempo 2. Tuttavia, questa interpretazione vale solo quando l'interesse è centrato. Il coefficiente di interesse è se l'effetto del tempo dipende dall'interesse di base. Potremmo ottenere l'effetto di interesse, calcolato in media nel tempo, calcolando la media di test1 e test 2, come sopra, e testando l'effetto di interesse su questa variabile composita.

Caso 2c : una variabile quantitativa misurata due volte, una variabile categoriale, misurata una sola volta

Supponiamo che la tua variabile tra soggetti fosse una categoria, misurata una sola volta. Quindi, ad esempio, supponiamo che tu fossi interessato a sapere se le persone di razze diverse (White vs Asian vs Black vs Hispanic) avevano quantità diverse di apprendimento di volta in volta da 1 a 2. Supponendo che test1, test2 e razza siano nel frame di dati d , dovresti prima confrontare la corsa al codice. Questo potrebbe essere fatto usando contrasti ortogonali pianificati, codici fittizi o usando codici di effetti, a seconda delle ipotesi / domande specifiche che si desidera verificare (consiglio di guardare lm.setContrasts () se stai cercando una funzione di aiuto per farlo) . Supponendo che la variabile race sia già codificata in contrasto, useresti lm () in modo molto simile ai due casi precedenti, come in:

mod <- lm(test2 - test1 ~ race, data = d)
summary(mod)
lm.sumSquares(mod)

Supponendo che i contrasti di razza siano centrati, l'intercettazione in questo modello è, ancora una volta, "l'effetto principale" del tempo. I coefficienti per i contrasti di razza sono le interazioni tra quei contrasti e il tempo. Per ottenere gli effetti omnibus di razza, utilizzare il seguente codice:

Anova(mod, type = 3)

Caso 3 : una variabile quantitativa misurata 3 volte (cioè una manipolazione all'interno dei soggetti a tre livelli)

Supponiamo che tu abbia aggiunto un terzo punto di misurazione al progetto dal primo caso. Quindi, i tuoi partecipanti hanno fatto un test statistico tre volte anziché due volte. Qui hai un paio di scelte, a seconda che tu voglia un test onnibus delle differenze tra i punti di tempo (a volte non lo fai).

Ad esempio, supponiamo che la tua ipotesi principale sia che i punteggi dei test aumentino linearmente da 1 a 3 volte. Supponendo che test1, test2 e test3 siano nel frame di dati d, questa ipotesi potrebbe essere verificata creando innanzitutto il seguente composito:

d$lin <- d[, paste("test", sep = "", 1:3)] %*% c(-1, 0, 1)

Quindi verifichi se un modello di intercettazione utilizza solo lin come variabile dipendente ha un'intercettazione diversa da 0, come in:

mod <- lm(lin ~ 1, data = d)
summary(mod)

Questo ti darà la prova se i punteggi delle statistiche sono aumentati nel tempo. Naturalmente, puoi creare altri tipi di punteggi di differenza personalizzati, a seconda delle tue ipotesi particolari.

Se ti interessano i test omnibus significativi, devi utilizzare la funzione Anova () dal pacchetto auto. L'implementazione specifica è un po 'contorta. Fondamentalmente, si specifica quali variabili sono all'interno dei soggetti e quali tra i soggetti utilizzando lm (). Quindi si crea la porzione entro-soggetti del modello (ad esempio, si specifica quale di test1, test2 e test3 sono stati misurati prima, seconda e terza) e quindi si passa quel modello ad Anova () creando un frame di dati chiamato idata. Usando il mio esempio ipotetico:

mod <- lm(cbind(test1, test2, test3) ~ 1, data = d) # No between-subjects portion of the model
idata <- data.frame(time = c("time1", "time2", "time3")) # Specify the within-subjects portion of the model
mod.A <- Anova(mod, idata = idata, idesign = ~time, type = 3) # Gives multivariate tests.  For univariate tests, add multivariate = FALSE
summary(mod.A)

L'istruzione idesign dice ad Anova di includere la variabile temporale (composta da test1, test2 e test3) nel modello. Questo codice ti fornirà i tuoi test omnibus sugli effetti del tempo sui punteggi dei test.

Caso 4 : una variabile quantitativa misurata 3 volte, una variabile quantitativa tra soggetti

Questo caso è una semplice estensione del caso 3. Come sopra, se ti preoccupi solo di 1 grado di test di libertà, puoi semplicemente creare un punteggio di differenza personalizzato con la tua variabile entro-soggetti. Quindi, supponendo che test1, test2, test3 e interesse siano tutti nel frame di dati d, e supponendo che siamo interessati agli effetti lineari del tempo sui punteggi dei test (e come tali effetti del tempo variano con l'interesse di base), lo faresti il seguente:

d$lin <- d[, paste("test", sep = "", 1:3)] %*% c(-1, 0, 1)

Quindi, procedi come segue (con interesse centrato sulla media):

mod <- lm(lin ~ interestc, data = d)
summary(mod)
lm.sumSquares(mod)

Se si desidera eseguire test omnibus, attenersi alla seguente procedura:

mod <- lm(cbind(test1, test2, test3) ~ interest, data = d) # We now have a between-subjects portion of the model
idata <- data.frame(time = c("time1", "time2", "time3"))
mod.A <- Anova(mod, idata = idata, idesign = ~time * interest, type = 3) # The idesign statement assumes that we're interested in the interaction between time and interest
summary(mod.A)

Altri casi: li ometterò per brevità, ma sono semplici estensioni di ciò che ho già descritto.

Si noti che i test omnibus (univariati) del tempo in cui il tempo ha più di 2 livelli assumono tutti una sfericità. Questo presupposto diventa piuttosto insostenibile quando si aumenta il numero di livelli. Se hai molti punti di misura nel tuo progetto (diciamo, 4+) ti consiglio vivamente di usare qualcosa come la modellazione multilivello e passare a un pacchetto specializzato per questa tecnica (come nlme o lme4 .

Spero che sia di aiuto!


Caro Patrick @ user1188407, grazie mille sei stato molto gentile nel fornire tale risposta. Sfortunatamente il mio caso probabilmente si adatta a quello che hai scritto nelle ultime frasi ... quindi avrei bisogno di un esempio di codice R per capire come trattare i miei dati. In effetti, se osservi il progetto del mio esperimento descritto in un precedente post stackoverflow.com/questions/12182373/… puoi vedere che ho una variabile misurata 4 volte (ovvero la velocità misurata in 4 condizioni)
L_T

e voglio scoprire se esiste una relazione lineare con una variabile (velocity_response) che esprime la velocità percepita nelle quattro condizioni. Quindi ogni partecipante ha subito 4 condizioni e quindi ha valutato la percezione di tali condizioni. Voglio sapere se la performance è correlata alla percezione ...
L_T

Bene, se vuoi usare una soluzione di modellazione multilivello, puoi attingere a molte risorse online diverse. Per cominciare, dovresti dare un'occhiata al pacchetto nlme e a questa vignetta . La vignetta è leggermente obsoleta (2002), l'ho trovato utile quando stavo imparando a modellare a più livelli. Infine, puoi consultare il libro pubblicato dai creatori del pacchetto nlme.
Patrick S. Forscher,

Caro Patrick @ user1188407 grazie. Ho studiato i modelli multilivello e sono arrivato a questa formula per analizzare i miei dati: lme (Velocity_response ~ Velocity * Subject, data = scrd, random = ~ 1 | Subject) Puoi per favore confermarmi che questa formula è corretta per l'analisi I vuoi esibirti sui miei dati? Tuttavia, non capisco come posso ottenere valori R ^ 2 e p, né come tracciare il grafico con i punti e la linea che si adattano alla regressione. Per favore potete aiutarmi? Non sono uno statista ...
L_T

La formula mi sembra corretta in base alla mia comprensione del tuo studio (e supponendo che tu abbia formattato i tuoi dati nel formato periodo personale). Otterresti i tuoi valori p salvando i risultati della tua analisi in un oggetto (come faccio nei miei esempi) e ottenendo un riepilogo di quell'oggetto. Tuttavia, a causa delle differenze tra i modelli multilivello e la regressione tradizionale (ad esempio, nelle metriche delle dimensioni degli effetti - non esiste una metrica standard nei modelli multilivello) ti consiglio vivamente di leggere di più su questa tecnica prima di utilizzarla. Sembra che gli altri utenti abbiano raccomandato diverse buone opzioni.
Patrick S. Forscher,
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.