두 점 사이의 커널 밀도 플롯 음영.


95

분포를 설명하기 위해 커널 밀도 플롯을 자주 사용합니다. 다음과 같이 R에서 쉽고 빠르게 만들 수 있습니다.

set.seed(1)
draws <- rnorm(100)^2
dens <- density(draws)
plot(dens)
#or in one line like this: plot(density(rnorm(100)^2))

이 멋진 작은 PDF를 제공합니다.

여기에 이미지 설명 입력

75 번째 백분위 수에서 95 번째 백분위 수까지 PDF 아래 영역을 음영 처리하고 싶습니다. quantile함수를 사용하여 포인트를 계산하는 것은 쉽습니다 .

q75 <- quantile(draws, .75)
q95 <- quantile(draws, .95)

하지만 q75과 사이의 영역을 어떻게 음영 처리 q95합니까?


범위 외부와 범위 내부를 음영 처리하는 예를 제공 할 수 있습니까? 감사.
Milktrader 2011 년

답변:


75

polygon()기능을 사용하면 도움말 페이지를 참조하십시오. 여기에서도 비슷한 질문이 있다고 생각합니다.

실제 (x,y)쌍 을 얻으려면 분위수 값의 인덱스를 찾아야합니다 .

편집 : 여기 있습니다 :

x1 <- min(which(dens$x >= q75))  
x2 <- max(which(dens$x <  q95))
with(dens, polygon(x=c(x[c(x1,x1:x2,x2)]), y= c(0, y[x1:x2], 0), col="gray"))

출력 (JDL에 의해 추가됨)

여기에 이미지 설명 입력


3
구조를 제공하지 않았다면 작동하지 않았을 것입니다. 감사!
JD Long

2
그것은 demo(graphics)새벽 전부터 제 시간에 있었던 것들 중 하나입니다. 그래서 가끔씩 만나게됩니다. NBER 회귀 셰이딩 등에 대한 동일한 아이디어
Dirk Eddelbuettel

1
오 ~ 나는 어딘가에서 그것을 보았지만 그것을 본 내 정신 색인에서 가져올 수 없다는 것을 알았습니다. 당신의 정신 지수가 나보다 나아서 기뻐요.
JD Long

70

또 다른 해결책 :

dd <- with(dens,data.frame(x,y))

library(ggplot2)

qplot(x,y,data=dd,geom="line")+
  geom_ribbon(data=subset(dd,x>q75 & x<q95),aes(ymax=y),ymin=0,
              fill="red",colour=NA,alpha=0.5)

결과:

대체 텍스트


21

확장 된 솔루션 :

양쪽 꼬리 (Dirk의 코드 복사 및 붙여 넣기)를 음영 처리하고 알려진 x 값을 사용하려는 경우 :

set.seed(1)
draws <- rnorm(100)^2
dens <- density(draws)
plot(dens)

q2     <- 2
q65    <- 6.5
qn08   <- -0.8
qn02   <- -0.2

x1 <- min(which(dens$x >= q2))  
x2 <- max(which(dens$x <  q65))
x3 <- min(which(dens$x >= qn08))  
x4 <- max(which(dens$x <  qn02))

with(dens, polygon(x=c(x[c(x1,x1:x2,x2)]), y= c(0, y[x1:x2], 0), col="gray"))
with(dens, polygon(x=c(x[c(x3,x3:x4,x4)]), y= c(0, y[x3:x4], 0), col="gray"))

결과:

양 꼬리 폴리


나는 png 파일을 가지고 있고 freeimagehosting에서 그것을 호스팅하는데, 그것이로드되지 않을 수 있습니다.
Milktrader 2011 년

매우 흐릿한 파일. 그것을 다시 만들고 여기에 직접 업로드 할 수 있습니까? 그래서 자체 서버 서비스가 있습니까?
Dirk Eddelbuettel 2011 년

죄송 합니다만 SO에 직접 업로드하는 방법이 보이지 않습니다.
Milktrader 2011 년

18

이 질문에는 lattice답 이 필요합니다 . 다음은 Dirk와 다른 사람들이 사용하는 방법을 적용한 매우 기본적인 것입니다.

#Set up the data
set.seed(1)
draws <- rnorm(100)^2
dens <- density(draws)

#Put in a simple data frame   
d <- data.frame(x = dens$x, y = dens$y)

#Define a custom panel function;
# Options like color don't need to be hard coded    
shadePanel <- function(x,y,shadeLims){
    panel.lines(x,y)
    m1 <- min(which(x >= shadeLims[1]))
    m2 <- max(which(x <= shadeLims[2]))
    tmp <- data.frame(x1 = x[c(m1,m1:m2,m2)], y1 = c(0,y[m1:m2],0))
    panel.polygon(tmp$x1,tmp$y1,col = "blue")
}

#Plot
xyplot(y~x,data = d, panel = shadePanel, shadeLims = c(1,3))

여기에 이미지 설명 입력


3

다음 ggplot2은 원래 데이터 값에서 커널 밀도를 근사화하는 함수를 기반으로 한 또 다른 변형입니다.

approxdens <- function(x) {
    dens <- density(x)
    f <- with(dens, approxfun(x, y))
    f(x)
}

밀도 추정치의 x 및 y 값으로 새 데이터 프레임을 생성하는 대신 원래 데이터를 사용하면 분위수 값이 데이터가 그룹화되는 변수에 따라 달라지는면 처리 된 플롯에서도 작업 할 수있는 이점이 있습니다.

사용 된 코드

library(tidyverse)
library(RColorBrewer)

# dummy data
set.seed(1)
n <- 1e2
dt <- tibble(value = rnorm(n)^2)

# function that approximates the density at the provided values
approxdens <- function(x) {
    dens <- density(x)
    f <- with(dens, approxfun(x, y))
    f(x)
}

probs <- c(0.75, 0.95)

dt <- dt %>%
    mutate(dy = approxdens(value),                         # calculate density
           p = percent_rank(value),                        # percentile rank 
           pcat = as.factor(cut(p, breaks = probs,         # percentile category based on probs
                                include.lowest = TRUE)))

ggplot(dt, aes(value, dy)) +
    geom_ribbon(aes(ymin = 0, ymax = dy, fill = pcat)) +
    geom_line() +
    scale_fill_brewer(guide = "none") +
    theme_bw()



# dummy data with 2 groups
dt2 <- tibble(category = c(rep("A", n), rep("B", n)),
              value = c(rnorm(n)^2, rnorm(n, mean = 2)))

dt2 <- dt2 %>%
    group_by(category) %>% 
    mutate(dy = approxdens(value),    
           p = percent_rank(value),
           pcat = as.factor(cut(p, breaks = probs,
                                include.lowest = TRUE)))

# faceted plot
ggplot(dt2, aes(value, dy)) +
    geom_ribbon(aes(ymin = 0, ymax = dy, fill = pcat)) +
    geom_line() +
    facet_wrap(~ category, nrow = 2, scales = "fixed") +
    scale_fill_brewer(guide = "none") +
    theme_bw()

reprex 패키지 (v0.2.0)에 의해 2018-07-13에 생성되었습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.