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

그리고 여기 ggplotized 버전이 있습니다

여기에 이미지 설명을 입력하십시오

다음 코드 조각으로 생성됩니다.

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)

Cook의 거리와 같은 모델 맞춤 색인을 색상 음영 효과로 추가하여 조금 더 사용자 정의 할 수 있습니다.


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패키지 와 동일 합니다. 평균에 중심을두고 SD (x) 및 SD (y)에 의해 스케일링 된 이변 량 정규 분포를 가정하여 95 % 쌍별 신뢰 영역을 나타냅니다. 그러나 산점도에서 사용될 때 나는 이것의 큰 팬이 아닙니다. 그러나 Murdoch & Chow, 큰 상관 행렬의 그래픽 디스플레이 , Am Stat (1996) 50 : 178 또는 친근한 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이지만 OP는 별도의 영역이 아닌 동일한 플로팅 영역의 모든 항목을 원한다고 생각합니다.
chl

아 ... 이제 질문을 이해합니다. 글쎄, 그는 단지 세 개의 그래프를 사용 curve하거나 points과도하게 표현할 수 있습니다 ;)
nico
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.