통계 모델의 설계식
설계식(design formula)은 관측값의 차이를 어떤 변수들로 설명할지 통계 모델에 알려 주는 표현입니다. ~와 +가 들어가지만 숫자를 계산하는 산술식은 아닙니다.
예를 들어 여러 서버에서 배포 전후의 응답 시간을 측정했다면 다음처럼 쓸 수 있습니다.
latency ~ server + release이 식은 서버마다 원래 다른 응답 시간 기준선을 고려한 뒤, 배포 전후에 공통으로 나타나는 차이를 추정하라는 뜻입니다.
식을 한 조각씩 읽기
섹션 제목: “식을 한 조각씩 읽기”| 조각 | 의미 |
|---|---|
latency | 모델이 설명할 관측값, response 또는 outcome |
~ | 왼쪽 값을 오른쪽 변수들로 설명한다는 구분 기호 |
server | 서버마다 다른 기준선을 설명하는 열 |
+ | 두 수를 더하는 연산이 아니라 두 항을 모델에 함께 넣는다는 표시 |
release | 배포 전후 조건을 설명하는 열 |
server와 release는 formula 문법의 예약어가 아닙니다. 입력 표에 실제로 존재하는 열 이름입니다.
R의 통계 함수는 보통 왼쪽의 관측값과 오른쪽의 설명 변수를 모두 적습니다.
model <- lm(latency ~ server + release, data = observations)Python의 Formulaic, statsmodels 같은 도구도 비슷한 문법을 사용합니다. 어떤 라이브러리는 관측값을 별도 인자로 받기 때문에 오른쪽 부분만 문자열로 전달하기도 합니다.
design = "~ server + release"짝지어진 관측값으로 생각해 보기
섹션 제목: “짝지어진 관측값으로 생각해 보기”서버 두 대에서 배포 전후의 응답 시간을 한 번씩 측정했다고 해봅시다.
| observation | server | release | latency_ms |
|---|---|---|---|
A_before | A | Before | 100 |
A_after | A | After | 80 |
B_before | B | Before | 500 |
B_after | B | After | 480 |
서버 A와 B의 기본 응답 시간은 400ms나 차이 납니다. 그러나 각 서버 안에서는 배포 뒤 응답 시간이 20ms씩 줄었습니다.
server 항은 A와 B의 서로 다른 기준선을 담당합니다. release 항은 그 기준선 차이를 고려한 뒤 두 서버에서 공통으로 반복된 배포 효과를 담당합니다.
개념적으로 모델은 다음 구조를 맞춥니다.
예상 응답 시간 = 전체 기준선 + 서버별 기준선 차이 + 배포 효과~ release만 쓰면 무엇이 달라지나
섹션 제목: “~ release만 쓰면 무엇이 달라지나”design = "~ release"이 설계는 관측값을 배포 전후로만 나눕니다. 어느 Before와 After가 같은 서버에서 나왔다는 정보는 사용하지 않으므로 서버별 기준선 차이가 배포 효과의 오차에 섞입니다.
design = "~ server + release"이 설계는 같은 서버 안에서 조건이 바뀔 때의 차이를 이용합니다. 같은 대상을 여러 조건에서 반복 측정한 paired data에 맞는 표현입니다.
모델 안에서는 범주가 열로 펼쳐진다
섹션 제목: “모델 안에서는 범주가 열로 펼쳐진다”통계 모델은 server와 release라는 글자를 직접 계산하지 않습니다. 범주를 0과 1로 된 열로 바꾼 설계행렬(design matrix)을 만듭니다.
서버가 4대이고 각 서버에서 Before와 After를 한 번씩 측정했다면 관측값은 8개입니다. 기본 intercept 열 하나, 기준 서버를 제외한 server 열 3개, release 열 하나가 생기므로 설계행렬은 8행 5열이 됩니다.
| 설계행렬의 부분 | 담당하는 것 |
|---|---|
| intercept 1열 | 기준 서버의 기준 조건 값 |
| server 3열 | 나머지 서버가 기준 서버와 얼마나 다른지 |
| release 1열 | 같은 서버 안에서 두 조건이 얼마나 다른지 |
formula는 기본적으로 intercept를 포함합니다. ~ 0 + server + release처럼 0을 넣으면 intercept를 없앨 수 있지만 계수의 의미가 달라지므로 목적 없이 바꾸지 않습니다.
기준 범주가 계수의 방향을 정한다
섹션 제목: “기준 범주가 계수의 방향을 정한다”release가 Before와 After라면 어느 범주를 기준으로 삼는지에 따라 계수의 방향이 달라집니다. Before를 기준 범주로 두면 release 계수는 After에서 Before를 뺀 차이입니다.
- 계수
< 0: After의 응답 시간이 더 짧음 - 계수
> 0: After의 응답 시간이 더 김
기준 범주를 After로 바꾸면 부호가 반대로 나옵니다. 분석 코드에서는 기준 범주와 비교 방향을 함께 기록해야 합니다.
식별자처럼 보이는 숫자도 범주일 수 있다
섹션 제목: “식별자처럼 보이는 숫자도 범주일 수 있다”서버 ID가 101, 102, 103처럼 숫자로 보여도 연속 측정값이라는 뜻은 아닙니다. 103번 서버가 101번 서버보다 효과가 2만큼 크다고 해석할 근거가 없다면 문자열이나 categorical 변수로 처리합니다.
숫자형 연속 변수로 넣으면 모델은 ID가 커질수록 관측값이 일정하게 증가하거나 감소한다고 가정합니다.
+, :와 *는 다르다
섹션 제목: “+, :와 *는 다르다”| 식 | 모델에 들어가는 항 |
|---|---|
~ server + release | server 효과와 release 효과 |
~ server:release | server와 release의 상호작용만 |
~ server * release | server, release, 두 변수의 상호작용 |
상호작용은 배포 효과가 서버마다 서로 다른지를 모델링합니다. 각 서버의 각 조건에서 관측값이 하나뿐이라면 서버별 배포 효과까지 따로 추정할 반복 정보가 부족할 수 있습니다.
사례: GSE251845에 적용하면
섹션 제목: “사례: GSE251845에 적용하면”GSE251845에는 대장암 환자 22명의 Tumor와 Normal 조직이 한 쌍씩 있습니다. PyDESeq2는 관측값인 count matrix를 별도로 받으므로 설계식에는 오른쪽 항만 적습니다.
design = "~ patient + condition"이 식은 유전자마다 환자별 기준선을 고려한 뒤, 22쌍에 공통으로 나타나는 Tumor 대 Normal 차이를 추정하라는 뜻입니다. condition의 기준 범주를 Normal로 두면 양의 log2FoldChange는 Tumor에서 더 높은 발현을 가리킵니다.