2015-09-28 2 views
3

Я использую функцию плотности в R, а затем вычисляя некоторые результаты из полученных плотностей. После этого я использую ggplot2 для отображения PDF-файлов с теми же данными.Плотность R-графика ggplot vs plot

Однако результаты немного отличаются от результатов, показанных на соответствующем графике, что подтверждается прямой печатью плотности (с использованием графика (графика)).

Любая идея, почему? Как я могу его исправить, поэтому результаты и график (из ggplot2) соответствуют/относятся к точно таким же данным?

Примером этого (код и изображения):

srcdata = data.frame("Value" = c(4.6228, 1.7942, 4.2738, 2.1502, 2.2665, 5.1717, 4.1015, 2.5126, 4.4270, 4.4729, 2.5112, 2.3493, 2.2787, 2.0114, 4.6931, 4.6582, 3.3162, 2.2995, 4.3954, 1.8488), "Type" = c("Positive", "Negative", "Positive", "Negative", "Negative", "Positive", "Positive", "Negative", "Positive", "Positive", "Negative", "Negative", "Negative", "Negative", "Positive", "Positive", "Positive", "Negative", "Positive", "Negative")) 

bwidth <- (density (srcdata$Value))$bw 

sample <- split (srcdata$Value, srcdata$Type)[ 1:2 ] 

xmin = min(srcdata$Value) - 0.2 * abs(min(srcdata$Value)) 
xmax = max(srcdata$Value) + 0.2 * abs(max(srcdata$Value)) 

densities <- lapply (sample, density, bw = bwidth, n = 512, from = xmin, to = xmax) 

#plotting densities result 
plot(densities [[ 1 ]], xlim = c(xmin,xmax), col = "steelblue", main = "") 
lines (densities [[ 2 ]], col = "orange") 

#plot using ggplot2 
ggplot(data = srcdata, aes(x=Value)) + geom_density(aes(group=Type, colour=Type)) + xlim(xmin, xmax) 

#or with ggplot2 (using easyGgplot2) 
ggplot2.density(data=srcdata, xName='Value', groupName='Type', alpha=0.5, xlim=c(xmin,xmax)) 

изображение:

enter image description here

+3

они, по-видимому, используют разные полосы пропускания для ядра радиальной базы. Если вы хотите, чтобы они были одинаковыми, вам нужно указать одну и ту же полосу пропускания. –

+1

Да, вы сами меняете значения по умолчанию при расчете плотностей, но не при использовании geom_density. – Axeman

ответ

3

Текущие комментарии правильно определить, что вы используете две различные полосы пропускания для расчета плотности в вашей два графики: граф plot() использует bwidth, указанный вами в качестве полосы пропускания, а граф ggplot() использует полосу пропускания по умолчанию. В идеале вы должны были бы передать bwidth графу ggplot, и это решило бы все, однако комментарий вокруг вопроса SO here предполагает, что вы не можете передать параметр полосы пропускания до stat_density или geom_density.

Проще всего сделать, чтобы получить тот же результат в обоих графиках, чтобы позволить density() определить оптимальную пропускную способность в обоих вашего расчета вручную плотности (ниже) и в ggplot графике (используя один и тот же код, у вас уже есть)

densities <- lapply (sample, density, n = 512, from = xmin, to = xmax) 

Альтернативна, фактическая binwidth используется в геом/stat_density является предопределенным binwidth раза настроить параметр (density documentation), чтобы вы могли указать adjust значения в stat_density (stat_density documentation) в попытке, чтобы попытаться настроить ggplot binwidth чтобы соответствовать вашей переменной bwidth. Я обнаружил, что регулировать значение 4.5 дает аналогичную (но не точно) версию оригинального графика производится с рассчитанными плотностями:

ggplot(data = srcdata, aes(x=Value)) + 
    geom_density(aes(group=Type, colour=Type), adjust = 4.5) + 
    xlim(xmin, xmax) 

Adjusted ggplot density graph

EDIT Вы можете найти ответ на этот вопрос полезно, если вы хотите специально настроить график ggplot так, чтобы он использовал вашу переменную bwidth в качестве ширины бина в сглаживании плотности: Understanding bandwidth smoothing in ggplot2

+0

Вы правы, спасибо! Я использовал bw, полученный из всех образцов (что составляет 0,5902679), и заставляя это на графике. Тем не менее, я рисую две кривые (группы из данных выборки). Если bw не указано, график использует нижнюю полосу пропускания из двух групп (0.1232133). Таким образом, кажется, что настройка = 0,5902679/0,1232133 = 4,79062 или: adj = bwidth/min ((плотность (образец [[1]])) $ bw, (плотность (образец [[2]])) $ bw) – Panda