2017-10-05 4 views
0

J'ai eu quelques difficultés à afficher les résultats de mon modèle lmer dans ggplot2. Je suis particulièrement intéressé par l'affichage de lignes de régression prédites en plus des données observées. Le modèle lmer Je suis en cours d'exécution sur ce (la parole) données ci-dessous:Superposition de résultats de modèles à effets mixtes avec ggplot2

lmer.declination <- lmer(zlogF0_m60~Center.syll*Tone + (1|Trial) + (1+Tone|Speaker) + (1|Utterance.num), data=data) 

La variable dépendante est la fréquence fondamentale ici (F0), normalisée et moyenne à travers le milieu de 60% d'une syllabe. Les effets fixes sont le numéro de syllabe (Center.syll), compté à rebours à partir de la fin d'une phrase (par exemple, -2 est la troisième dernière syllabe dans la phrase). Les données proviennent d'un langage tonal lexical, de sorte que le son (toutes les basses/1 /, toutes les demi-teintes/3/et toutes les hautes fréquences/4 /) est un effet fixe discret. Les questions expérimentales sont de savoir si F0 tombe à travers les phrases pour cette langue, si oui, de combien, et si le ton compte. C'était un peu difficile pour moi de penser à un moyen de produire un jeu de données jouet ici, mais les données peuvent être téléchargées here (un fichier de 437K). Pour extraire les ajustements du modèle, j'ai utilisé le package d'effets et converti la sortie en une trame de données.

ex <- Effect(c("Center.syll","Tone"),lmer.declination) 
ex.df <- as.data.frame(ex) 

Je indiquerez les données à l'aide ggplot2, avec le code suivant:

t.plot <- ggplot(data, aes(factor(Center.syll), zlogF0_m60, group=Tone, color=Tone)) + stat_summary(fun.data = mean_cl_boot, geom = "smooth") + ylab("Normalized log(F0)") + xlab("Syllable number") + ggtitle("F0 change across utterances with identical level tones, medial 60% of vowel") + geom_pointrange(data=ex.df, mapping=aes(x=Center.syll, y=fit, ymin=lower, ymax=upper)) + theme_bw() 
t.plot 

Ce produit le tracé suivant:

Predicted trajectories and observed trajectories

Les valeurs prédites apparaissent à gauche de la données observées, non superposées aux données elles-mêmes. Quoi que je semble essayer, je ne peux pas les faire se chevaucher sur les données observées. J'aimerais idéalement avoir une seule ligne dessinée plutôt qu'un pointeur, mais quand j'ai essayé d'utiliser geom_line, la ligne par défaut consistait à relier la limite supérieure d'un point à la borne inférieure de la ligne suivante (pas à la médiane)/point médian). Merci de votre aide.

Répondre

0

(Edit: Comme l'OP a souligné, il a en fait inclure un lien vers son ensemble de données Mes excuses pour ce qui implique qu'il ne l'a pas..)

Tout d'abord, vous aurez beaucoup meilleure chance d'obtenir une réponse utile si vous fournissez un minimal, complete, and verifiable example (MVCE). Regardez here pour des informations sur la meilleure façon de le faire pour R spécifiquement. En l'absence de vos données réelles pour travailler avec, je crois que votre problème est que vous factoriser l'axe des x pour le stat_summary, mais pas pour le geom_pointrange.Je moqué un exemple de jouet de l'intrigue que vous avez lié à afin de démontrer:

dat1 <- data.frame(x=c(-6:0, -5:0, -4:0), 
        y=c(-0.25, -0.5, -0.6, -0.75, -0.8, -0.8, -1.5, 
         0.5, 0.45, 0.4, 0.2, 0.1, 0, 
         0.5, 0.9, 0.7, 0.6, 1.1), 
        z=c(rep('a', 7), rep('b', 6), rep('c', 5))) 

dat2 <- data.frame(x=dat1$x, 
        y=dat1$y + runif(18, -0.2, 0.2), 
        z=dat1$z, 
        upper=dat1$y + 0.3 + runif(18, -0.1, 0.1), 
        lower=dat1$y - 0.3 + runif(18, -0.1, 0.1)) 

Maintenant, l'appel suivant me donne un résultat similaire sur le graphe lié à:

ggplot(dat1, aes(factor(x), # note x being factored here 
       y, group=z, color=z)) + 
    geom_line() + # (this is a place-holder for your stat_summary) 
    geom_pointrange(data=dat2, 
        mapping=aes(x=x, # but x not being factored here 
           y=y, ymin=lower, ymax=upper)) 

Replicated plot

Cependant, si je retire l'affacturage de la valeur initiale de x, je reçois la ligne et les plages de point superposées:

ggplot(dat1, aes(x, # no more factoring here 
       y, group=z, color=z)) + 
    geom_line() + 
    geom_pointrange(data=dat2, 
        mapping=aes(x=x, y=y, ymin=lower, ymax=upper)) 

Fixed plot

Notez que je reçois toujours le résultat superposé si je facteur à la fois des x-axes. Les deux doivent simplement être cohérents. Encore une fois, je ne saurais trop insister sur le fait que cela aide tout ce processus si vous fournissez du code que nous pouvons copier/coller dans une session R et voir ce que vous voyez. Espérons que cela vous aide, mais tout se passe plus facilement (et rapidement) si vous nous aidez à vous aider.

+0

Merci pour le commentaire, Andrew. J'ai eu des choses pour bien fonctionner suite à votre suggestion. Je n'ai pas réalisé qu'en factorisant l'argument dans les données d'origine (mais pas les données ajustées) je ne serais pas capable de chevaucher le tracé. Je pense que vous avez peut-être manqué le fait que j'ai inclus mon ensemble de données (via le lien dans le deuxième paragraphe de mon article). Merci encore. –

+0

Désolé pour ça! J'ai édité la réponse pour le signaler. –