Gráfico de regresión compleja en R

10

Necesito dibujar gráficos complejos para el análisis de datos visuales. Tengo 2 variables y una gran cantidad de casos (> 1000). Por ejemplo (el número es 100 si para que la dispersión sea menos "normal"):

x <- rnorm(100,mean=95,sd=50)
y <- rnorm(100,mean=35,sd=20)
d <- data.frame(x=x,y=y)

1) Necesito trazar datos sin procesar con tamaño de punto, correspondiente a la frecuencia relativa de coincidencias, por plot(x,y)lo que no es una opción: necesito tamaños de punto. ¿Qué se debe hacer para lograr esto?

2) En la misma gráfica, necesito trazar una elipse de intervalo de confianza del 95% y una línea que represente el cambio de correlación (no sé cómo nombrarla correctamente), algo como esto:

library(corrgram)
corrgram(d, order=TRUE, lower.panel=panel.ellipse, upper.panel=panel.pts)

correlograma

pero con ambas gráficas en una parcela.

3) Finalmente, necesito dibujar un modelo de regresión linar resultante sobre todo esto:

r<-lm(y~x, data=d)
abline(r,col=2,lwd=2)

pero con rango de error ... algo así como en QQ-plot:

QQ-plot

pero para errores de ajuste, si es posible.

Entonces la pregunta es:

¿Cómo lograr todo esto en un gráfico?

Yuriy Petrovskiy
fuente

Respuestas:

29

¿La imagen de abajo se parece a lo que quieres lograr?

ingrese la descripción de la imagen aquí

Aquí está el código R actualizado , siguiendo sus comentarios:

do.it <- function(df, type="confidence", ...) {
  require(ellipse)
  lm0 <- lm(y ~ x, data=df)
  xc <- with(df, xyTable(x, y))
  df.new <- data.frame(x=seq(min(df$x), max(df$x), 0.1))
  pred.ulb <- predict(lm0, df.new, interval=type)
  pred.lo <- predict(loess(y ~ x, data=df), df.new)
  plot(xc$x, xc$y, cex=xc$number*2/3, xlab="x", ylab="y", ...)
  abline(lm0, col="red")
  lines(df.new$x, pred.lo, col="green", lwd=1.5)
  lines(df.new$x, pred.ulb[,"lwr"], lty=2, col="red")
  lines(df.new$x, pred.ulb[,"upr"], lty=2, col="red")    
  lines(ellipse(cor(df$x, df$y), scale=c(sd(df$x),sd(df$y)), 
        centre=c(mean(df$x),mean(df$y))), lwd=1.5, col="green")
  invisible(lm0)
}

set.seed(101)
n <- 1000
x <- rnorm(n, mean=2)
y <- 1.5 + 0.4*x + rnorm(n)
df <- data.frame(x=x, y=y)

# take a bootstrap sample
df <- df[sample(nrow(df), nrow(df), rep=TRUE),]

do.it(df, pch=19, col=rgb(0,0,.7,.5))

Y aquí está la versión ggplotized

ingrese la descripción de la imagen aquí

producido con el siguiente código:

xc <- with(df, xyTable(x, y))
df2 <- cbind.data.frame(x=xc$x, y=xc$y, n=xc$number)
df.ell <- as.data.frame(with(df, ellipse(cor(x, y), 
                                         scale=c(sd(x),sd(y)), 
                                         centre=c(mean(x),mean(y)))))
library(ggplot2)

ggplot(data=df2, aes(x=x, y=y)) + 
  geom_point(aes(size=n), alpha=.6) + 
  stat_smooth(data=df, method="loess", se=FALSE, color="green") + 
  stat_smooth(data=df, method="lm") +
  geom_path(data=df.ell, colour="green", size=1.2)

Se podría personalizar un poco más agregando índices de ajuste del modelo, como la distancia de Cook, con un efecto de sombreado de color.

chl
fuente
1
@chl +1, buen gráfico y código corto.
mpiktas
@mpiktas Gracias. Esto me llevó a darme cuenta de que no trabajé con la muestra correcta, de hecho :-)
chl
df.new <- data.frame(x = seq(min(x), max(x), 0.1))s size is also strange (too small). Also tryed X,reFlibrary(car) cr.plots(m0)
(X,y)car::dataEllipseellipse
2
@Tal La interpretación de la elipse es la misma que en el corrgrampaquete: muestra una región de confianza por pares del 95% suponiendo una distribución normal bivariada centrada en la media y escalada por SD (x) y SD (y). Sin embargo, no soy un gran admirador de esto cuando se usa en un diagrama de dispersión. Pero vea Murdoch & Chow, Una visualización gráfica de grandes matrices de correlación , Am Stat (1996) 50: 178, o Amistoso, Corrgrams: Pantallas exploratorias para matrices de correlación , Am Stat (2002) 56: 316.
chl
2

Para el punto 1 solo use el cexparámetro en el diagrama para establecer el tamaño del punto.

Por ejemplo

x = rnorm(100)
plot(x, pch=20, cex=abs(x))

Para tener múltiples gráficos en una parcela, use par(mfrow=c(numrows, numcols))tener un diseño uniformemente espaciado o layouthacer diseños más complejos.

nico
fuente
1
+1 para el consejo cex, pero creo que el OP quiere todas las cosas en la misma región de trazado, no en regiones separadas.
chl
Ahh ... ahora entiendo la pregunta. Bueno, entonces él solo puede usar curveo pointspara sobre trazar los tres gráficos;)
nico