2010-11-22 35 views
3

En utilisant ggplot(), je suis en train de tracer les résultats d'une analyse de covariance où les pentes des deux composants linéaires sont égaux: à savoir, lm(y ~ x + A). Le comportement par défaut pour geom_smooth(method = "lm") consiste à tracer des pentes et des intersections distinctes pour chaque niveau de chaque facteur. Par exemple, avec deux niveaux de Apente Contraindre à stat_smooth avec ggplot (traçage ANCOVA)

library(ggplot2) 
set.seed(1234) 

n <- 20 

x1 <- rnorm(n); x2 <- rnorm(n) 
y1 <- 2 * x1 + rnorm(n) 
y2 <- 3 * x2 + (2 + rnorm(n)) 
A <- as.factor(rep(c(1, 2), each = n)) 
df <- data.frame(x = c(x1, x2), y = c(y1, y2), A = A) 

p <- ggplot(df, aes(x = x, y = y, color = A)) 
p + geom_point() + geom_smooth(method = "lm") 

Default ggplot()

je peux adapter à la ANCOVA séparément avec lm() puis utilisez geom_abline() ajouter manuellement les lignes. Cette approche présente un certain nombre d'inconvénients, notamment le fait que les lignes s'étendent au-delà de la plage des données et spécifient manuellement les couleurs.

fm <- lm(y ~ x + A, data = df) 
summary(fm) 

a1 <- coef(fm)[1] 
b <- coef(fm)[2] 
a2 <- a1 + coef(fm)[3] 

p + geom_point() + 
    geom_abline(intercept = a1, slope = b) + 
    geom_abline(intercept = a2, slope = b) 

With geom_abline()

Je sais ancova() dans le paquet HH automatise le tracé, mais je ne suis pas vraiment pour les graphiques en treillis. Donc, je suis à la recherche d'une solution ggplot() -centrique.

library(HH) 
ancova(y ~ x + A, data = df) 

Y at-il une méthode pour y parvenir en utilisant ggplot()? Pour cet exemple, A a deux niveaux, mais j'ai des situations avec 3, 4 ou plusieurs niveaux. L'argument formula à geom_smooth() ne semble pas avoir la réponse (pour autant que je sache).

+0

En bref - adapter le modèle, puis tracer la _predictions_. 'expand.grid' sera utile – hadley

Répondre

5

Pour être complet, cela fonctionne:

library(ggplot2) 
set.seed(1234) 

n <- 20 

x1 <- rnorm(n); x2 <- rnorm(n) 
y1 <- 2 * x1 + rnorm(n) 
y2 <- 3 * x2 + (2 + rnorm(n)) 
A <- as.factor(rep(c(1, 2), each = n)) 
df <- data.frame(x = c(x1, x2), y = c(y1, y2), A = A) 
fm <- lm(y ~ x + A, data = df) 

p <- ggplot(data = cbind(df, pred = predict(fm)), 
    aes(x = x, y = y, color = A)) 
p + geom_point() + geom_line(aes(y = pred))