Diagramma di regressione complessa in R


10

Devo disegnare una grafica complessa per l'analisi dei dati visivi. Ho 2 variabili e un gran numero di casi (> 1000). Ad esempio (il numero è 100 se si rende la dispersione meno "normale"):

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

1) Devo tracciare dati grezzi con dimensioni in punti, corrispondenti alla frequenza relativa delle coincidenze, quindi plot(x,y)non è un'opzione - ho bisogno di dimensioni in punti. Cosa si dovrebbe fare per raggiungere questo obiettivo?

2) Sulla stessa trama ho bisogno di tracciare l'ellisse e la linea dell'intervallo di confidenza al 95% che rappresentano il cambiamento di correlazione (non so come nominarlo correttamente) - qualcosa del genere:

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

correlogramm

ma con entrambi i grafici su una trama.

3) Infine, devo disegnare un modello di regressione lineare risultante sopra a tutto questo:

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

ma con intervallo di errori ... qualcosa di simile sul diagramma QQ:

QQ-plot

ma per errori di adattamento, se possibile.

Quindi la domanda è:

Come ottenere tutto questo in un grafico?

Risposte:


29

L'immagine qui sotto sembra quello che vuoi ottenere?

inserisci qui la descrizione dell'immagine

Ecco il codice R aggiornato , seguendo i tuoi commenti:

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

Ed ecco la versione ggplotized

inserisci qui la descrizione dell'immagine

prodotto con il seguente codice:

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)

Potrebbe essere personalizzato un po 'di più aggiungendo indici di adattamento del modello, come la distanza di Cook, con un effetto di sfumatura del colore.


1
@chl +1, bel grafico e codice breve.
mpiktas,

@mpiktas Grazie. Questo mi ha portato a rendermi conto di non aver lavorato con il campione giusto, in effetti :-)
chl

Sembra quasi quello di cui ho bisogno, ma con numeri reali ho affrontato i seguenti problemi: 1) df.new <- data.frame(x = seq(min(x), max(x), 0.1))è meglio. 2) Ellipse viene disegnato in posizione 0; 0, che non è corretto e contiene i dati della s size is also strange (too small). Also tryed libreria (auto) Ellisse (df y, livelli = 0,95: 1, lty = 2) `ma rilascia tutto. 3) Manca la curva (come nel correlogramma). L'ho quasi riprodotto chiamando ma l'intervallo di dati non è corretto. Usa le prime 2 righe del mio codice anziché le tue per riprodurre. x,dflibrary(car) cr.plots(m0)
Yuriy Petrovskiy,

@Yuriy Ok, aggiornerò il mio codice (nel frattempo non è necessario apportare alcuna modifica), ma non riesco a vedere come potremmo sovrapporci con variate casuali con valori reali con le tue impostazioni ; questo è il motivo per cui uso boostrap con la sostituzione (questo assicura che siano presenti ~ 2/3 delle unità originali). fornisce gli stessi servizi rispetto al pacchetto, ma è probabilmente meno facile da personalizzare. Immagino che la curva sovrapposta sia solo un loess , quindi non è difficile da aggiungere. (x,y)car::dataEllipseellipse
chl

2
@Tal L'interpretazione dell'ellisse è la stessa del corrgrampacchetto: mostra una regione di confidenza a coppie del 95% ipotizzando una distribuzione normale bivariata centrata sulla media e ridimensionata da SD (x) e SD (y). Non sono un grande fan di questo quando usato in un diagramma a dispersione, però. Ma vedi Murdoch & Chow, Un display grafico di grandi matrici di correlazione , Am Stat (1996) 50: 178, o Friendly, Corrgrams: display esplorativi per matrici di correlazione , Am Stat (2002) 56: 316.
chl

2

Per il punto 1 basta usare il cexparametro sul grafico per impostare la dimensione del punto.

Per esempio

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

Per avere più grafici in un grafico, utilizzare par(mfrow=c(numrows, numcols))un layout distribuito uniformemente o layoutrenderne più complessi.


1
+1 per la mancia cex, ma penso che l'OP voglia tutte le cose sulla stessa regione del complotto, non su quelle separate.
chl

Ahh ... ora capisco la domanda. Bene, allora può semplicemente usare curveo pointssovrastampare i tre grafici;)
nico
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.