2016년 4월 30일 토요일

아빠가 들려 주는 [통계] 생존분석에서 샘플 수 계산


오늘 보라매 병원에서 생존분석 강의를 했습니다.
지난번 인천에서도 생존분석 강의를 했는데,
그 때는 주로 다변수 분석인 Cox regression 강의를 했었구요.

오늘은 RCT 그러니까 log-rank test를 주로 사용하는 것에 대해서 강의했구요.
통계적 방법은 사실 오히려 쉽습니다.

생존분석에서 샘플 수 계산하는 것이 조금 어렵고 이해가 잘 되는 면이 있어서
이부분 강의를 다시 녹화해 보았습니다.


다음.

그 다음..

동영상 마지막 부분에 두 집단의 비율이 2가 아니라, 0.5로 바뀌어야 되는 것같은데..
어쨌든.. 그것은 나중에 수정하기로 하고.
전체적 방법이 어떤 식인지는 이해 되셨을 것으로 생각됩니다.

2016년 4월 27일 수요일

2016년 4월 26일 화요일

mulptiple test experiment :

multiple test experiment

아래는 '다중성 문제'가 어떤 것인지 실험적으로 알려주고자 만든 자료입니다.

아래의 두개의 열은 평균 0 표준편차 1인 하나의 집단에서 무작위 추출된 것입니다.
각 집단은 100개씩의 샘플로 되어 있고요.

당연히 한 집단에서 추출된 것이니 두 집단을 t-test 하면 차이가 없어야죠.
즉 p>0.05 이어야 겠죠.

그런데 p의 특성상 여러번 반복하다 보면
우연에 의해 차이가 커지는 경우가 생기고 p값은 작아집니다.

대략 100번정도 해보면 5번 정도가 그러하죠.
그것이 p값의 특징입니다.

우선 한번 실험해 보세요.
1을 2로 바꾸었다가, 다시 1로 바꾸었다가 다시 바꾸어 보세요.
그 때마다 p값이 계속 바뀝니다.

그러다가 어쩌다 한두번.. p값이 정말 작아질 때가 있을 겁니다.


multiple test experiment

우리가 여러 가지 변수를 두고 검정하게 되면,
아무런 차이가 없을지라도 우연에 의해 p값이 작아지는
경우가 발생합니다.

A수술과 B수술을 하고서,
이것저것 기능점수, 각도차이, 크기차이, 통증차이 등등을 조사합니다.
그 때 어떤 하나가 p=0.008 이 나왔다고 합시다.
그런 경우에 어떻게 해석해야 할까요?

잘 생각해 보면,
p값이 무엇인지?
1종오류, 2종오류가 무엇인지.

다중성이 왜 문제가 되는지 아실 수 있으실 것입니다.

=============================
이렇게 한번 p=0.008이 나왔다고 해도
다른 사람이 실험하면 다시 p 값이 크게 나올 가능성이 훨씬 많아집니다.

그것이 p값의 성격이고,
다중 검정을 했기 때문에 발생하는 문제점입니다.

이것이 재현가능하지 않은 연구의 주된 원인 중의 하나라고 저는 생각합니다.



2016년 4월 22일 금요일

2X5 Bang's Blinding Index

2X5 Bang's Blinding Index

무작위 대조연구에서 중요한 것 중의 하나가 얼마나 가림 blinding이 잘 되었는가
하는 이슈이죠.
Blinding Index 중에서 간단한 2X3으로 하는 것은 지난 번에 올린 적이 있고요,
이번에는 2X5 로 된 것 올리도록 하겠습니다.

역시 동일하게 노란 칸에만 입력하는 것입니다.
계산이 좀 복잡했습니다. 엑셀 아래쪽으로 내려보면 어떻게 계산했는지..
아실 수 있으실 것입니다.



 혹시, R로 계산하시고 싶으신 분은..
아래의 것을 복사해서 사용하셔도 될 것같습니다.
저도 이거 받아서 이걸로 엑셀로 전환한 것입니다.
========================
 #2by3;
bifun<-function(n11,n12,n13){
n1<-n11+n12+n13
bi<-(2*(n11/(n11+n12))-1)*(n11+n12)/n1
p1.1<-n11/n1
p2.1<-n12/n1
var.bi<-(p1.1*(1-p1.1)+p2.1*(1-p2.1)+2*p1.1*p2.1)/n1
se.bi<-sqrt(var.bi)
ub<-bi+1.96*se.bi
lb<-bi-1.96*se.bi
#return(bi,lb,ub,se.bi)
print(bi)
print(lb)
print(ub)
#print(se.bi)
}
bifun(n11=82,n12=25,n13=170)
bifun(n11=29,n12=27,n13=83)




#2by5+2x2;
bifun<-function(n11,n12,n13,n14,n15,nt,np,w11,w12,w13,w14,wt,wp){
n1<-n11+n12+n13+n14+n15
bi<-(w11*n11+w12*n12+wt*nt+wp*np+w13*n13+w14*n14)/n1
p1.1<-n11/n1
p2.1<-n12/n1
p3.1<-n13/n1
p4.1<-n14/n1
pt.1<-nt/n1
pp.1<-np/n1
var.bi<-(w11**2*p1.1*(1-p1.1)+w12**2*p2.1*(1-p2.1)+w13**2*p3.1*(1-p3.1)+w14**2*p4.1*(1-p4.1)+wt**2*pt.1*(1-pt.1)+wp**2*pp.1*(1-pp.1)
+2*w11*w12*p1.1*p2.1+2*w11*w13*p1.1*p3.1+2*w11*w14*p1.1*p4.1+2*w11*wt*p1.1*pt.1+2*w11*wp*p1.1*pp.1
                    +2*w12*w13*p2.1*p3.1+2*w12*w14*p2.1*p4.1+2*w12*wt*p2.1*pt.1+2*w12*wp*p2.1*pp.1
                                        +2*w13*w14*p3.1*p4.1+2*w13*wt*p3.1*pt.1+2*w13*wp*p3.1*pp.1
                                                            +2*w14*wt*p4.1*pt.1+2*w14*wp*p4.1*pp.1
                                                                               +2*wt*wp*pt.1*pp.1
)
var.bi<-var.bi/n1
se.bi<-sqrt(var.bi)
ub<-bi+1.96*se.bi
lb<-bi-1.96*se.bi
print(bi)
print(lb)
print(ub)
#print(se.bi)
}
bifun(n11=38,n12=44,n13=21,n14=4,n15=170,nt=79,np=86,w11=1,w12=0.5,w13=-0.5,w14=-1,wt=0.25,wp=-0.25)
bifun(n11=8,n12=21,n13=16,n14=11,n15=83,nt=45,np=36,w11=1,w12=0.5,w13=-0.5,w14=-1,wt=0.25,wp=-0.25)