11 votos

Gráfico de regresión compleja en R

Necesito dibujar un gráfico complejo para el análisis visual de datos. Tengo 2 variables y un gran número de casos (>1000). Por ejemplo (el número es 100 si para hacer la dispersión 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 representar gráficamente los datos brutos con el tamaño de los puntos, correspondiente a la frecuencia relativa de las coincidencias, de modo que plot(x,y) no es una opción: necesito tamaños de punto. ¿Qué hay que hacer para conseguirlo?

2) En el mismo gráfico necesito trazar la elipse del intervalo de confianza del 95% y la línea que representa el cambio de correlación (no sé cómo llamarlo correctamente) - algo así:

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

correlogramm

pero con los dos gráficos en una parcela.

3) Por último, necesito dibujar un modelo de regresión lineal 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

sino por errores de ajuste, si es posible.

Así que la pregunta es:

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

29voto

DavLink Puntos 101

¿Se parece la imagen a lo que quiere conseguir?

enter image description here

Aquí está el actualizado Código R, 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á el ggplotized versión

enter image description here

producido con el siguiente fragmento de 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 añadiendo índices de ajuste del modelo, como la distancia de Cook, con un efecto de sombreado de colores.

2voto

Kevin Ballard Puntos 88866

Para el punto 1 basta con utilizar el cex en el trazado para establecer el tamaño del punto.

Por ejemplo

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

Para disponer de varios gráficos en un mismo trazado, utilice par(mfrow=c(numrows, numcols)) tener una disposición uniforme o layout para hacer otras más complejas.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X