2点間のカーネル密度プロットのシェーディング。


94

カーネル密度プロットを頻繁に使用して、分布を説明します。これらは、次のように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を与えます:

ここに画像の説明を入力してください

PDFの下の領域を75パーセンタイルから95パーセンタイルにシェーディングしたいのですが。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
それはそのうちの1つです... 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

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.