我有一个长格式数据框,其中行代表不同人的响应(四个类别之一)。这里提供了一个示例数据集:
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 :(得分: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)