Como um gráfico pode ser contínuo por interações contínuas no ggplot2?

11

Digamos que eu tenha dados:

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)

Quero plotar o contínuo por interação contínua, de modo que x1 esteja no eixo X e x2 seja representado por 3 linhas, uma que representa x2 com um escore Z de 0, uma com escore Z de +1 e outra com um Escore Z de -1, com cada linha com uma cor separada e rotulada. Como posso fazer isso usando o ggplot2?

Por exemplo, pode ser algo parecido com isto (embora, é claro, com linhas coloridas diferentes em vez de diferentes tipos de linha): Imagem de exemplo

russellpierce
fonte
Você poderia mostrar uma imagem de exemplo de outro pacote / software ou fornecer uma descrição mais detalhada do que deseja plotar?
daroczig

Respostas:

9

Aqui está minha versão com seu conjunto de dados simulados:

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

Eu deixo você gerenciar os detalhes sobre os rótulos dos eixos x / y e o posicionamento das legendas.

insira a descrição da imagem aqui

chl
fonte
Parece bom, exceto (é claro) que precisaríamos escalar (x1) e escalar (x2) primeiro.
russellpierce
1
@drknexus Sim, é claro (nos meus testes iniciais, usei variáveis ​​padronizadas de N (0; 1), em vez das suas).
chl 27/01
5

Calculando as estimativas para y com escore Z de 0 ( coluna y0 ), -1 ( coluna y1m ) e 1 ( coluna 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

Traçando as linhas com 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")

insira a descrição da imagem aqui

Para usar o ggplot, você pode chamar 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")

insira a descrição da imagem aqui

daroczig
fonte
2
você pode obter previsões usando o predizer. dat [, "y0"] <- prever (res, newdata = data.frame (x1 = dat [, "x1"], x2 = 0)) Economiza um pouco de digitação.
Mvctas
@mpiktas: obrigado, eu não sabia predict, mas parece útil.
precisa saber é
1
Eu sempre recomendo usar a previsão em vez de calcular as inclinações por conta própria - é muito mais simples, especialmente quando você tem interações ou componentes não lineares.
Hadley