2014-04-02 80 views
2

我使用绘制一些分布:取平均geom_density(Y = ..计数..)在分组变量

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

我要绘制在重复的平均值行(对于my.factor的每个水平一行),考虑到我没有在my.factor的每个级别中重复的次数相同 - >我不能删除'group'参数,因为..count ..取决于重复次数。因此,我要喜欢的东西等..count ../重复的数目

这里是上下文和可再现为例

我在第2个生境(a和b)采样:每个单独的鱼数量和身体大小。 我在栖息地之间采取了不同的取样工作。 (ra和rb是在栖息地a和b内采样的重复次数,分别) 我对栖息地之间在鱼类丰度和体型上的平均差异感兴趣。但是,我不知道如何处理这个事实,即我没有相同数量的复制品。

DATA

#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) 

PLOTS

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..)) 

从这个最后的情节,如何在获得平均线复制? 谢谢

回答

2

我不认为你可以在ggplot内做到这一点。您可以自己计算密度,然后绘制计算出的密度。下面我通过再现已有的情节,显示它实际上有效。

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() 
+0

非常感谢你,这是非常好的。不过,我认为你必须做一些小修改。您将'平均数'计算为'平均密度'x'观测总数(即nrow(dat))。它应该是'平均密度'x'平均观测数量',它是nrow(dat)/ nlevels(droplevels(dat $ replicat)) – Pierre

+0

我试着用我的修改代码,它工作正常。我为每个栖息地生成具有不同重复次数(例如,ra = 5; rb = 10)的数据,但是来自相同分布(例如na = nb = 60; sa = sb = 90)。平均线与预期完全一样。再次感谢。 – Pierre

+0

关于如何测试栖息地之间“平均分布”差异的任何想法?我目前只看到(1)kolmogorov-Smirnov关于重复数据集中的数据,或者(2)Kruskall Wallis比较中值大小。对不起,这个问题不是在正确的地方,而是在上下文中。 – Pierre