2014-04-02 60 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