2

我有一个长格式数据框,其中行代表不同人的响应(四个类别之一)。此处提供了一个示例数据集:

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,并在行上引导)。我尝试了一些创建自定义函数的尝试,但这似乎并不简单,因为首先需要为引导程序转换因子水平。

4

1 回答 1

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)
于 2012-07-30T14:50:22.713 回答