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.