Gráfico de regressão complexo em R

10

Eu preciso desenhar gráficos complexos para análise de dados visuais. Eu tenho 2 variáveis ​​e um grande número de casos (> 1000). Por exemplo (número é 100 se tornar a dispersão menos "normal"):

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

1) Preciso plotar dados brutos com tamanho de ponto, correspondendo à frequência relativa de coincidências, portanto plot(x,y)não é uma opção - preciso de tamanhos de ponto. O que deve ser feito para conseguir isso?

2) No mesmo gráfico, preciso plotar a elipse e a linha do intervalo de confiança de 95%, representando a mudança de correlação (não sei como nomeá-lo corretamente) - algo como isto:

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

correlogramm

mas com os dois gráficos em um gráfico.

3) Finalmente, preciso desenhar um modelo de regressão linar resultante além de tudo:

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

mas com intervalo de erro ... algo como no QQ-plot:

QQ-plot

mas para erros de ajuste, se for possível.

Então a questão é:

Como conseguir tudo isso em um gráfico?

Yuriy Petrovskiy
fonte

Respostas:

29

A imagem abaixo se parece com o que você deseja alcançar?

insira a descrição da imagem aqui

Aqui está o código R atualizado , seguindo seus comentários:

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

E aqui está a versão ggplotized

insira a descrição da imagem aqui

produzido com o seguinte trecho 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)

Ele pode ser personalizado um pouco mais adicionando índices de ajuste do modelo, como a distância de Cook, com um efeito de sombreamento de cores.

chl
fonte
11
@chl +1, bom gráfico e código curto.
precisa saber é o seguinte
@mpiktas Obrigado. Isso me levou a perceber que eu não funcionou com a amostra direita, na verdade :-)
chl
df.new <- data.frame(x = seq(min(x), max(x), 0.1))s size is also strange (too small). Also tryed x,dflibrary(car) cr.plots(m0)
(x,y)car::dataEllipseellipse
2
@Tal A interpretação da elipse é a mesma do corrgrampacote: mostra uma região de confiança de 95% em pares, assumindo uma distribuição normal bivariada centrada na média e dimensionada por SD (x) e SD (y). Eu não sou muito fã disso quando usado em um gráfico de dispersão. Mas veja Murdoch & Chow, Uma exibição gráfica de grandes matrizes de correlação , Am Stat (1996) 50: 178, ou Amigável, Corrgrams: Telas exploratórias para matrizes de correlação , Am Stat (2002) 56: 316.
chl
2

Para o ponto 1, basta usar o cexparâmetro no gráfico para definir o tamanho do ponto.

Por exemplo

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

Para ter vários gráficos em um gráfico, use par(mfrow=c(numrows, numcols))um layout com espaçamento uniforme ou layoutpara criar gráficos mais complexos.

nico
fonte
11
+1 para a dica cex, mas acho que o OP quer tudo na mesma região de plotagem, não em regiões separadas.
chl
Ahh ... agora eu entendo a pergunta. Bem, então ele pode apenas usar curveou pointspara overplot os três gráficos;)
nico