Складний регресійний сюжет в R


10

Мені потрібно намалювати складну графіку для візуального аналізу даних. У мене є 2 змінні та велика кількість випадків (> 1000). Наприклад (число 100, якщо зробити дисперсію менш "нормальною"):

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

1) Мені потрібно побудувати необроблені дані з розміром точки, що відповідають відносній частоті збігів, тому plot(x,y)це не варіант - мені потрібні розміри точок. Що потрібно зробити для досягнення цього?

2) На цьому ж графіку мені потрібно побудувати 95% довірчого інтервалу еліпса та лінії, що представляє зміну кореляції (не знаю, як це правильно назвати) - приблизно так:

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

корелограма

але з обома графіками на одній графіці.

3) Нарешті, мені потрібно намалювати отриману лінійну регресійну модель поверх цього всього:

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

але з діапазоном помилок ... щось на кшталт QQ-сюжету:

QQ-сюжет

але для помилок при встановленні, якщо це можливо.

Отже, питання:

Як досягти всього цього за один графік?

Відповіді:


29

Чи схожа на малюнок нижче те, чого ви хочете досягти?

введіть тут опис зображення

Ось оновлений код R за вашими коментарями:

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

І ось ггплотизована версія

введіть тут опис зображення

виробляється із наступним фрагментом коду:

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)

Це можна було б налаштувати трохи більше, додавши індекси відповідності моделі, як відстань Кука, з ефектом відтінку кольорів.


1
@chl +1, хороший графік та короткий код.
mpiktas

@mpiktas Дякую Це змусило мене зрозуміти, що я не працюю з правильним зразком, насправді :-)
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 Інтерпретація еліпса така ж, як і в corrgramупаковці: вона показує 95% парної області довіри, припускаючи, що двовимірне нормальне розподіл, орієнтоване на середнє значення і масштабується за допомогою SD (x) та SD (y). Я, однак, не є великим прихильником цього, коли його використовують у скетерплотах. Але див. Murdoch & Chow, Графічне відображення великих кореляційних матриць , Am Stat (1996) 50: 178, або Friendly, Corrgrams: Дослідницькі дисплеї для кореляційних матриць , Am Stat (2002) 56: 316.
chl

2

Для точки 1 просто використовуйте cexпараметр на графіку, щоб встановити розмір точки.

Наприклад

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

Для того, щоб мати кілька графіків на одному сюжеті, використовуйте par(mfrow=c(numrows, numcols))для розміщення рівномірно розміщену форму чи layoutскладніші.


1
+1 для підказки cex, але я думаю, що ОП хоче всіх речей на одній графічній області, а не на окремих.
chl

Ааа ... тепер я розумію питання. Ну, тоді він може просто використати curveабо pointsпереграти три графіки;)
nico
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.