生存解析のサンプルサイズ

MikuHatsune2014-07-31

こんな感じの生存曲線を見た。
元論文では対照のマウスにある処置をすると生存期間が伸びる、ということで、それぞれ20匹のマウスを使っていた。

library(survival)
# 図から再現したらこんな感じ
n1 <- n2 <- 20
clp1 <- rep(c(24, 30, 42, 48), c(7,9,1,3))
clp2 <- rep(c(30, 42, 48, 54, 66, 96), c(6,7,1,3,1,2))
d1 <- rep(1, n1)
d2 <- replace(d1, clp2>=96, 0)

group <- rep(1:2, each=n1)
library(survival)
s1 <- survfit(Surv(time=c(clp1, clp2), event=c(d1, d2)) ~ group)
p <- survdiff(Surv(time=c(clp1, clp2), event=c(d1, d2)) ~ group)
pv <- pchisq(p$chisq, 1, lower.tail=FALSE)
plot(s1, col=c("blue", "red"), lwd=3, xaxp=c(0, 96, 12), las=1,
     xlab="Time [hrs]", ylab="Survival")
legend("topright", legend=c("vehicle", "treatment"), col=c("blue", "red"), lwd=3, bty="n", cex=2)
text(80, 0.3, paste("p =", round(pv,5)), cex=1.5)

 
あんまり差がないように見えたが、p値を計算すると割ときつい値が出てる。
となると、20匹も実験に使う必要があったのかというわけで、サンプルサイズと検出力をシミュレーションしてみると、事後解析的には検出力80%でいいなら10匹、15匹も使えば90%にはなるようである。

niter <- 300
mat <- matrix(NA, nr=n1, nc=niter)
for(j in seq(niter)){
	for(i in 3:n1){
		idx1 <- sample(seq(n1), size=i, replace=TRUE)
		idx2 <- sample(seq(n2), size=i, replace=TRUE)
		tmp.surv <- Surv(time=c(clp1[idx1], clp2[idx2]), event=c(d1[idx1], d2[idx2])) ~ rep(1:2, each=i)
		s1 <- survfit(tmp.surv)
		p <- try(survdiff(tmp.surv), silent=TRUE)
		pv <- ifelse(class(p)=="try-error", 1, pchisq(p$chisq, 1, lower.tail=FALSE))
		mat[i, j] <- pv
	}
}

po <- rowMeans(mat < 0.05)
plot(po, type="o", pch=16, xlab="sample size", ylab="power")