2016-09-23 4 views
1

У меня есть набор данных с числовыми значениями и категориальной переменной. Распределение числовой переменной отличается для каждой категории. Я хочу построить график плотности для каждой категориальной переменной, чтобы они были визуально ниже всего графика плотности.ggplot смесь модель R

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

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

library(ggplot2) 
ggplot(iris, aes(x = Sepal.Width)) + geom_density() + geom_density(aes(x = Sepal.Width, group = Species, colour = 'Species')) 

enter image description here

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

myIris <- as.data.table(iris) 
# calculate density for entire dataset 
dens_entire <- density(myIris[, Sepal.Width], cut = 0) 
dens_e <- data.table(x = dens_entire[[1]], y = dens_entire[[2]]) 

# calculate density for dataset with setosa 
dens_setosa <- density(myIris[Species == 'setosa', Sepal.Width], cut = 0) 
dens_sa <- data.table(x = dens_setosa[[1]], y = dens_setosa[[2]]) 

# calculate density for dataset with versicolor 
dens_versicolor <- density(myIris[Species == 'versicolor', Sepal.Width], cut = 0) 
dens_v <- data.table(x = dens_versicolor[[1]], y = dens_versicolor[[2]]) 

# plot densities as mixture model 
ggplot(dens_e, aes(x=x, y=y)) + geom_line() + geom_line(data = dens_sa, aes(x = x, y = y/2.5, colour = 'setosa')) + 
    geom_line(data = dens_v, aes(x = x, y = y/1.65, colour = 'versicolor')) 

, в результате чего

enter image description here

Выше я жестко закодировано число для уменьшения значения у. Есть ли способ сделать это с помощью ggplot? Или рассчитать?

Спасибо за ваши идеи.

ответ

1

Вы имеете в виду что-то вроде этого? Однако вам нужно изменить масштаб.

ggplot(iris, aes(x = Sepal.Width)) + 
    geom_density(aes(y = ..count..)) + 
    geom_density(aes(x = Sepal.Width, y = ..count.., 
       group = Species, colour = Species)) 

Другим вариантом может быть

ggplot(iris, aes(x = Sepal.Width)) + 
    geom_density(aes(y = ..density..)) + 
    geom_density(aes(x = Sepal.Width, y = ..density../3, 
        group = Species, colour = Species)) 
+0

Привет, да что выглядит многообещающим. Если я масштабирую его с количеством записей набора диафрагмы, то есть nrow (iris) = 150, это выглядит неплохо. Так что вместо ..count .. это ..count ../ 150. Может ли кто-нибудь убедиться, что это правильный путь? В моем случае число в каждой категории не совпадает, но есть одна категория, на которую приходится около 60% данных. – user3702510

+0

Привет, я подумал об этом и обсудил его, и это правильный ответ. Спасибо @Kota Mori за быстрый ответ. Либо возьмите y = ..count ../ Number_of_rows_of_entire_dataset, либо возьмите y = ..density ../ number_of_categories – user3702510