Вероятность заговора с ggplot2 (не плотность) - PullRequest
6 голосов
/ 17 февраля 2011

Я бы хотел построить данные таким образом, чтобы по оси y была вероятность (в диапазоне [0,1]), а по оси x у меня были значения данных. Данные являются смежными (также в диапазоне [0,1]), поэтому я хотел бы использовать некоторую функцию оценки плотности ядра и нормализовать ее так, чтобы значение y в некоторой точке x означало вероятность увидеть значение x на входе данные.

Итак, я хотел бы спросить:

а) Разумно ли это вообще? Я понимаю, что у меня не может быть вероятности увидеть значения, которых у меня нет в данных, но я просто хотел бы интерполировать точки, которые у меня есть, с помощью функции оценки плотности ядра и впоследствии нормализовать ее.

b) Есть ли какие-либо встроенные опции в ggplot, которые я мог бы использовать, которые переопределяли бы поведение по умолчанию geom_density (), например, для этого?

Заранее спасибо,

Timo

EDIT: когда я говорил «нормализовать» раньше, я имел в виду «масштаб». Но я получил ответ, так что, спасибо, ребята, что прояснили мои мысли по этому поводу.

Ответы [ 3 ]

11 голосов
/ 19 февраля 2011

Просто составим быстрое объединение @JD Long's и @ вчерашних ответов:

ggplot(df, aes(x=x)) +
  geom_histogram(aes(y = ..density..), binwidth=density(df$x)$bw) +
  geom_density(fill="red", alpha = 0.2) +
  theme_bw() +
  xlab('') +
  ylab('')

enter image description here

Таким образом, пропускная способность для ggplot2 была вычислена как density функция, а также последняя рисуется на вершине гистограммы с хорошей прозрачностью.Но вам определенно стоит посмотреть stat_densitiy , как @yesterday предложило для дальнейшей настройки.

10 голосов
/ 17 февраля 2011

Это не ответ ggplot, но если вы хотите объединить идеи сглаживания ядра и гистограмм, вы можете использовать метод начальной загрузки + сглаживания. Вы будете биться по голове и плечам статистиками за такие ужасные поступки, поэтому используйте на свой страх и риск;)

начнем с некоторых синтетических данных:

set.seed(1)
randomData <- c(rnorm(100, 5, 3), rnorm(100, 20, 3) )
hist(randomData, freq=FALSE)
lines(density(randomData), col="red")

enter image description here

Функция плотности имеет достаточно умный калькулятор пропускной способности, который можно позаимствовать у:

bw <- density(randomData)$bw
resample <- sample( randomData, 10000, replace=TRUE)

Затем используйте вычисление пропускной способности в качестве SD для создания случайного шума

noise <- rnorm(10000, 0, bw)
hist(resample + noise, freq=FALSE)
lines(density(randomData), col="red")

enter image description here

Эй, смотри! Ядро сглаживало гистограмму!

Я знаю, что этот длинный ответ на самом деле не является ответом на ваш вопрос, но, возможно, он даст некоторые творческие идеи о том, как злоупотреблять вашими данными.

7 голосов
/ 17 февраля 2011

Вы можете контролировать поведение оценки плотности / ядра в ggplot, вызывая stat_density (), а не geom_density ().

См. Онлайн-руководство пользователя: http://had.co.nz/ggplot2/stat_density.html Вы можете указать любую из функций оценки ядра, которые поддерживаются stats :: density ()

library(ggplot2)
df <- data.frame(x = rnorm(1000))
ggplot(df, aes(x=x)) + stat_density(kernel="biweight")

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...