5

私は現在、ggplot の多数の回帰モデルからの最初の差異の多数の異なる分布をプロットしています。違いの解釈を容易にするために、各分布の 2.5% と 97.5% のパーセンタイルをマークしたいと思います。かなりの数のプロットを行い、データが 2 つの次元 (モデルとタイプ) でグループ化されるため、ggplot 環境でそれぞれのパーセンタイルを定義してプロットしたいと思います。ファセットを使用して分布をプロットすると、パーセンタイルを除いて、必要な場所に正確に到達できます。もちろん、これをもっと手動で行うこともできますが、理想的には、まだ使用できるソリューションを見つけたいと考えていfacet_gridます。

シミュレートされたデータを使用した例を次に示します。

df.example <- data.frame(model = rep(c("a", "b"), length.out = 500), 
                      type = rep(c("t1", "t2", "t2", "t1"), 
                      length.outh = 250), value = rnorm(1000))

 ggplot(df.example, aes(x = value)) +
 facet_grid(type ~ model) +
 geom_density(aes(fill = model, colour = model))

2 つの方法で分位数を追加しようとしました。最初のものはエラーメッセージを生成します:

 ggplot(df.example, aes(x = value)) +
 facet_grid(. ~ model) +
 geom_density(aes(fill = model, colour = model)) +
 geom_vline(aes(x = value), xintercept = quantile(value, probs = c(.025, .975)))
Error in quantile(value, probs = c(0.025, 0.975)) : object 'value' not found

2番目のものは、サブ密度ではなく、完全な変数の分位数を取得します。つまり、プロットされた分位点は 4 つの密度すべてで同一です。

 ggplot(df.example, aes(x = value)) +
 facet_grid(type ~ model) +
 geom_density(aes(fill = model, colour = model)) +
 geom_vline(xintercept = quantile(df.example$value, probs = c(.025, .975)))

その結果、ggplot2 環境内の各サブグループの特定の分位点をプロットする方法があるかどうか疑問に思いますか?

ご意見をお待ちしております。

4

4 に答える 4

5

これらの値を事前計算するには、plyr (または dplyr、data.table) を使用します ...

set.seed(1)
# ...

df.q <- ddply(df.example, .(model, type),
              summarize, q=quantile(value, c(.025, .975)))    
p + geom_vline(aes(xintercept=q), data=df.q)

プロット

于 2015-06-01T09:04:13.990 に答える
4

分位点は事前に計算できます。

サンプルデータの使用:

library (dplyr)
d2 <- df.example %>%
  group_by(model, type) %>%
  summarize(lower = quantile(value, probs = .025),
            upper = quantile(value, probs = .975))

そして、次のようにプロットします。

ggplot(df.example, aes(x = value)) +
  facet_grid(type ~ model) +
  geom_density(aes(fill = model, colour = model)) +
  geom_vline(data = d2, aes(xintercept = lower)) +
  geom_vline(data = d2, aes(xintercept = upper))

ここに画像の説明を入力

于 2015-06-01T09:04:24.380 に答える
1

最近でstat_summary()は、オプションを使用してorientation事前計算なしで同じ結果を得ることができます。

各パネルのダミー値を定義してy、観測を とともにグループ化し orientation = "y"ます。次に、カスタムfunを使用して、 の各パネルに必要な分位数のベクトルを計算しstat_summary()ます。結果を垂直線として表示するには、 で計算された結果を使用して、審美的な仕様で で 計算された値からgeom = "vline"必要な とを指定します。xinterceptxxintercept = after_stat(x)fun

library(ggplot2)

set.seed(1)

df.example <- data.frame(
  model = rep(c("a", "b"), length.out = 500),
  type = rep(c("t1", "t2", "t2", "t1"),
    length.outh = 250
  ), value = rnorm(1000)
)

ggplot(df.example, aes(x = value)) +
  facet_grid(type ~ model) +
  geom_density(aes(fill = model, colour = model)) +
  stat_summary(
    geom = "vline",
    orientation = "y",
    # y is a required aesthetic, so use a dummy value
    aes(y = 1, xintercept = after_stat(x)),
    fun = function(x) {
      quantile(x, probs = c(0.025, 0.975))
    }
  )

于 2021-12-08T14:05:54.550 に答える