Régression linéaire avec mesures répétées dans R


12

Je n'ai pas réussi à comprendre comment effectuer une régression linéaire dans R pour un plan de mesures répétées. Dans une question précédente (toujours sans réponse), il m'a été suggéré de ne pas utiliser lmmais plutôt d'utiliser des modèles mixtes. J'ai utilisé lmde la manière suivante:

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

(plus de détails sur l'ensemble de données peuvent être trouvés sur le lien ci-dessus)

Cependant, je n'ai pu trouver sur Internet aucun exemple avec un code R montrant comment effectuer une analyse de régression linéaire.

Ce que je veux, c'est d'une part un tracé des données avec la ligne correspondant aux données, et d'autre part la valeur avec la valeur p pour le test de signification pour le modèle.R2

Y a-t-il quelqu'un qui peut faire des suggestions? Tout exemple de code R pourrait être d'une grande aide.


Modifier
Selon la suggestion que j'ai reçue jusqu'à présent, la solution pour analyser mes données afin de comprendre s'il existe une relation linéaire entre les deux variables Velocity_response (dérivant du questionnaire) et Velocity (dérivant de la performance) devrait être la suivante:

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

Le résultat du résumé donne ceci:

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

Maintenant, je ne comprends pas où je peux obtenir le R ^ 2 et les valeurs de p correspondantes m'indiquant s'il existe une relation linéaire entre les deux variables ou non, ni avoir compris comment mes données peuvent être tracées avec la ligne correspondant à la régression.

Quelqu'un peut-il être si gentil de m'éclairer? J'ai vraiment besoin de votre aide, les gars ...


"Modèles à effets mixtes et extensions en écologie avec R" par Zuur et al. est une belle introduction aux modèles linéaires d'effets mixtes, qui se concentre moins sur la théorie que sur l'application de la méthodologie.
Roland

Cher Roland, je crois que ce livre est utile, mais je recherche plutôt quelque chose en ligne ... avez-vous une page Web à suggérer?
L_T

1
Comme je l'ai dit dans votre post précédent, lm () a un tracé associé. Donc, si votre modèle est M1, vous pouvez utiliser plot (M1).
Peter Flom - Réintègre Monica

cher @PeterFlom oui, mais vous m'avez également dit d'éviter d'utiliser lm pour la conception de mesures répétées. Donc, ma question est de savoir si je dois utiliser lm pour analyser mes données ou une autre fonction. Toute suggestion?
L_T

1
Comme je l'ai dit, examinez les modèles à plusieurs niveaux. Dans R, vous pouvez regarder le nlmepackage. En outre, recherchez le sujet sur ce site, il y a beaucoup d' écrit à ce sujet ici.
Peter Flom - Réintègre Monica

Réponses:


17

Ce que vous faites dépend vraiment des objectifs de l'analyse. Je ne sais pas exactement quels sont les objectifs de votre analyse, mais je vais passer en revue plusieurs exemples, et j'espère que l'un d'eux sera applicable à votre situation.

Cas 1 : une variable quantitative mesurée deux fois

Supposons que vous ayez mené une étude sur un sujet humain dans laquelle vous avez demandé aux participants de passer un test de statistiques deux fois et que vous vouliez savoir si les scores moyens de la deuxième mesure étaient différents de la première mesure (pour déterminer si l'apprentissage s'est produit). Si les scores test1 et test2 sont stockés dans la trame de données d, vous pouvez le faire entièrement en utilisant la fonction lm (), comme dans:

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

Le test de l'ordonnée à l'origine est le test de la différence entre test1 et test2. Notez que vous n'aurez pas de delta-R ^ 2 pour la différence entre test1 et test2 - à la place, votre mesure de la taille de l'effet devrait être quelque chose comme le d de Cohen.

Cas 2a : une variable quantitative mesurée deux fois, une variable dichotomique, mesurée totalement entre les sujets

Disons que nous avons le même plan d'étude, mais nous voulons savoir si différents taux d'apprentissage se sont produits pour les hommes et les femmes. Nous avons donc une variable quantitative (performance du test) qui est mesurée deux fois, et une variable dichotomique, mesurée une fois. En supposant que test1, test2 et sexe sont tous contenus dans la trame de données d, nous pourrions également tester ce modèle uniquement en utilisant lm (), comme dans:

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

En supposant que le sexe est centré (c.-à-d. Codé, par exemple, homme = -,5 et femme = +,5), l'ordonnée à l'origine dans ce modèle est le test de la différence entre le test 1 et le test 2, moyenne pour les hommes et les femmes. Le coefficient de genre est l'interaction entre le temps et le sexe. Pour obtenir l'effet du sexe, en moyenne dans le temps, vous devez faire:

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

Cas 2b : une variable quantitative mesurée deux fois, une variable quantitative, mesurée une seule fois

Supposons à nouveau que nous avons une variable quantitative mesurée deux fois et une variable quantitative mesurée une fois. Ainsi, par exemple, supposons que nous avions une mesure d'intérêt de base pour les statistiques et que nous voulions déterminer si les personnes qui avaient un niveau d'intérêt de base plus élevé ont appris davantage de temps 1 à temps 2. Nous devons d'abord centrer l'intérêt, comme dans :

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

En supposant que test1, test2 et interestc sont tous dans la trame de données d, cette question pourrait alors être testée de manière très similaire au cas 1a:

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

Une fois de plus, l'ordonnée à l'origine dans ce modèle teste si, en moyenne à travers l'intérêt, les scores aux tests ont changé du temps 1 au temps 2. Cependant, cette interprétation ne tient que lorsque l'intérêt est centré. Le coefficient d'intérêt est de savoir si l'effet du temps dépend de l'intérêt de base. Nous pourrions obtenir l'effet d'intérêt, moyenné dans le temps, en faisant la moyenne ensemble des tests 1 et 2, comme ci-dessus, et en testant l'effet d'intérêt sur cette variable composite.

Cas 2c : une variable quantitative mesurée deux fois, une variable catégorielle, mesurée une seule fois

Supposons que votre variable inter-sujets soit une catégorie, mesurée une seule fois. Ainsi, par exemple, supposons que vous vouliez savoir si les personnes de races différentes (blanches vs asiatiques vs noires vs hispaniques) ont eu différentes quantités d'apprentissage du temps 1 au temps 2. En supposant que test1, test2 et race sont dans la trame de données d , vous devez d'abord comparer la race du code. Cela pourrait être fait en utilisant des contrastes orthogonaux planifiés, des codes factices ou en utilisant des codes d'effets, selon les hypothèses / questions spécifiques que vous souhaitez tester (je recommande de consulter lm.setContrasts () si vous recherchez une fonction d'aide pour le faire) . En supposant que la variable raciale est déjà codée par contraste, vous utiliseriez lm () de manière très similaire aux deux cas ci-dessus, comme dans:

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

