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?

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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.