[英]Nested tables and calculating summary statistics with confidence intervals in R
這個問題與統計程序R有關 。
我有一個數據幀, study_data
,具有100行,每行代表一個不同的人,和三列, gender
, height_category
,和freckles
。 可變gender
是一個因素,取“男性”或“女性”的值。 變量height_category
也是一個因素,取值為“高”或“短”。 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
可用於制作條形圖,但是由於我無法首先計算所需的數據,因此不確定如何執行此操作。
您確實應該提供一個可復制的示例。 無論如何,您可能會發現library(plyr)
很有幫助。 請注意這些置信區間,因為如果n <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)
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.