# 사용자 정의 함수 summarySE 는 표준 편차, 평균의 표준 오차 및 (기본값 95%) 신뢰 구간 산출 tgc <- summarySE(tg, measurevar="len", groupvars=c("supp","dose")) tgc
선 그래프
데이터를 요약한 후에 그래프를 만들어 표현할 수 있어요.
아래는 평균의 표준 오차 또는 95% 신뢰 구간을 나타내는 오차 막대가 있는 기본 선 및 점 그래프입니다.
# 평균의 표준 오차 ggplot(tgc, aes(x=dose, y=len, colour=supp)) + geom_errorbar(aes(ymin=len-se, ymax=len+se), width=.1) + geom_line() + geom_point() # 오차 막대가 겹치지 않게 position_dodge를 사용하여 수평으로 이동 pd <- position_dodge(0.1) # 왼쪽과 오른쪽으로 0.05 이동
ggplot(tgc, aes(x=dose, y=len, colour=supp)) + geom_errorbar(aes(ymin=len-se, ymax=len+se), width=.1, position=pd) + geom_line(position=pd) + geom_point(position=pd) # SEM 대신 95% 신뢰 구간 사용 ggplot(tgc, aes(x=dose, y=len, colour=supp)) + geom_errorbar(aes(ymin=len-ci, ymax=len+ci), width=.1, position=pd) + geom_line(position=pd) + geom_point(position=pd) # 검은색 오류 막대 - 'group=supp' 매핑을 확인합니다. -- 없으면 오류가 발생합니다. ggplot(tgc, aes(x=dose, y=len, colour=supp, group=supp)) + geom_errorbar(aes(ymin=len-ci, ymax=len+ci), colour="black", width=.1, position=pd) + geom_line(position=pd) + geom_point(position=pd, size=3)
평균의 표준 오차를 나타내는 오차 막대가 있는 완성된 그래프는 아래에 있어요.
흰색 채우기가 선과 오차 막대 위에 오도록 점을 마지막에 그렸어요.
ggplot(tgc, aes(x=dose, y=len, colour=supp, group=supp)) + geom_errorbar(aes(ymin=len-se, ymax=len+se), colour="black", width=.1, position=pd) + geom_line(position=pd) + geom_point(position=pd, size=3, shape=21, fill="white") + # shape =21 은 색상으로 가득 채워진 원 xlab("Dose (mg)") + ylab("Tooth length") + scale_colour_hue(name="Supplement type", # 범례 레이블, 더 어두운 색상 사용 breaks=c("OJ", "VC"), labels=c("Orange juice", "Ascorbic acid"), l=40) + # 더 어두운 색상 사용, 밝기=40 ggtitle("The Effect of Vitamin C on\nTooth Growth in Guinea Pigs") + expand_limits(y=0) + # y 범위 확장 scale_y_continuous(breaks=0:20*4) + # 4 단위마다 틱 설정 theme_bw() + theme(legend.justification=c(1,0), legend.position=c(1,0)) # 오른쪽 하단으로 범례 위치 조정
막대그래프
절차는 일반적인 막대그래프와 유사해요.
tgc$dose는 factor형이어야 해요. 숫자형 벡터인 경우 작동하지 않으니, 주의하세요.
# dose을 factor형 변수로 변환 tgc2 <- tgc tgc2$dose <- factor(tgc2$dose) str(tgc2) # 오차 막대는 평균의 표준 오차를 표현 ggplot(tgc2, aes(x=dose, y=len, fill=supp)) + geom_bar(position=position_dodge(), stat="identity") + geom_errorbar(aes(ymin=len-se, ymax=len+se), width=.2, # 오차 막대의 너비 조정 position=position_dodge(.9)) # SEM 대신 95% 신뢰 구간 사용 ggplot(tgc2, aes(x=dose, y=len, fill=supp)) + geom_bar(position=position_dodge(), stat="identity") + geom_errorbar(aes(ymin=len-ci, ymax=len+ci), width=.2, # 오차 막대의 너비 조정 position=position_dodge(.9))
최종 완성된 그래프는 아래와 같습니다.
ggplot(tgc2, aes(x=dose, y=len, fill=supp)) + geom_bar(position=position_dodge(), stat="identity", colour="black", # 막대그래프에 검은색 윤곽선 사용, size=.3) + # 얇은 선 geom_errorbar(aes(ymin=len-se, ymax=len+se), size=.3, # 얇은 선 width=.2, position=position_dodge(.9)) + xlab("Dose (mg)") + ylab("Tooth length") + scale_fill_hue(name="Supplement type", # 범례 라벨, 더 어두운 색상 사용 breaks=c("OJ", "VC"), labels=c("Orange juice", "Ascorbic acid")) + ggtitle("The Effect of Vitamin C on\nTooth Growth in Guinea Pigs") + scale_y_continuous(breaks=0:20*4) + theme_bw()
개체 내 변수에 대한 오차 막대
위에서 보신 바와 같이 모든 변수가 개체 사이에 있을 때 표준 오차 또는 신뢰 구간을 그리는 것은 간단해요.
그러나 개체 내에 변수(반복 측정)가 있는 경우 표준 오차 또는 정규 신뢰 구간을 표시하면,
조건 간의 차이에 대한 추론이 잘못될 수 있어요.
아래 방법은 Cousineau(2005)를 수정한 Morey(2008)에서 가져온 것으로
Loftus와 Masson(1994)에서보다 더 간단한 방법이에요.
개체 내 변수가 있는 오차 막대와 관련된 문제에 대한 보다 상세한 내용은 넘어가도록 할게요.
<하나의 개체 내 변수>
다음은 하나의 개체 내 변수(사전/사후 테스트)가 있는 데이터 세트(Morey 2008)에요.
# long format으로 변환 library(reshape2) dfw_long <- melt(dfw, id.vars = "subject", measure.vars = c("pretest","posttest"), variable.name = "condition")
dfw_long
그래프로 표현하기 위해서 summarySEwithin 함수를 사용하여 데이터를 축약합니다.
(summarySEwithin 함수는 사용자 정의 함수로 R에 내장되어 있는 함수가 아니에요.
아래 2개의 사용자 정의 함수를 먼저 실행해야 합니다. 처음에는 다소 어려울 수 있으니, 실행만 하시고 넘어가세요.)
## 데이터 프레임에서 지정된 그룹 내의 데이터 규범화 ## 이는 betweenvars로 지정된 각 그룹 내에서 동일한 평균값을 갖도록 각 개체(idvar로 식별됨)를 정규화 ## data: 데이터 프레임 ## idvar: 각 개체(또는 일치하는 개체)를 식별하는 열의 이름 ## measurevar: 요약할 변수를 포함하는 열의 이름 ## betweenvars: 개체 간 변수인 열의 이름을 포함하는 벡터 ## na.rm: NA를 무시할지 여부를 나타내는 부울 normDataWithin <- function(data=NULL, idvar, measurevar, betweenvars=NULL, na.rm=FALSE, .drop=TRUE) { library(plyr)
# 왼쪽의 var, 오른쪽의 var 사이의 idvar +를 측정 data.subjMean <- ddply(data, c(idvar, betweenvars), .drop=.drop, .fun = function(xx, col, na.rm) { c(subjMean = mean(xx[,col], na.rm=na.rm)) }, measurevar, na.rm )
# 원본 데이터와 함께 개체 평균값 삽입 data <- merge(data, data.subjMean)
# 새 열에서 정규화된 데이터 가져오기 measureNormedVar <- paste(measurevar, "_norm", sep="") data[,measureNormedVar] <- data[,measurevar] - data[,"subjMean"] + mean(data[,measurevar], na.rm=na.rm)
# 개체 평균 열 제거 data$subjMean <- NULL
return(data) }
## 데이터를 요약하고 개체 간 변동성을 제거하여 개체 내 변수 처리 ## 내부 S 변수가 없는 경우에도 여전히 작동 ## 개수, 정규화되지 않은 평균, 정규화된 평균(그룹 간 평균이 동일함), ## 표준 편차, 평균의 표준 오차 및 신뢰 구간 제공 ## 개체 내 변수가 있는 경우 Morey(2008)의 방법을 사용하여 수정된 값 계산 ## data: 데이터 프레임 ## measurevar: 요약할 변수를 포함하는 열의 이름 ## betweenvars: 개체 간 변수인 열의 이름을 포함하는 벡터 ## withinvars: 개체 내 변수인 열의 이름을 포함하는 벡터 ## idvar: 각 주제(또는 일치하는 주제)를 식별하는 열의 이름 ## na.rm: NA를 무시할지 여부를 나타내는 부울 ## conf.interval: 신뢰 구간의 백분율 범위(기본값은 95%)
# 사용하지 않는 모든 열 삭제(표준 데이터로 계산됨) datac$sd <- NULL datac$se <- NULL datac$ci <- NULL
# 각 개체의 데이터를 규범화 ndata <- normDataWithin(data, idvar, measurevar, betweenvars, na.rm, .drop=.drop)
# 새 열의 이름 measurevar_n <- paste(measurevar, "_norm", sep="")
# 정규화된 데이터 축소 # var 사이 및 var 내에서 동일하게 처리 가능 ndatac <- summarySE(ndata, measurevar_n, groupvars=c(betweenvars, withinvars), na.rm=na.rm, conf.interval=conf.interval, .drop=.drop)
# 표준 오차 및 신뢰 구간에 Morey(2008)의 보정 적용 # S 내 변수의 조건 수의 곱 구하기 nWithinGroups <- prod(vapply(ndatac[,withinvars, drop=FALSE], FUN=nlevels, FUN.VALUE=numeric(1))) correctionFactor <- sqrt( nWithinGroups / (nWithinGroups-1) )
각 그룹에 대한 규칙적인 표준 오차(또는 신뢰 구간)를 취함으로써 반드시 밝혀지는 것은 아닙니다.
Morey(2008)와 Cousineau(2005)의 방법은 기본적으로 데이터를 정규화하여 개체 간 변동성을 제거하고,
이 정규화된 데이터에서 분산을 계산합니다.
# 일관된 y 범위 사용 ymax <- max(dfw_long$value) ymin <- min(dfw_long$value)
# 개별 플롯 ggplot(dfw_long, aes(x=condition, y=value, colour=subject, group=subject)) + geom_line() + geom_point(shape=21, fill="white") + ylim(ymin,ymax) # 데이터의 표준 버전 생성 dfwNorm.long <- normDataWithin(data=dfw_long, idvar="subject", measurevar="value")
# summarySEwithin 대신에 조건을 개체 간 변수인 것처럼 취급하는 summarySE를 사용 dfwc_between <- summarySE(data=dfw_long, measurevar="value", groupvars="condition", na.rm=FALSE, conf.interval=.95) dfwc_between # 사이 S CI는 빨간색으로, 내부 S CI는 검은색으로 표시 ggplot(dfwc_between, aes(x=condition, y=value, group=1)) + geom_line() + geom_errorbar(width=.1, aes(ymin=value-ci, ymax=value+ci), colour="red") + geom_errorbar(width=.1, aes(ymin=value-ci, ymax=value+ci), data=dfwc) + geom_point(shape=21, size=3, fill="white") + ylim(ymin,ymax)
<두 개의 개체 내 변수>
개체 내 변수가 두 개 이상인 경우 동일한 함수인 summarySEwithin을 사용할 수 있어요.
이 데이터 세트는 Hays(1994)에서 가져왔으며, Rouder와 Morey(2005)에서
# 조건 열을 Shape 및 ColorScheme으로 분할 data_long$Shape <- NA data_long$Shape[grepl("^Round", data_long$Condition)] <- "Round" data_long$Shape[grepl("^Square", data_long$Condition)] <- "Square" data_long$Shape <- factor(data_long$Shape)
dat <- read.table(header=TRUE, text=' id trial gender dv A 0 male 2 A 1 male 4 B 0 male 6 B 1 male 8 C 0 female 22 C 1 female 24 D 0 female 26 D 1 female 28 ')
댓글