2015-06-26 7 views
1

Я пытаюсь преобразовать ось x графика плотности и получить неожиданные результаты. Код без преобразования работает отлично:Лог-преобразованная функция плотности не правильно построена

library(ggplot2) 
data = data.frame(x=c(1,2,10,11,1000)) 

dens = density(data$x) 
densy = sapply(data$x, function(x) { dens$y[findInterval(x, dens$x)] }) 

ggplot(data, aes(x = x)) + 
    geom_density() + 
    geom_point(y = densy) 

enter image description here

Если добавить scale_x_log10(), я получаю следующий результат:

enter image description here

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

Я неправильно использую преобразование журнала здесь?

+0

Это имеет смысл, но даже если я преобразовать данные таким же образом, перед передачей его 'плотности()' точки и кривой не совпадают. –

+0

Возможный дубликат: http://stackoverflow.com/questions/31068689/ggplot2-stat-function-misbehaviour-with-log-scales/31069426 – RHertel

+0

@RHertel Спасибо за указатель, но это дает точки для каждого бина, а не для исходные данные. –

ответ

2

Форма кривой плотности изменяется после преобразования, поскольку распределение данных изменилось, а ширина полосы различна. Если вы установите ширину полосы пропускания (bw=1000) до преобразования и 10 после этого, вы получите две нормальные плотности (с разными значениями оси Y, так как поддержка будет намного больше в первом случае). Вот пример, показывающий, как изменяющиеся полосы пропускания изменяют форму плотности.

data = data.frame(x=c(1,2,10,11,1000), y=0) 

## Examine how changing bandwidth changes the shape of the curve 
par(mfrow=c(2,1)) 
greys <- colorRampPalette(c("black", "red"))(10) 
plot(density(data$x), main="No Transform") 
points(data, pch=19) 
plot(density(log10(data$x)), ylim=c(0,2), main="Log-transform w/ varying bw") 
points(log10(data$x), data$y, pch=19) 
for (i in 1:10) 
    points(density(log10(data$x), bw=0.02*i), col=greys[i], type="l") 
legend("topright", paste(0.02*1:10), col=greys, lty=2, cex=0.8) 

enter image description here

+0

Спасибо за ваш ответ, но на самом деле это не отвечает на мой вопрос: почему я получаю что-то совершенно иное с пиками в разных позициях с помощью функции scale_x_log10() '? –

+0

Хорошо, но почему самый высокий пик на втором участке находится слева от двух точек, которые явно вызывают это? –

+0

Итак, каков правильный способ получения графика плотности на шкале журнала с фактическими точками данных на кривой? –

Смежные вопросы