En supposant que les contrastes raciaux sont centrés, l'ordonnée à l'origine dans ce modèle est, encore une fois, «l'effet principal» du temps. Les coefficients des contrastes raciaux sont les interactions entre ces contrastes et le temps. Pour obtenir les effets omnibus de la race, utilisez le code suivant:

Anova(mod, type = 3)

Cas 3 : une variable quantitative mesurée 3 fois (c.-à-d. Une manipulation intra-sujet à trois niveaux)

Supposons que vous ayez ajouté un troisième point de mesure à la conception à partir du premier cas. Ainsi, vos participants ont passé un test de statistiques trois fois au lieu de deux. Ici, vous avez deux choix, selon que vous souhaitez un test omnibus des différences entre les points de temps (parfois vous ne le faites pas).

Par exemple, disons que votre hypothèse principale est que les résultats des tests augmenteront linéairement du temps 1 au temps 3. En supposant que test1, test2 et test3 sont dans la trame de données d, cette hypothèse pourrait être testée en créant d'abord le composite suivant:

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

Ensuite, vous testez si un modèle d'interception uniquement utilisant lin comme variable dépendante a une interception différente de 0, comme dans:

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

Cela vous permettra de vérifier si les scores de statistiques ont augmenté au fil du temps. Vous pouvez bien sûr créer d'autres types de scores de différence personnalisés, en fonction de vos hypothèses particulières.

Si vous vous souciez des tests omnibus importants, vous devez utiliser la fonction Anova () du package de voiture. La mise en œuvre spécifique est un peu compliquée. Fondamentalement, vous spécifiez les variables à l'intérieur des sujets et celles qui sont entre les sujets à l'aide de lm (). Vous créez ensuite la partie intra-sujets du modèle (c.-à-d., Spécifiez lesquels des tests1, test2 et test3 ont été mesurés en premier, deuxième et troisième), puis passez ce modèle à Anova () en créant un bloc de données appelé idata. En utilisant mon exemple hypothétique:

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'instruction idesign indique à Anova d'inclure la variable de temps (composée de test1, test2 et test3) dans le modèle. Ce code vous donnera vos tests omnibus des effets du temps sur les résultats des tests.

