在ggplot2中引导一个比例(因子水平)

时间:2012-07-30 08:16:06

标签: r 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,并在行上自举)。我尝试了一些创建自定义函数的尝试,但这似乎并不重要,因为首先需要为引导程序转换因子级别。

1 个答案:

答案 0 :(得分: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)