【问题标题】:Averaging geom_density(y=..count..) over a grouping variable在分组变量上平均 geom_density(y=..count..)
【发布时间】:2014-05-13 14:59:34
【问题描述】:

我使用以下方法绘制了一些分布:

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

考虑到我在 my.factor 的每个级别中没有相同数量的复制,我想绘制复制的平均线(my.factor 的每个级别一条线) --> 我不能只删除 'group' 参数,因为 ..count.. 取决于复制的数量。因此,我想要类似 ..count../number of replicates

这是上下文和可重现的示例

我在 2 个栖息地(a 和 b)进行了采样:鱼的数量和每个个体的体型。 我在栖息地之间进行了不同的采样工作。 (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..))

从最后一张图中,如何获得重复的平均线? 谢谢

【问题讨论】:

    标签: r ggplot2 histogram kernel-density density-plot


    【解决方案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()
    

    【讨论】:

    • 非常感谢,非常好。但是,我认为您必须进行一些小修改。您将“平均计数”计算为“平均密度”x“观察总数”(即 nrow(dat))。它应该是'平均密度' x '平均观察次数',即 nrow(dat)/nlevels(droplevels(dat$replicat))
    • 我用我的修改尝试了你的代码,它工作正常。我为每个栖息地生成了具有不同重复次数的数据(例如 ra=5;rb=10),但来自相同的分布(例如 na = nb = 60;sa=sb= 90)。平均线与预期的一样安静。再次感谢。
    • 知道如何测试栖息地之间“平均分布”的差异吗?我目前只看到 (1) kolmogorov-Smirnov 对重复数据汇集的数据,或 (2) Kruskall wallis 用于比较中值大小。抱歉,这个问题不是在正确的地方,而是在上下文中。
    猜你喜欢
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 2017-04-16
    • 2023-04-04
    相关资源
    最近更新 更多