嵌套表和计算R中置信区间的汇总统计

时间:2013-05-05 18:37:19

标签: r statistics frequency categories

这个问题是关于统计程序 R

数据

我有一个数据框study_data,有100行,每行代表一个不同的人,还有三列,genderheight_categoryfreckles。变量gender是一个因子,取“男性”或“女性”的值。变量height_category也是一个因子,取值为“tall”或“short”。变量freckles是一个连续的数字变量,表示个人有多少雀斑。

以下是一些示例数据(感谢Roland):

set.seed(42)
DF <- data.frame(gender=sample(c("m","f"),100,T),
      height_category=sample(c("tall","short"),100,T),
      freckles=runif(100,0,100))

问题1

我想创建一个嵌套表,将这些患者划分为“男性”与“女性”,进一步将其细分为“高”与“短”,然后计算每个子组中的患者数量以及具有95%置信区间下限和上限的雀斑中位数。

实施例

该表格应如下所示,其中#符号将替换为适当的计算结果。

gender height_category n median_freckles LCI UCI

male              tall #               #   #   #
                 short #               #   #   #
female            tall #               #   #   #
                 short #               #   #   #

问题2

一旦计算出这些结果,我就想创建一个条形图。 y轴将是雀斑的中位数。 x轴将分为男性与女性。但是,这些部分将按高度类别细分(因此总共有四个条形,每组两个)。我想在条形图上叠加95%的置信区间。

我尝试了什么

我知道我可以使用MASS库和xtabs命令创建嵌套表:

ftable(xtabs(formula = ~ gender + height_category, data = study_data))

但是,我不确定如何将雀斑数量的中位数计算到此命令中,然后将其显示在摘要表中。我也知道ggplot2可用于制作条形图,但我不知道如何做到这一点,因为我无法首先计算出我需要的数据。

2 个答案:

答案 0 :(得分:2)

你应该提供一个可重复的例子。无论如何,您可能会发现library(plyr)有帮助。请注意这些置信区间,因为如果n <1,则中心极限定理不适用。 30。

library(plyr)
ddply(df, .(gender, height_category), summarize,
      n=length(freckles), median_freckles=median(freckles), 
      LCI=qt(.025, df=length(freckles) - 1)*sd(freckles)/length(freckles)+mean(freckles), 
      UCI=qt(.975, df=length(freckles) - 1)*sd(freckles)/length(freckles)+mean(freckles))
编辑:我忘了在剧情上添加一点。假设我们将之前的结果保存为tab

library(ggplot2)
library(reshape)
m.tab <- melt(tab, id.vars=c("gender", "height_category"))
dodge <- position_dodge(width=0.9)
ggplot(m.tab, aes(fill=height_category, x=gender, y=median_freckles))+
  geom_bar(position=dodge) + geom_errorbar(aes(ymax=UCI, ymin=LCI), position=dodge, width=0.25)

答案 1 :(得分:1)

set.seed(42)
DF <- data.frame(gender=sample(c("m","f"),100,T),
                 height_category=sample(c("tall","short"),100,T),
                 freckles=runif(100,0,100))


library(plyr)
res <- ddply(DF,.(gender,height_category),summarise,
             n=length(na.omit(freckles)),
             median_freckles=quantile(freckles,0.5,na.rm=TRUE),
             LCI=quantile(freckles,0.025,na.rm=TRUE),
             UCI=quantile(freckles,0.975,na.rm=TRUE))

library(ggplot2)
p1 <- ggplot(res,aes(x=gender,y=median_freckles,ymin=LCI,ymax=UCI,
                     group=height_category,fill=height_category)) +
  geom_bar(stat="identity",position="dodge") +
  geom_errorbar(position="dodge")
print(p1)

enter image description here

#a better plot that doesn't require to precalculate the stats
library(hmisc)
p2 <- ggplot(DF,aes(x=gender,y=freckles,colour=height_category)) + 
  stat_summary(fun.data="median_hilow",geom="pointrange",position = position_dodge(width = 0.4))
print(p2)

enter image description here