2012-07-30 29 views
2

我有一個長格式的數據框,其中行代表不同人的響應(四類之一)。一個例子的數據集在這裏提供:自舉ggplot2中的比例(因子級別)

df <- data.frame(person=c(rep("A",100),rep("B",100)),resp=c(sample(4,100,replace=TRUE),sample(4,100,replace=TRUE))) 
df$resp <- factor(df$resp) 
summary(df) 
person resp 
A:100 1:52 
B:100 2:55 
     3:54 
     4:39 

,我要提供一個圖表,其中x軸繪出了響應類別,y軸示出了響應在一個類別比例,並且其中誤差條通過計算自舉(採樣替換)。

我可以計算出的比例(以極其缺憾的方式,我敢肯定,這可以改善,但是這不是我的主要關注):

pFrame <- ddply(df,.(person,resp),summarise,trials = length(resp)) 
# can't figure out how to calculate the proportion with plyr. 
pFrame$prop <- NA 
people <- unique(df$person) 
responses <- unique(df$resp) 
for (i in 1 : length(people)){ 
    nTrials <- nrow(subset(df,person==people[i])) 
    for (j in 1 : 4){ 
    pFrame$prop[pFrame$person==people[i] & pFrame$resp==responses[j]] <- pFrame$trials[pFrame$person==people[i] & pFrame$resp==responses[j]]/nTrials 
    } 
} 

,並繪製它:

ggplot(pFrame,aes(x=resp,y=prop,colour=person)) + geom_point() 

但我真的想使用類似stat_summary(fun.data="mean_cl_boot")的東西來顯示比例的可變性(即作用於原始數據框df,並在行上進行引導)。我已經嘗試過創建自定義函數的一些嘗試,但這看起來並不重要,因爲首先需要將因素級別轉換爲引導程序。

+0

僅供參考,這裏是全國的比重很短的版本:ggplot(DF,AES(X = RESP,顏色=人))+ geom_point(STAT = 「BIN」) – nassimhddd 2012-07-30 13:15:41

+0

謝謝@ cafe876,但正如我在下面指出的那樣,這將返回行數而不是響應比例。由於我的數據實際上具有不同數量的人之間的行數,所以我希望比例而不是數量。這就要求將每個垃圾箱的每個垃圾箱的總數除以每個垃圾箱的總數......這就是爲什麼我最終編寫了上面的垃圾回收站(無法弄清楚如何使用plyr包)。 – tsawallis 2012-07-31 15:52:29

回答

3

我無法讓ggplot的「mean_cl_boot」正常工作。這裏是一個替代的解決方案,但:

library(boot) 

summary_for_plot <- melt(prop.table(table(df), 1)) 
names(summary_for_plot) <- c("person", "resp", "V1") 

# function for boot() 
summary_function <- function(df, d){ 
    melt(prop.table(table(df[d,]), 1))[, 3] 
} 

bootres <- boot(df, statistic = summary_function, R=100) 
# get the standard deviation, used for the confidence intervals 
summary_for_plot$sd <- sd(bootres$t) 

ggplot(summary_for_plot, aes(x= resp, y = V1, color = person)) + geom_point() + 
    geom_errorbar(aes(ymin = V1-sd, ymax = V1+sd), width = 0.2) 
+0

這樣做,謝謝cafe876。遺憾的是,這不容易通過ggplot進行設計。 – tsawallis 2012-07-31 15:26:53

+0

好吧,所以這些解決方案適用於返回(並引導)行數,這等於100 *比例,因爲我的示例數據集。我真正追求的是**比例**和與此相關的不確定性,因爲在我的實際數據中,不同的人有不同的行數。任何想法如何讓plyr除以一個子類別的總和? – tsawallis 2012-07-31 15:47:06

+0

@waldog我更新了代碼以獲得比例,不再使用plyr(它沒有內置選項來計算比例)。它有點不雅,但更快! – nassimhddd 2012-08-03 12:05:57