Cas 4 : une variable quantitative mesurée 3 fois, une variable quantitative inter-sujets

Ce cas est une simple extension du cas 3. Comme ci-dessus, si vous ne vous souciez que de 1 degré de liberté, vous pouvez simplement créer un score de différence personnalisé avec votre variable intra-sujets. Donc, en supposant que test1, test2, test3 et l'intérêt sont tous dans la trame de données d, et en supposant que nous nous intéressons aux effets linéaires du temps sur les résultats des tests (et comment ces effets du temps varient avec l'intérêt de base), vous feriez le suivant:

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

Ensuite, procédez comme suit (avec un intérêt moyen):

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

Si vous souhaitez des tests omnibus, procédez comme suit:

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)

Autres cas: je vais les omettre par souci de concision, mais ce sont de simples extensions de ce que j'ai déjà décrit.

Veuillez noter que les tests omnibus (univariés) du temps où le temps a plus de 2 niveaux supposent tous une sphéricité. Cette hypothèse devient assez intenable à mesure que vous augmentez le nombre de niveaux. Si vous avez plusieurs points de mesure dans votre conception (par exemple, 4+), je vous recommande fortement d'utiliser quelque chose comme la modélisation à plusieurs niveaux et de passer à un package spécialisé pour cette technique (comme nlme ou lme4 .

J'espère que cela t'aides!


Cher Patrick @ user1188407, merci beaucoup d'avoir été très gentil en fournissant une telle réponse. Malheureusement, mon cas correspond probablement à ce que vous avez écrit dans les dernières phrases ... j'ai donc besoin d'un exemple de code R pour comprendre comment traiter mes données. En effet, si vous regardez la conception de mon expérience décrite dans un article précédent stackoverflow.com/questions/12182373/… vous pouvez voir que j'ai une variable mesurée 4 fois (c'est-à-dire la vitesse mesurée dans 4 conditions)
L_T

et je veux trouver s'il y a une relation linéaire avec une variable (velocity_response) exprimant la vitesse perçue dans les quatre conditions. Ainsi, chaque participant a subi 4 conditions et a ensuite évalué la perception de ces conditions. Je veux savoir si la performance est liée à la perception ...
L_T

Eh bien, si vous souhaitez utiliser une solution de modélisation à plusieurs niveaux, vous pouvez utiliser de nombreuses ressources en ligne différentes. Pour commencer, vous devriez jeter un œil au paquet nlme et à cette vignette . La vignette est légèrement obsolète (2002), je l'ai trouvée utile lorsque j'apprenais la modélisation multi-niveaux. Enfin, vous pouvez consulter le livre publié par les créateurs du paquet nlme.
Patrick S.Forscher

Cher Patrick @ user1188407 merci. J'ai étudié les modèles multiniveaux, et je suis arrivé à cette formule pour analyser mes données: lme (Velocity_response ~ Velocity * Subject, data = scrd, random = ~ 1 | Subject) Pouvez-vous me confirmer que cette formule est correcte pour l'analyse I voulez effectuer sur mes données? Cependant, je ne comprends pas comment obtenir des valeurs R ^ 2 et p, ni comment tracer le graphique avec les points et la ligne correspondant à la régression. Pourrais-tu m'aider s'il te plaît? Je ne suis pas staticien ...
L_T

La formule me semble correcte d'après ma compréhension de votre étude (et en supposant que vous avez formaté vos données au format période-personne). Vous obtiendrez vos valeurs p en enregistrant les résultats de votre analyse dans un objet (comme je le fais dans mes exemples) et en obtenant un résumé de cet objet. Cependant, en raison des différences entre les modèles multiniveaux et la régression traditionnelle (par exemple, dans les métriques de taille d'effet - il n'y a pas de métrique standard dans les modèles multiniveaux), je vous suggère fortement de lire plus sur cette technique avant de l'utiliser. Il semble que les autres utilisateurs aient recommandé plusieurs bonnes options.
Patrick S.Forscher
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.