这个问题是关于统计程序 R 。
我有一个数据框study_data
,有100行,每行代表一个不同的人,还有三列,gender
,height_category
和freckles
。变量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))
我想创建一个嵌套表,将这些患者划分为“男性”与“女性”,进一步将其细分为“高”与“短”,然后计算每个子组中的患者数量以及具有95%置信区间下限和上限的雀斑中位数。
该表格应如下所示,其中#符号将替换为适当的计算结果。
gender height_category n median_freckles LCI UCI
male tall # # # #
short # # # #
female tall # # # #
short # # # #
一旦计算出这些结果,我就想创建一个条形图。 y轴将是雀斑的中位数。 x轴将分为男性与女性。但是,这些部分将按高度类别细分(因此总共有四个条形,每组两个)。我想在条形图上叠加95%的置信区间。
我知道我可以使用MASS
库和xtabs
命令创建嵌套表:
ftable(xtabs(formula = ~ gender + height_category, data = study_data))
但是,我不确定如何将雀斑数量的中位数计算到此命令中,然后将其显示在摘要表中。我也知道ggplot2
可用于制作条形图,但我不知道如何做到这一点,因为我无法首先计算出我需要的数据。
答案 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)
#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)