Come si può tracciare una sequenza continua con interazioni continue in ggplot2?


11

Diciamo che ho dei dati:

x1 <- rnorm(100,2,10)
x2 <- rnorm(100,2,10)
y <- x1+x2+x1*x2+rnorm(100,1,2)
dat <- data.frame(y=y,x1=x1,x2=x2)
res <- lm(y~x1*x2,data=dat)
summary(res)

Voglio tracciare il continuo per interazione continua in modo tale che x1 si trovi sull'asse X e x2 sia rappresentato da 3 linee, una che rappresenta x2 con un punteggio Z di 0, una con punteggio Z di +1 e un'altra con un Punteggio Z di -1, con ogni riga di un colore separato ed etichettato. Come posso fare questo usando ggplot2?

Ad esempio, potrebbe assomigliare a qualcosa del genere (anche se ovviamente con linee colorate diverse anziché tipi di linea diversi): Immagine di esempio


Potresti mostrare un'immagine di esempio da un altro pacchetto / software o dare una descrizione più dettagliata di ciò che vuoi tracciare?
daroczig,

Risposte:


9

Ecco la mia versione con il tuo set di dati simulato:

x1 <- rnorm(100,2,10)
x2 <- rnorm(100,2,10)
y <- x1+x2+x1*x2+rnorm(100,1,2)
dat <- data.frame(y=y,x1=x1,x2=x2)
res <- lm(y~x1*x2,data=dat)
z1 <- z2 <- seq(-1,1)
newdf <- expand.grid(x1=z1,x2=z2)

library(ggplot2)
p <- ggplot(data=transform(newdf, yp=predict(res, newdf)), 
            aes(y=yp, x=x1, color=factor(x2))) + stat_smooth(method=lm)
p + scale_colour_discrete(name="x2") + 
  labs(x="x1", y="mean of resp") + 
  scale_x_continuous(breaks=seq(-1,1)) + theme_bw()

Ti ho permesso di gestire i dettagli sulle etichette dell'asse x / y e il posizionamento della legenda.

inserisci qui la descrizione dell'immagine


Sembra buono, tranne (ovviamente) dovremmo prima ridimensionare (x1) e ridimensionare (x2).
Russellpierce,

1
@drknexus Sì, certo (nei miei test iniziali ho usato variate standardizzate N (0; 1), invece delle tue).
chl

5

Calcolo delle stime per y con punteggio Z di 0 ( colonna y0 ), -1 ( colonna y1m ) e 1 ( colonna y1p ):

dat$y0 <- res$coefficients[[1]] + res$coefficients[[2]]*dat$x1 + res$coefficients[[3]]*0 + res$coefficients[[4]]*dat$x1*0
	dat$y1m <- res$coefficients[[1]] + res$coefficients[[2]]*dat$x1 + res$coefficients[[3]]*-1 + res$coefficients[[4]]*dat$x1*-1
dat$y1p <- res$coefficients[[1]] + res$coefficients[[2]]*dat$x1 + res$coefficients[[3]]*1 + res$coefficients[[4]]*dat$x1*1

Tracciare le linee con la base plot():

plot(dat$x1, dat$y0, type="l", xlab="x1", ylab="Estimates")
lines(dat$x1, dat$y1m, col="red")
lines(dat$x1, dat$y1p, col="blue")

inserisci qui la descrizione dell'immagine

Per usare ggplot, puoi chiamare geom_line :

ggplot(dat, aes(x1, y0)) + geom_line() +
    geom_line(aes(x1, y1m), color="red") +
    geom_line(aes(x1, y1p), color="blue") +
    theme_bw() + opts(title="") + xlab("x1") + ylab("Estimates")

inserisci qui la descrizione dell'immagine


2
puoi ottenere previsioni usando predict. dat [, "y0"] <- predict (res, newdata = data.frame (x1 = dat [, "x1"], x2 = 0)) Salva un po 'di digitazione.
mpiktas,

@mpiktas: grazie, non lo sapevo predict, ma sembra utile.
daroczig,

1
Consiglierei sempre di usare predict invece di calcolare tu stesso le pendenze: è molto più semplice soprattutto quando hai interazioni o componenti non lineari.
Hadley,
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.