Plot regresi kompleks dalam R


10

Saya perlu menggambar grafik yang kompleks untuk analisis data visual. Saya memiliki 2 variabel dan sejumlah besar kasus (> 1000). Misalnya (angka 100 jika membuat dispersi kurang "normal"):

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

1) Saya perlu memplot data mentah dengan ukuran titik, yang sesuai dengan frekuensi relatif dari kebetulan, jadi plot(x,y)bukan pilihan - saya perlu ukuran titik. Apa yang harus dilakukan untuk mencapai ini?

2) Pada plot yang sama saya perlu memplot interval kepercayaan 95% elips dan garis yang mewakili perubahan korelasi (tidak tahu bagaimana cara menamainya dengan benar) - sesuatu seperti ini:

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

korelasiogram

tetapi dengan kedua grafik pada satu plot.

3) Akhirnya, saya perlu menggambar model regresi linar yang dihasilkan di atas semua ini:

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

tetapi dengan rentang kesalahan ... sesuatu seperti pada QQ-plot:

QQ-plot

tetapi untuk kesalahan pemasangan, jika memungkinkan.

Jadi pertanyaannya adalah:

Bagaimana cara mencapai semua ini dalam satu grafik?

Jawaban:


29

Apakah gambar di bawah ini terlihat seperti apa yang ingin Anda capai?

masukkan deskripsi gambar di sini

Berikut kode R yang diperbarui , mengikuti komentar Anda:

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

Dan ini adalah versi ggplotized

masukkan deskripsi gambar di sini

diproduksi dengan potongan kode berikut:

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)

Itu bisa dikustomisasi sedikit lebih dengan menambahkan indeks model fit, seperti jarak Cook, dengan efek naungan warna.


1
@chl +1, grafik yang bagus, dan kode pendek.
mpiktas

@mpikta Terima kasih. Ini membuat saya sadar bahwa saya tidak bekerja dengan sampel yang tepat, pada kenyataannya :-)
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 Penafsiran elips sama dengan dalam corrgrampaket: itu menunjukkan wilayah kepercayaan berpasangan 95% dengan asumsi distribusi normal bivariat berpusat pada rata-rata dan diskalakan dengan SD (x) dan SD (y). Saya bukan penggemar berat ini ketika digunakan di sebar scatter. Tetapi lihat Murdoch & Chow, A tampilan grafis dari matriks korelasi besar , Am Stat (1996) 50: 178, atau Friendly, Corrgrams: Tampilan eksplorasi untuk matriks korelasi , Am Stat (2002) 56: 316.
chl

2

Untuk poin 1 cukup gunakan cexparameter pada plot untuk mengatur ukuran poin.

Contohnya

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

Untuk memiliki banyak grafik dalam satu plot, gunakan par(mfrow=c(numrows, numcols))tata letak dengan jarak yang sama atau layoutuntuk membuat yang lebih rumit.


1
Beri +1 untuk tip tentang cex, tetapi saya pikir OP menginginkan semua hal di wilayah plot yang sama, bukan yang terpisah.
chl

Ahh ... sekarang saya mengerti pertanyaannya. Nah, kalau begitu dia bisa menggunakan curveatau pointsoverplot tiga grafik;)
nico
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.