✨ 시작 질문
“수술을 받을지 말지는 나이 기준으로 결정된다면,
그 기준점 전후의 환자들을 비교해볼 수 있지 않을까?”
어떠한 기준값(cutoff)이 개입 여부를 결정하는 상황이 있다.
이 기준점 바로 앞뒤의 환자들은 나이든, 체질이든, 건강상태든 거의 비슷하다.
하지만 아주 작은 차이로 처치(treatment) 여부가 갈린다.
기준값(cutoff)을 중심으로 처치 여부가 달라진다면, 그 주변의 관측치는 모든 특성은 비슷하지만 단 하나 – 처치 유무만 다르다.
이 상황은 무작위 실험(randomized trial)에 가까워진다.
예:
- 64.9세 → 백신 X
- 65.1세 → 백신 O
- 이 둘의 차이는 백신 유무 외에는 거의 없다.
따라서 결과의 차이는 백신 효과라고 해석할 수 있다.
📌 이게 바로 RDD가 인과추론을 가능하게 해주는 논리적 핵심이다.
👉 바로 이런 상황에서 등장하는 설계가
단절설계(Regression Discontinuity Design, RDD)이다.
🔍 RDD의 기본 아이디어
“문턱값 바로 앞뒤 환자들은 거의 동일하다.”
이 가정을 통해 무작위 할당에 가까운 상황을 만들어
정책이나 처치의 인과효과를 추정하는 것이 RDD의 핵심이다.
👉 유사한 집단 간 비교한다는 점에서, Matching과도 유사한데,
❗ 차이점 요약
항목 | RDD (단절설계) | Matching (매칭) |
비교 방식 | 기준값(cutoff) 기준 전후의 ‘자연적으로 비슷한’ 집단 비교 | 처치군과 비교군 중 유사한 사람을 ‘인위적으로 짝짓기’ |
유사성 보장 방식 | 기준값에 매우 가까우면 유사하다는 가정 (자동적으로 성립) | 사전에 공변량(balance)을 맞춰야 함 (PSM, SMD 등) |
설계 주도 | 설계 설계 중심 (design-based): 데이터 구조에 의존 | 분석 중심 (analysis-based): 공변량을 조정해 효과 추정 |
적용 조건 | 명확한 기준값과 기준점 근처 충분한 표본 | 비교 가능한 관측치가 존재해야 함 |
결과 해석 | Local Average Treatment Effect (LATE) | Average Treatment effect on the Treated (ATT) (대부분) |
- RDD는 자연이 준 무작위성(randomness)을 활용하는 것.
→ “이 선 넘었냐 안 넘었냐” 로 갈리는 기준이 있다는 전제가 핵심이다. - Matching은 인위적으로 유사한 사람끼리 붙여서 실험처럼 만드는 방법이다.
→ “비슷한 조건의 사람을 찾아 짝지어 비교하자”는 접근.
둘 다 장단점이 분명하니, 데이터 구조와 정책 상황에 따라 선택하는 것이 중요하다.
→ 참고로, 실제 연구에서는 Matching + RDD 같이 혼합 기법도 종종 활용된다.
📐 RDD 구조
변수 | 설명 | 예시 |
Running variable (X) | 처치 여부를 결정짓는 기준 변수 | 나이, 수치, 점수 등 |
Threshold (c) | 기준값 | 65세, 140mmHg 등 |
Outcome (Y) | 결과 변수 | 합병증 발생 여부, 치료 효과 등 |
Treatment (T) | 기준 이상이면 1, 미만이면 0 | 처치 여부 |
→ τ: 문턱점에서의 불연속 효과, 즉 인과 추정치
📊 어떻게 분석할까? – RDD의 기본 회귀 구조
RDD는 무작위 실험처럼 설계된 구조를 회귀 분석으로 구현한다.
그 핵심은 기준값(cutoff)을 중심으로 두 개의 회귀선을 따로 그리는 것이다.
예를 들어, 기준값이 65세라면 이렇게 나뉜다:
- 기준 미만 집단 (X < 65):
→ 식: Y = α₀ + β₀·X + ε
→ 결과 Y를 Running Variable(X)을 이용해 회귀 - 기준 초과 집단 (X ≥ 65):
→ 식: Y = α₁ + β₁·X + ε
→ 또 다른 회귀선을 적합
이렇게 각각의 선형 회귀를 기준값(cutoff)에서 외삽(extrapolate)하면,
두 선이 만나는 지점에서의 예측값 차이가 바로 처치의 인과효과(τ)이다.
📌 수식 정리:
즉, 기준값을 기준으로 좌우의 예측값 차이가 바로 우리가 추정하고자 하는 인과효과다.
이 구조는 단순 선형회귀로 구현할 수도 있고,
보다 정교하게는 로컬 선형회귀(Local Linear Regression), 다항 회귀, Spline 등을 사용하기도 한다.
✅ Sharp vs Fuzzy RDD
구분 | 정의 | 예시 |
Sharp RDD | 기준값을 기준으로 완전히 결정적인 처치 규칙이 있는 경우. 기준 이상이면 반드시 개입, 기준 미만이면 반드시 비개입. |
혈압이 140 이상이면 무조건 약 처방, 미만이면 절대 처방 안 함 |
Fuzzy RDD | 기준값을 넘었다고 반드시 처치를 받는 것이 아닌 경우. 실제 처치는 기준값뿐 아니라 다른 요소(의사 재량, 환자 선택 등)에도 영향받음. |
HbA1c가 6.5 이상이지만 의사가 처방을 보류하거나, 6.4인데도 의사가 조기 개입하는 경우 |
📌 그래서 어떻게 분석해야 할까?
- Sharp RDD는 단순한 회귀불연속 분석으로도 인과효과 추정이 가능하다.
- 하지만 Fuzzy RDD는 기준점이 실제 처치를 완전히 결정해주지 않기 때문에,
→ “처치 자체는 내생적(endogenous)이 된다.”
👉 이럴 땐 기준점 도달 여부를 도구변수(IV)로 활용해서 2단계 최소제곱법 (2SLS) 등으로 효과를 추정해야 한다.
즉,- 1단계: 기준 이상 여부(=도구변수)로 처치를 예측
- 2단계: 예측된 처치값으로 결과(outcome)를 설명
결과적으로 Fuzzy RDD는 도구변수 설계에 기반한 국소 인과추정 방법이라고 이해할 수 있다.
🏥 임상 사례들
예시 | 설명 |
예방접종 연령 기준 | 65세 이상 고위험군만 무료 접종 → 65세 직전과 직후 비교 |
당뇨 진단 기준 HbA1c | 6.5 이상이면 약 처방 → 6.4 vs 6.5 환자 비교 |
BMI 기준 수술 적응증 | 30 이상이면 수술 권고 → 29.9 vs 30.1 비교 |
📌 핵심은 기준값(cutoff)이 개입 여부를 결정하고, 그 주변의 사람들은 상당히 유사한 특성을 가진다는 점이다.
이로 인해 RDD는 자연발생적인 무작위 배정을 모사하는 준실험이 가능해진다.
📌 이들 사례의 공통점:
환자 특성이 거의 유사한데,
‘작은 차이’로 처치 여부가 결정됨 → 준실험적 환경 형성
📈 시각적으로 이해하기
Outcome
↑
│ ● treated
│ /
│ /
│ /
│ /
│--------------● cutoff (discontinuity)
│ /
│ /
│ ● control
└────────────────────────→ Running Variable (e.g., age)
- 기준점(c)에서 Y가 ‘뚝’ 떨어지거나 ‘튀면’ → 정책/처치의 인과효과가 있다고 본다.
🧨 DiD와는 뭐가 다를까?
항목 | DiD | RDD |
비교 기준 | 시간 & 집단 | 기준값 전후 |
핵심 가정 | 병렬 추세 | 기준점 인접자는 유사 |
필요 데이터 | 전후 비교 가능한 집단 2개 이상 | 기준점 전후 연속적 데이터 |
효과 해석 | 평균 효과 | 문턱 부근의 국소 효과 (Local Average Treatment Effect, LATE) |
📌 RDD는 좁은 구간의 효과만 추정함.
전체 환자에게 일반화하면 안 됨.
📌 RDD 적용 전 체크: 진단과 설계 검토
단절설계(RDD)는 기준점 전후의 국소적인 효과를 추정한다는 장점이 있지만, 아무 상황에서나 적용할 수 있는 건 아니다. 실무에서 RDD의 타당성을 높이기 위해 아래와 같은 진단 및 사전 점검을 반드시 거쳐야 한다.
1. Running Variable의 분포 시각화
기준값(cutoff)을 기준으로 running variable이 조작되지 않았는지를 확인해야 한다.
예를 들어, 의사가 진단 수치를 조작하거나 환자가 수치 조작을 시도했다면, RDD의 핵심 전제가 무너진다.
📊 예시 코드:
import seaborn as sns
import matplotlib.pyplot as plt
# running variable 히스토그램
sns.histplot(df['age'], bins=30, kde=False)
plt.axvline(x=65, color='red', linestyle='--')
plt.title("Running Variable Distribution (Age)")
plt.xlabel("Age")
plt.ylabel("Count")
plt.show()
2. 공변량 균형 검정 (Covariate Balance)
RDD는 기준점 전후의 환자들이 기본 특성(나이, 성별, 만성질환 유무 등)에서 유사해야 한다는 전제가 있다.
이를 검정하기 위해 covariate balance test를 수행해야 한다.
📌 방법:
- 기준점 ± bandwidth 범위로 데이터를 자르고,
- 주요 공변량별 평균 차이를 검정 (t-test 또는 SMD 사용)
📊 예시 코드:
# 나이 65 기준으로 잘라서 공변량 평균 비교
df['above_cutoff'] = (df['age'] >= 65).astype(int)
df.groupby('above_cutoff')[['sex', 'bmi', 'diabetes']].mean()
3. Manipulation Test (McCrary Test)
Running variable 주변의 빈도가 인위적으로 치우쳐 있다면, 조작 가능성을 시사한다.
이를 확인하는 대표적인 통계 기법이 McCrary Density Test다.
📌 R에서 rddensity 패키지, Python에서는 statsmodels 또는 econml에 구현 가능성 있음.
4. Bandwidth 선택 자동화
📏 Bandwidth란?
Bandwidth는 기준값(cutoff) 주변에서 얼마나 넓은 범위의 데이터를 포함할지를 결정하는 값이다.
쉽게 말해, 분석에 사용할 환자 범위의 폭을 의미한다.
📌 예를 들어:
- 기준값이 65세라면,
- bandwidth = 1이면 64–66세 환자만 사용
- bandwidth = 5이면 60–70세까지 확대
📌 좁은 bandwidth
- 기준점과 더 유사한 사람들만 사용
- Bias는 작지만 표본 수가 부족 → 분산↑, 불안정
📌 넓은 bandwidth
- 데이터는 많지만 기준점과 거리가 멀어짐
- 표본 수는 많지만 효과 추정이 왜곡될 수 있음 (Bias↑)
Bandwidth는 분석 결과에 매우 민감하기 때문에, 연구자가 임의로 정하면 안 되고 자동 최적화 기법을 활용하는 것이 권장된다.
📌 대표 알고리즘:
- Imbens-Kalyanaraman bandwidth
- Calonico-Cattaneo-Titiunik (CCT)
Python에서는 rdd 패키지 또는 rddtools 활용 가능.
🧪 실전 적용 요령
① 기준 변수(X)가 연속적이어야 한다
→ 조작이 불가능해야 함 (예: 나이는 조작 불가, 점수는 조작 가능성 있음)
② 충분한 표본이 있어야 한다
→ 기준점 양옆에 일정 수 이상 환자가 있어야 추정 안정
③ 적절한 bandwidth 설정
→ 기준점 주변 몇 % 범위를 쓸 것인지 결정 (보통 ±5~10%)
④ Local Linear Regression 사용
→ 기준점 근처에서 선형 회귀 수행
🧪 Python 실습 예시
import pandas as pd
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
# 예시: 나이 기준으로 예방접종 여부와 질병 발생 비교
df = pd.DataFrame({
'age': [64.5, 64.8, 65.1, 65.3, 65.6, 64.6, 65.0, 65.4],
'treatment': [0, 0, 1, 1, 1, 0, 1, 1],
'outcome': [1, 0, 0, 0, 1, 1, 0, 0] # 질병 발생 여부
})
# Running variable: age, Threshold: 65
df['above_cutoff'] = (df['age'] >= 65).astype(int)
# Fuzzy RDD 방식으로 IV 추정
model = smf.ols('outcome ~ above_cutoff + age', data=df).fit()
print(model.summary())
🧪 시각화 예시
plt.scatter(df['age'], df['outcome'], label='Patient')
plt.axvline(x=65, color='gray', linestyle='--', label='Cutoff: Age 65')
plt.xlabel('Age')
plt.ylabel('Outcome (Disease)')
plt.title('RDD Visualization')
plt.legend()
plt.grid(True)
plt.show()
🧨 RDD vs IV vs DiD 3자 비교
항목 | RDD | IV | DiD |
설계 방식 | 기준값 전후의 불연속 비교 | 외생적 변수(Z)로 처치 예측 | 시점 전후 + 처치군/비교군 비교 |
주요 가정 | 국소 무작위성 (연속성 가정) | Relevance & Exclusion Restriction | 병렬 추세 (Parallel Trends) |
추정 효과 | 문턱값 인근의 LATE | complier 하위집단의 LATE | 평균 효과 (ATE 또는 ATT) |
해석 범위 | 매우 지역적 (local) | 도구변수 반응집단 | 평균적인 정책 효과 |
활용 상황 | 점수 기준, 나이 기준 정책 | 병원 거리, 제도변화, 의사 스타일 | 정책 시행 전후의 변화 평가 |
⚠️ 현실적 제약 및 해석 주의점
1. 효과는 국소(Local)에만 유효함
- RDD는 cutoff 근처의 ‘매우 유사한 집단’에 대한 효과만 추정
- 전체 인구(ATE)로 외삽하면 해석 오류 발생 가능
2. Bandwidth 민감성
- Bandwidth를 넓히면 bias 증가, 좁히면 분산 증가
- Robustness check로 다양한 bandwidth로 반복 실험 필요
3. 시각화 민감성
- Lowess smoothing의 매개변수에 따라 시각적 해석이 달라짐
- 선형 vs. 비선형 회귀 선택에 따른 차이도 고려해야 함
📌 실무자가 기억할 최종 요약
항목 | 체크 포인트 |
기준값 존재 여부 | 명확한 문턱값(cutoff)이 있는가? |
조작 가능성 | Running variable이 인위적으로 변경될 가능성은? |
공변량 균형 | 기준점 전후의 기본 특성이 유사한가? |
Bandwidth | 적절한 범위 설정이 되었는가? 자동 선택인가? |
효과 해석 | Local 효과만으로 일반화하고 있지 않은가? |
Robustness Test | 다양한 cutoff, bandwidth로 결과가 일관되는가? |
✅ 정리
항목 | 설명 |
RDD 정의 | 문턱값을 기준으로 개입 여부가 갈리는 상황에서 인과효과를 추정 |
핵심 조건 | 문턱값 근처 환자들이 유사하며, 처치 여부는 기준값에 의해 결정됨 |
장점 | 무작위 실험에 준하는 설계, 관측 데이터로도 적용 가능 |
단점 | 전체 모집단이 아닌 ‘경계 부근’만 분석 가능, 설계 조건이 엄격 |
'실전 인과추론' 카테고리의 다른 글
《실전 인과추론 시리즈 ⑥ - Marginal Structural Models(MSM) 해부하기》 (0) | 2025.05.14 |
---|---|
《실전 인과추론 시리즈 ⑤ - G-Computation 해부하기》 (1) | 2025.05.13 |
《실전 인과추론 시리즈 ③ - Difference-in-Differences, DiD 해부하기》 (1) | 2025.05.11 |
《실전 인과추론 시리즈 ② - Instrumental Variable(도구변수) 해부하기》 (0) | 2025.05.08 |
《실전 인과추론 시리즈 ① - PSM, IPTW 해부하기》 (2) | 2025.05.06 |