생물정보분석 #3 확률분포, 카이제곱검정 #
#2026-01-13
#1 통계적 유의성
통계적 유의성
- 실험 결과로 나온 수치가 우연인지, 주장을 뒷받침할만큼 확률(빈도)이 높은 것인지 그 의미를 검증할수만 있으면 된다.
- 어떤 실험 결과가 통계적으로 유의하다는 말은
- 그 결과가 우연히 일어난 것이 아니라는 것
- 통계 분석을 통해
- 어떤 암에서 특정 유전자가 빈번하게 발현되는것을 발견했다고 할때 이것이 우연히 관측된 결과인지 중복된 관찰을 통해 큰 의미가 있는 것으로 결론지을수 있는 것인지 정량적으로 밝힐 수 있다.
p-value
- 관측이 진리가 아닌 우연일 확률
- 0-가설로 다음을 설정: 동전은 앞면이 나올 확률이 1/2이다.
- 그리고 실험: 10번 던지기를 1000번 해보니 60번은 앞면이 8번이상 나왔다.
- 실험 결과: 1앞면이 나올 확률이 1/2이라도 10번 던지면 6%의 확률로 8번이상 앞면이 나온다.
- p=0.06이다.
- p값이 0.05보다 작으면 0-가설을 기각하는데 0.06이니까 0-가설을 기각 불가다. 즉 0.06정도면 확률이 높으니 8번이상 앞면이 나온 관측은 진리가 아닌 우연이다.
귀무가설
- 귀무가설은 처음부터 기각을 염두에 둔 가설.
- 앞의 예에서는
- 동전 앞면과 뒷면이 나올 확률이 1/2이라고 가정하고 8번이 나올 확률을 계산했다.
- 귀무가설을 어떻게 정하는지에 따라 p-값이 바뀐다 그래서 p-값을 보면 항상 귀무가설이 뭔지 확인해야 한다.
이항분포
- 10번 던지기 1000번 할 필요 없이(즉 실험할 필요 없이),
- 확률분포를 알고있는 경우에는 CDF를 이용해서 p-값을 구할 수 있다.
- 확률분포를 알고있다란?
- 확률분포 유형이랑 그 유형이 필요로 하는 값을 알고있다. 즉 binom이라는거랑 n은 10이고 p는 0.5라는걸 알고있다.
#import numpy as np
#np.random.seed(1000)
#a = np.random.binomial(10, 0.5, 1000) # 실험 할 필요 없다
#sum(1 for x in a if x>=8)
#60
from scipy.stats import binom
n,p = 10, 0.5
10-binom.cdf(7,n,p)
np.float64(9.0546875)
시뮬레이션
- 확률분포를 알기위해서는
- 현상을 분석해서 확률모델로 만들어야함.
- 평균을 가진다고 가정해도되면 정규분포가 되고
- 유전체 빈도처럼 나타나는 횟수에 관련되어있으면 포아송 확률분포 모델을 쓴다.
- 명확한 모델이 나오지 않으면 시뮬레이션을 쓴다.
- 연구 방법론으로 50개 유전자를 찾았을때 30개가 특정 질병에 관련돼있으면
- 얼마나 의미있는 결과인지 보기 위해서는
- 전체 유전자에서 임의로 30개를 뽑는게 아니고
- 전체 유전자에서 임의로 50개를 뽑고 특정 질병과 관련된 유전자가 30개 이상인 경우인지 보기 «를 1000번 정도 하고 몇번인지 세보면 된다.
- 여기서 귀무가설은 “관측은 우연이 아니라 진리다” (관측=이 연구 방법론으로 찾은 50개 중 30개가 특정 질병에 관련됨)
- p-값이 크면 기각이다. 관측은 우연이다.
- 시뮬레이션 방법의 단점은
- p-값이 매우 작기 때문에 많은 실험을 반복해야한다.
- 1000번만 실험하면 0.001 이하의 p-값은 모두 0으로 표시된다. (그래서 p<0.001이라는 표현이 있다 = 0을 저렇게 쓴다는건가?)
- 그리고 연산량이 많다.
- 50개 정도를 돌리는건 괜찮지만 암 유전체에서 발견되는 100만개 유전변이를 각각 시뮬레이션하는것은 불가능하다.
- p-값이 매우 작기 때문에 많은 실험을 반복해야한다.
#
#2 확률 변수와 분포
확률 변수 X
- 값은 모르는데 나올 확률은 x로 정해져있는 변수 X
이항 분포
- p의 확률로 성공하는 일을 n번 시행해서 성공할 확률 x에 대한 분포.
- X~B(10, 0.5)
- 앞면이 나올 횟수 X가 얼마인진 모르겠지만 n=10, p=0.5인 B(이항분포)를 따른다.
- 어떤 유전 변이가 2% 확률로 나타나는데 어떤 질병을 가진사람 1000명을 봤을때 그중 40명이 이 유전변이를 가졌다. 이 유전변이가 질병과 관련 없는데 우연히 일어났을 확률 x의 분포는?
- 0-가설: 유전변이 v는 질병과 상관이없다
- p-값: P(X>=40)
- X~B(1000,0.2)
- 계산해서 p-값이 충분히 작다면 0-가설을 기각하고 유전변이 v가 질병과 상관있다는걸 알수있다.
- 빈도를 확률로 나타낸다.
푸아송 분포
- 빈도를 확률로 나타내는 또다른 방법.
- 유전체 시퀀싱할때 모든 위치가 평균 10번 시퀀싱되도록 하는데
- 어떤 부분이 얼마나 시퀀싱 될지 깊이(depth)가 확률 변수 X라고 하면
- 이 변수는 평균을 10으로 하는 푸아송 분포를 따른다.
- 푸아송 분포는 이항분포로 바꿀수도있는데
- 인간 유전체는 30억쌍이고 깊이 10이면 총 300억개 시퀀싱 데이터가 있고
- 데이터가 특정 1개 위치에 대한 데이터일 확률은 1/30억으로써
- B(300억, 1/30억)으로 표현되는데
- n이 너무 크고 p가 너무 작다. 이럴때 푸아송으로 근사된다고 볼수있다.
#
#3 카이제곱 검정
카이제곱값
- 빈도가 그룹 간 얼마나 다른가?
- 각 X값마다 -> 관측값-기댓값 제곱 / 기댓값 -> 의 합이 카이제곱(x제곱)
카이제곱 분포
- 카이제곱값이 나타날 확률은 카이제곱 분포를 따른다.
- k개의 서로 독립적인 표준 정규 확률 변수를 각각 제곱해서 계산한다. 이때 k는 자유도.
카이제곱 계산
- 카이제곱값을 계산하려면 기대 빈도를 구해야한다.
- 알츠하이머에 걸린 사람 500명(질병군)과 아닌 사람 1500명(대조군)에 대해서 각 유전변이가 나타나는 빈도를 구했음
- -> 유전변이 s1이 질병 100명, 대조군 100명에서 나타났을때 이 빈도는 얼마나 유의할까?
cf) 생각
- 만약 위 케이스가 이항분포 섹션이었다면?
- 알츠하이머에 걸린 사람 500명(질병군)과 아닌 사람 1500명(대조군)에 대해서 각 유전변이가 나타나는 빈도를 구했음
- -> 이 유전변이가 알츠하이머와 상관이 있는지를 구해보자. 여야 할것이고
- -> 분석 케이스가 상관있다 없다 니까
- -> 상관없을때 나타나는 확률 x가 주어졌어야 했을것임
- 카이제곱에서는
- -> 이 빈도가 유의미한지 아닌지이고
- -> 분석 케이스가 유의미하다 아니다 니까
- -> 유의미하지않을때 나타나는 확률 x가 필요함 근데 유의미하지않으면 동등한거니까 이미 1/2로 나와있는 셈.
#
다시 카이제곱 계산
- 유전변이 s1이 질병 100명, 대조군 100명에서 나타났을때 이 빈도는 얼마나 유의할까?
- 일단 기대빈도 구하기
- 2000명 중 200명에 유전변이가 나타난거니까 기대 빈도는 150명, 50명 / 관찰 빈도는 100명, 100명.
- contingency table을 만든다
- 그리고 ‘관측값-기댓값 제곱 / 기댓값’을 구해서 합해준다.
- 카이제곱값은 74.074가 나온다.
- 일단 기대빈도 구하기
카이제곱 검정
- 계산된 카이제곱값은 74.074는 얼마나 유의한 값인가?
- 카이제곱 검정을 하려면 자유도 k가 몇인 카이제곱분포를 따를지 판단해야한다.
n*m표의 관측값을 위한 자유도는(n-1)*(m-1)로 계산한다.
- 그리고 0-가설은 ‘유전변이가 질병과 상관없다’로 놓고 통계 분석을 하면
- p value 계산결과는 7.524E-18로, 유전변이가 질병과 상관없다고 가정한 세상에서는 저 결과가 저 빈도로 나올 확률이 거의 없다.
- 즉 유전변이가 질병과 상관 있다.
#
자유도
- 환자 500명에서 변이 빈도가 100명이면 변이가 없는 빈도는 400이다.
- 100과 400은 2개의 숫자이지만 하나만 자유롭게 바뀔수있고 나머지하나는 하나가 결정되면 결정되어버리는 종속변수다. -> 2-1=1
- 정상인 1500명에서도 동일하다 -> 2-1=1
- 그럼 1+1은 2인가?
- 아님. 총 빈도가 200이기 때문에 정상인 빈도와 환자 빈도 둘중 하나가 또 종속이고
- 그래서 자유도는 1이다.
카이제곱 독립성 검증이 하는일
- 질병의 유무와 유전변이의 유무가 독립적인가?를 검증한다.
#
#출처
책 빅데이터&인공지능 with 생물정보학