Усреднение geom_density(y=..count..) по группирующей переменной

Я рисую некоторые распределения, используя:

geom_density(aes(my.variable,
color=my.factor,
group=my.replicates,
y=..count..))

Я хочу построить средние линии по репликам (одна строка для каждого уровня my.factor), учитывая, что у меня не одинаковое количество реплик на каждом уровне my.factor --> я не могу просто удалить аргумент 'group', так как ..count.. зависит от количества повторений. Поэтому я хотел бы что-то вроде ..count../количество повторений

Вот контекст и воспроизводимый пример

Я отбирал пробы в 2 местообитаниях (а и б): количество рыб и размер тела каждой особи. У меня были разные попытки отбора проб между местами обитания. (ra и rb — количество повторностей, отобранных в местообитаниях a и b соответственно) Меня интересуют средние различия между местообитаниями как по численности рыбы, так и по размеру тела. Однако я не знаю, как быть с тем фактом, что у меня нет такого же количества реплик.

ДАННЫЕ

#number of replicat
ra=4;rb=6
#number of individuals (lambda of poisson distribution)
na=30;nb=60
#size of individuals (lambda of poisson distribution)
sa=90;sb=80

#data for habitat a
dfa=data.frame()
for (ri in 1:ra){
  habitat="a"
  nb_rep=ra
  replicat=paste("r",ri,sep="")
  size=rpois(rpois(1,na),sa)
  dfa=rbind.data.frame(dfa,data.frame(habitat,nb_rep,replicat,size))
}
#data for habitat b
dfb=data.frame()
for (ri in 1:rb){
  habitat="b"
  nb_rep=rb
  replicat=paste("r",ri,sep="")
  size=rpois(rpois(1,nb),sb)
  dfb=rbind.data.frame(dfb,data.frame(habitat,nb_rep,replicat,size))
}
#whole data set
df=rbind(dfa,dfb)

УЧАСТКИ

require(ggplot2)
summary(df)

плотность

ggplot(df,aes(size,color=habitat))+
geom_density(aes(y=..density..))

считать

ggplot(df,aes(size,color=habitat))+
geom_density(aes(y=..count..))

Но это НЕОБЯЗАТЕЛЬНО, если образцы местообитаний не были отобраны с одинаковыми усилиями, то есть с разным количеством повторений.

подсчет, учитывая разные повторы

ggplot(df,aes(size,color=habitat,group=paste(habitat,replicat)))+
geom_density(aes(y=..count..))

Из этого последнего графика, как получить средние линии по повторениям? Спасибо


person Pierre    schedule 02.04.2014    source источник


Ответы (1)


Я не думаю, что вы можете сделать это в пределах ggplot. Вы можете рассчитать плотность самостоятельно, а затем построить расчетную плотность. Ниже я показываю, что это действительно работает, воспроизводя сюжет, который у вас уже есть с ggplot(df,aes(size,color=habitat)) + geom_density(aes(y=..count..)).

require(plyr)
# calculate the density
res <- dlply(df, .(habitat), function(x) density(x$size))
dd <- ldply(res, function(z){
  data.frame(size = z[["x"]], 
             count = z[["y"]]*z[["n"]])
})
# these two plots are essentially the same. 
ggplot(dd, aes(size, count, color=habitat)) + 
  geom_line()
ggplot(df,aes(size,color=habitat))+
  geom_density(aes(y=..count..))

Теперь немного более сложная задача усреднения плотности различных повторов.

# calculate the density 
res <- dlply(df, .(habitat), function(dat){
  lst <- dlply(dat, .(replicat), function(x) density(x$size, 
                                                     # specify to and from based on dat, not x. 
                                                     from=min(dat$size), 
                                                     to=max(dat$size)
  ))
  data.frame(size=lst[[1]][["x"]], 
             #count=colMeans(laply(lst, function(a) a[["y"]]), na.rm=TRUE)*nrow(dat),
             count=colMeans(laply(lst, function(a) a[["y"]]), na.rm=TRUE)*nrow(dat)/nlevels(droplevels(dat$replicat)), 

             habitat=dat$habitat[1])
})
dd <- rbindlist(res)
ggplot(dd, aes(size, count, color=habitat)) + 
  geom_line()
person shadow    schedule 03.04.2014
comment
большое спасибо, это очень приятно. Я думаю, что вы должны сделать небольшую модификацию, однако. Вы вычисляете «средний счет» как «средняя плотность» x «общее количество наблюдений» (т.е. nrow (dat)). Это должно быть «средняя плотность» x «среднее количество наблюдений», то есть nrow(dat)/nlevels(droplevels(dat$replicat)) - person Pierre; 03.04.2014
comment
Я попробовал ваш код с моей модификацией, он отлично работает. Я сгенерировал данные с разным количеством повторов (например, ra=5; rb=10) для каждой среды обитания, но исходя из одного и того же распределения (например, na = nb = 60; sa=sb= 90). Средние линии вполне идентичны, как и ожидалось. Спасибо еще раз. - person Pierre; 03.04.2014
comment
Любая идея о том, как проверить различия в «среднем распределении» между средами обитания? В настоящее время я вижу только (1) колмогорова-смирнова на данных, собранных по повторам, или (2) Крускала Уоллиса для сравнения медианного размера. Извините, этот вопрос не по адресу, но в контексте. - person Pierre; 03.04.2014