R ggplot2::geom_density с постоянной переменной

Недавно я столкнулся с проблемой с ggplot2::geom_density, которую не могу решить. Я пытаюсь визуализировать плотность некоторой переменной и сравнить ее с константой. Чтобы построить плотность, я использую ggplot2::geom_density. Однако переменная, для которой я рисую плотность, оказалась константой (на этот раз):

df <- data.frame(matrix(1,ncol = 1, nrow = 100))
colnames(df) <- "dummy"

dfV <- data.frame(matrix(5,ncol = 1, nrow = 1))
colnames(dfV) <- "latent"

ggplot() + 
  geom_density(data = df, aes(x = dummy, colour = 's'), 
                 fill = '#FF6666', alpha = 0.2, position = "identity") +
  geom_vline(data = dfV, aes(xintercept = latent, color = 'ls'), size = 2)

введите здесь описание изображения Это нормально, чего я и ожидал. Но когда я сдвигаю это распределение вправо, я получаю такой график:

df <- data.frame(matrix(71,ncol = 1, nrow = 100))
colnames(df) <- "dummy"

dfV <- data.frame(matrix(75,ncol = 1, nrow = 1))
colnames(dfV) <- "latent"

ggplot() + 
  geom_density(data = df, aes(x = dummy, colour = 's'), 
               fill = '#FF6666', alpha = 0.2, position = "identity") +
  geom_vline(data = dfV, aes(xintercept = latent, color = 'ls'), size = 2) 

введите здесь описание изображения что, вероятно, означает, что оценка ядра по-прежнему принимает 0 в качестве центра распределения (правильно?).

Есть ли способ обойти это? Я хотел бы видеть график, подобный приведенному выше, только центр плотности кернера был бы в 71, а vline в 75.

Спасибо


person Rado    schedule 21.01.2016    source источник
comment
это связано с настройками и параметрами bw, переданными в stat::density через ggplot2::stat_density. Я не уверен, как именно изменить его, чтобы получить предполагаемое решение... Хотя, конечно, делать оценку плотности константы глупо.   -  person Alex W    schedule 22.01.2016
comment
Что ж? Это полезно?   -  person Mike Wise    schedule 22.01.2016


Ответы (1)


Ну, я не уверен, что делает код, но я подозреваю, что примитив geom_density не был разработан для случая, когда все значения одинаковы, и он делает некоторые предположения о распределении, которые не соответствуют вашим ожиданиям. Вот некоторый код и сюжет, который проливает свет:

# Generate 10 data sets with 100 constant values from 0 to 90
# and then merge them into a single dataframe

dfs <- list()
for (i in 1:10){
  v <- 10*(i-1)
  dfs[[i]] <- data.frame(dummy=rep(v,100),facet=v)
}
df <- do.call(rbind,dfs)

# facet plot them
ggplot() + 
  geom_density(data = df, aes(x = dummy, colour = 's'), 
                       fill = '#FF6666', alpha = 0.5, position = "identity") +
  facet_wrap( ~ facet,ncol=5 )

Урожайность:

введите здесь описание изображения

Таким образом, он делает не то, что вы думали, но, возможно, и не то, что вы хотите. Конечно, вы могли бы сделать его «инвариантным к переводу» (почти), добавив, например, такой шум:

set.seed(1234)

noise <- +rnorm(100,0,1e-3)
dfs <- list()
for (i in 1:10){
  v <- 10*(i-1)
  dfs[[i]] <- data.frame(dummy=rep(v,100)+noise,facet=v)
}
df <- do.call(rbind,dfs)

ggplot() + 
  geom_density(data = df, aes(x = dummy, colour = 's'), 
               fill = '#FF6666', alpha = 0.5, position = "identity") +
  facet_wrap( ~ facet,ncol=5 )

Урожайность:

введите здесь описание изображения

Обратите внимание, что в функции geom_density, по-видимому, есть случайный компонент, и я не вижу, как установить начальное значение перед каждым экземпляром, поэтому расчетная плотность каждый раз немного отличается.

person Mike Wise    schedule 21.01.2016