LITTLE BY LITTLE

[4-1] 실무로 통하는 인과추론 with 파이썬 - 4장. 유용한 선형회귀 본문

데이터 분석/인과추론

[4-1] 실무로 통하는 인과추론 with 파이썬 - 4장. 유용한 선형회귀

위나 2024. 5. 9. 22:06

 


목차

<4장. 유용한 선형회귀>

4.1 선형회귀의 필요성

4.1.1 모델이 필요한 이유

4.1.2 A/B테스트와 회귀분석

4.1.3 회귀분석을 통한 보정

4.2 회귀분석 이론

4.2.1 단순선형회귀

4.2.2 다중선형회귀

4.3 프리슈-워-로벨 정리와 직교화

4.3.1 편향 제거 단계

4.3.2 잡음 제거 단계

4.3.3 회귀 추정량의 표준오차

4.3.4 최종 결과 모델

4.3.5 FWL 정리 요약

4.4 결과 모델로서의 회귀분석

4.5 양수성과 외삽

4.6 선형회귀에서의 비선형성

4.6.1 처치 선형화

4.6.2 비선형 FWL과 편향 제거

4.7 더미변수를 활용한 회귀분석

4.7.1 조건부 무작위 실험

4.7.2 더미 변수

4.7.3 포화회귀모델

4.7.4 분산의 가중평균과 회귀분석

4.7.5 평균 제거와 고정효과

4.8 누락 변수 편향

4.9 중립 통제변수

4.9.1 잡음 유발 통제변수

4.9.2 특성 선택: 편향-분산 트레이드오프

4.10 요약


이번 장에서는 중요한 편향 제거 기법인 1. 선형 회귀, 2. 최소 제곱법(OLS), 3. 직교화를 다루고, 선형 회귀에서 비롯된 개념인 4. 처치 직교화라는 개념을 배운다. 이 개념은 인과추론에 머신러닝 모델을 사용할 때 유용하게 쓰임


4.1 선형회귀의 필요성

  • 회귀분석은 인과추론의 핵심이자 가장 많이 사용되는 방법으로, 
    1. 대부분의 패널 데이터 방법 이중차분법(DID),
    2. 이원고정효과(TWFE, Two-way fixed effects 모델),
    3. 머신러닝 방법(이중/편향 제거 double/debiased 머신러닝
    4. 다른 식별 기법(도구변수, 불연속 설계 discontinuity design) 등 응용방법론의 주요 구성요소이기도 하다.

4.1.1 모델이 필요한 이유


✅ EX. 신용카드 한도가 채무 불이행률에 영향을 미칠까?

T와 Y에는 공통원인 '위험도'가 존재하고, '위험도'를 추정하기 위한 대리 변수 X가 존재하는 구조

  • 실제 은행 데이터를 살펴보면 신용 한도(T)와 채무불이행률(Y) 사이에는 음의 상관관계가 있다. 
  • 은행에서는 자체 심사 모델에 따라 채무 불이행 가능성(Y)이 낮다고 판단되는 고객에게 더 높은 신용 한도(T)를 설정한다. 
  • 즉, 여기에서의 음의 상관관계는 '교란편향'의 영향 때문 (*교란편향: T와 Y의 공통원인때문에 발생하는 편향)
  • T와 Y의 공통 원인이 되는 고객의 채무 불이행에 대한 고유 위험인 '위험도'를 알 수 없기 때문에, 대리 변수 X로 이를 추정
  • 대리 변수를 활용하여 T가 무작위로 배정된 것처럼 보정하는 방법을 이전 장에서 배움

조건부 독립성 가정을 활용한 보정 공식

 

그러나. 이 보정 공식을 그대로 적용하면, 상황이 나빠질 수 있다.

 

차원의 저주(curse of dimensionality)

: 위와 같은 보정 공식을 적용하기 위해서는 데이터를 변수 X에 따라 여러 그룹으로 나눠야 하는데, 여기서 변수가 10개 있고 변수마다 3개의 그룹이 있다고 할 때, 3^10개의 셀마다 ATE를 추정하고 각 결과의 평균을 구해야 하기에 엄청난 양의 데이터가 필요해지는 상황을 말한다.

*특성(feature)=공변량=독립변수(X)

*가중치(weight)=매개변수=계수

*목표(target)=결과=종속변수(Y)

  • 차원의 저주 때문에 공변량이 많을 때 보정 공식을 그대로 적용하면 '데이터 희소성' 문제를 겪을 수 있음
  • 차원의 저주를 해결하기 위해서는 '잠재적 결과를 선형회귀 같은 방식으로 모델링할 수 있다'고 가정하고, X로 정의된 각각의 셀을 내삽(interpolate)하고 외삽(extrapolate)하는 것
  • 즉, 선형회귀 분석차원 축소 알고리즘으로 생각하는 것
  • 결과 변수를 X변수로 투영한 후, 이 투영된 값을 바탕으로 실험-대조군을 비교

4.1.2 A/B테스트와 회귀분석


✅ EX. 새로운 추천 시스템(T)이 스트리밍 서비스의 시청 시간(Y)을 늘릴 수 있을까?

  • 추천 시스템(T)를 1/3을 대상으로 무작위로 사용하게 한 뒤, 한달 후 하루 평균 시청 시간(watch_time)을 수집한 데이터
  • 새로운 추천 시스템(T=1)이 challenger, 기존의 추천 시스템(T=0)이 benchmark이다.

 

이 경우, 처치가 무작위로 배정되었으므로, 단순 Y의 비교만으로 ATE를 알 수 있다.

그러나, 통계적 유의성 확인을 위해 표준 오차를 계산하여 신뢰구간을 구하는 번거로운 과정이 필요했었다.

A/B테스트 결과를 회귀분석으로 해석하면, 필요한 모든 추론 통계량을 얻을 수 있다.

  • statsmodels 패키지 API 이용, 모델 추정에는 .fit() 메소드를, 결과를 불러오는 데에는 .summary() 메소드 사용
import statsmodels.formula.api as smf

result = smf.ols('watch_time ~ C(recommender)', data=data).fit() # 범주형 변수는 C(..)로 묶어주기
result.summary().tables[1]

  • challenger: 새로운 추천 시스템이 적용되면 1, 그렇지 않으면 0이다.
  • β1 : 추천 시스템의 효과, 즉 ATE에 대한 추정값
    • β1 = 0.14: 새로운 추천 시스템(T)이 평균적으로 하루 시청 시간(Y)을 0.14시간 정도 늘렸다.
  • Intercept(β0): 절편으로, 모델의 다른 변수가 0일 때 결과의 기댓값, 즉 대조군의 평균 결괏값
    • Intercept = 2.04: 기존 버전 추천시스템을 사용했을 때 고객이 하루 평균 2.04시간 동안 스트리밍 콘텐츠를 시청한다는 의미

*patsy 라이브러리 참고(R스타일 수식으로 특성 엔지니어링을 할 수 있음)

처치여부에 따른 시청 시간(Y) 확인

(data
 .groupby("recommender")
 ["watch_time"]
 .mean())
recommender
benchmark     2.049064
challenger    2.191750
Name: watch_time, dtype: float64
  • 대조군의 Y값 평균이 여기에서는 절편과 동일하다.
  • challenger(T=0)의 Y값 2.19에서 benchmark(T=1)의 Y값 2.04를 빼면, 0.1427이 나와 회귀 모델에서의 β1과 동일하다.

4.1.3 회귀분석을 통한 보정

 

✅ EX. 신용카드 한도(T)가 채무 불이행률(Y)에 영향을 미칠까?

예제로 돌아가서, T와 Y의 공통원인(C)인 '위험도'를 측정하기 위한 대리 변수를 나열

위험도(C)를 측정할 수 있는 대리 변수(=신용 가치를 나타낼 수 있는 고객 특성들)

: 월급(wage), 경력(exper), 혼인 여부(married), 신용 평가 기관에서 제공하는 다양한 신용 점수(credit_score) 

처치(T) : credit_limit(신용카드 한도)결과(Y) : default(채무 불이행 여부)

 

처치인 credit_limit이 너무 많은 범주를 포함하기 때문에, 범주형이 아닌 연속형 변수로 처리처치가 연속형일 때에는 ATE를 처치 수준 간의 차이가 아닌, 기대 결과의 처치에 대한 도함수로 표현

T가 한 단위 변화할 때, Y의 기댓값

ATE = 신용 한도가 1달러 증가했을 때 채무불이행률이 얼마나 변할지에 대한 기댓값

→ 이렇게 도함수로 표현된 ATE를 추정하기 위해서 회귀분석 수행

 추정된 β1(^)은 신용 한도(T) 1달러가 증가할 때 채무불이행률(Y)가 얼마나 변할지에 대한 기댓값

* β1(^)  = 베타1햇

model = smf.ols('default ~ credit_limit', data=risk_data).fit()
model.summary().tables[1]

→  β1(^) = -2.4

→  교란으로 인해(*위험이 적은 고객에게(C) 더 높은 한도(T)를 주는 경향) 음의 추정값을 얻게 됨.

 

시각화 해보면 음의 추세가 명확하게 보임

plt_df = (risk_data
          .assign(size=1)
          .groupby("credit_limit")
          .agg({"default": "mean", "size":sum})
          .reset_index()
          .assign(prediction = lambda d: model.predict(d)))

plt.figure(figsize=(10,4))

sns.scatterplot(data=plt_df,
                x="credit_limit",
                y="default",
                size="size",
                sizes=(1,100))

plt.plot(plt_df["credit_limit"], plt_df["prediction"], color="C1")
plt.title("Default Rate by Credit Limit")

이 편향을 보정하려면,

  1. 데이터를 나누고
  2. 나눈 그룹 내에서 채무불이행률(T)을 신용 한도(Y)에 회귀하고,
  3. 기울기 매개변수 추출을 통해 결과(Y)의 평균 구하기

그러나, 차원의 저주로 인해 교란 요인을 두 가지(credit_score1,2)만 고려했음에도 불구하고 표본이 1개인 셀이 존재

 교란 요인으로 groupby해서 표본 개수 세보기

risk_data.groupby(["credit_score1", "credit_score2"]).size().head()
credit_score1  credit_score2
34.0           339.0            1
               500.0            1
52.0           518.0            1
69.0           214.0            1
               357.0            1
dtype: int64
formula = 'default ~ credit_limit + wage+credit_score1+credit_score2'
model = smf.ols(formula, data=risk_data).fit()
model.summary().tables[1]

 

회귀분석을 통해 차원의 저주를 해결할 수있다.

→   교란 요인을 직접 보정하는대신, OLS로 추정할 모델에 교란 요인 추가하기  

세타 X로 교란 요인 추가

신용점수1,2를 교란요인으로 회귀 모델에 추가하면,

θ (장애모수): 

장애 모수 세타는 해당 교란요인과 관련된 매개변수의 벡터 (베타랑 똑같이 작동)

  • 교란요인이기에, 당연히 이 매개변수의 인과관계 해석에 크게 신경쓰지 않아도 됨 

  • 처치가 연속 변수일 때, E[ y | t, X] 대신 위의 모델을 구함
  • 이 모델을 신용 한도(T)에 대해 미분하면, 미분한 결과는 β1이 된다. 
  • β1: 신용 한도(T)에 대한 채무 불이행률(Y) 기댓값의 편도함수
  • 즉, 모델의 다른 모든 변수가 고정된 상태에서 신용 한도(T)를 조금 늘렸을때 채무불이행률(Y)이 얼마나 변할지에 대한 기댓값 

회귀분석이 교란 요인을 어떻게 보정할 수 을까?→  회귀모델에 교란 요인을 추가함으로써, T와 Y사이의 관계를 추정하는 동안 교란 요인을 고정하는 것

 

회귀식에 교란 요인 추가하기

formula = 'default ~ credit_limit + wage+credit_score1+credit_score2'
model = smf.ols(formula, data=risk_data).fit()
model.summary().tables[1]

 

→ T와 Y사이의 관계가 양수( β1(^) =3.063e-06 ) 으로 바뀐 것을 확인할 수 있다. 

→ 추정된 베타가 작게 나온 이유는, 신용 한도(T)는 1,000 단위이고 채무불이행 여부(Y)는 0또는 1이기 때문

따라서 신용 한도를 1달러씩 늘렸을 때 채무불이행률이 증가하는 정도는 아주 작을 것


4.2 회귀분석 이론

  • 여기에서  β*를 매개 변수 벡터(이전의 세타)라고 하자.
  • 선형회귀분석은 MSE(Mean Squared Error)를 최소화하는 매개변수를 찾는다.
  • 이를 미분하고, 그 결과를 0으로 두면, 이 문제에 대한 선형 해(solution)은 다음과 같다.

표본을 통해 다음과 같이 회귀계수 추정

 

OLS의 대수적 해를 사용해서 앞 모델의 매개변수 추정하기

X_cols = ["credit_limit", "wage", "credit_score1", "credit_score2"]
X = risk_data[X_cols].assign(intercep=1)
y = risk_data["default"]

def regress(y, X): 
    return np.linalg.inv(X.T.dot(X)).dot(X.T.dot(y))

beta = regress(y, X)
beta
array([ 3.06252773e-06, -8.82159125e-05, -4.17472814e-05, -3.03928359e-04,
        4.03661277e-01])

 

→ statsmodels의 ols 함수를 사용하여 모델을 추정할 때 얻은 값과 동일하다. (β1(^)=3.063e-06 )

assign() 메소드: 새로 만든 열을 전달하여 새로운 데이터 프레임을 반환하는 기능


4.2.1 단순선형회귀

 

인과추론에서는 변수 T가 Y에 미치는 인과효과를 추정하는 경우가 많기에, 단순선형회귀분석을 통해 이 효과를 추정할 수 있다.

단일 설명변수 T를 사용할 때 관련된 매개변수

T와 Y에 대한 공분산을 T의 분산으로 나눔으로써 얻을 수 있는 매개수

  • 공식을 보고, 회귀 분석이 어떤 역할을 하는지 알 수 있다. 회귀분석T와 Y가 어떻게 함께 움직이는지(=분자의 공분산) 파악하고, 이를 처치 대상에 따라 조정
  • T가 무작위로 배정된 경우 β1 = ATE와 동일하다.

* 공분산: 점곱(dot product)와 밀접한 관련이있다. 공분산/분산 공식에서 X'X가 분모 역할을, X'y가 분자역할을 함

 


4.2.2 다중선형회귀  

프리슈-워-로벨 정리(FWL, Frisch-Waugh-Lovell)와 관련

: 편향을 제거하는 전처리 단계에서 사용할 수 있는 고급 편향 제거 기법

(EX. 신용 한도(T)가 다른 사업 지표(Y)에도 영향을 미치는가?)

  • 설명변수가 2개 이상일 때에는 단순선형회귀분석을 확장하면 됨
  • 다른 변수는 보조적인 변수일뿐이고, 관심있는 부분은 T와 관련된 매개변수 τ (타우)를 추정하는 것으로 생각했을 때,

 

  • Ti(~): Ti를 모든 공변량 X1i+...Xki 에 대해 회귀한 잔차(residual)
  • 즉, 다중회귀분석의 회귀계수는 모델의 다른 변수들의 효과를 고려한 후 얻은 동일 설명변수(T)의 이변량 계수
  • 다른 변수를 사용하여 T를 예측할 수 있다면, T는 무작위가아니다.
  • 따라서 다른 변수(모든 교란 요인) X를 통제하면, T를 무작위처럼 보이게 할 수 있는 것

①선형회귀분석을 사용하여 교란 요인X에서 T를 예측한 다음, ②T에서 해당 회귀에 대한 잔차인 T(~)를 빼주면 된다.

(T를 예측하는데 이미사용한 변수 X를 이용해서는 T(~)를 예측할 수 없기 때문)  

→ 즉, T(~)는 X의 다른 변수와 연관이 없는 버전의 또다른 T가 되는 것

→ 이 부분이 바로 FWL(프리슈-워-로벨 정리)이다.


4.3 프리슈-워-로벨 정리와 직교화

 

FWL 스타일의 직교화가장 먼저 사용할 수 있는 편향 제거 기법이다.  

* 편향 제거 단계 = 직교화(orthogonalization) = 잔차화(residualization)

→ 비실험 데이터를 T가 무작위 배정된 것처럼 보이게 함

FWL 정리에 따르면, "다중선형회귀분석은 한 번에 추정하거나 세 단계로 나누어 추정할 수 있다."

 

채무불이행률(Y, default)를 credit_limit, wage, credit_score1, credit_score2에 대해 회귀해보자

formula = 'default ~ credit_limit + wage+credit_score1+credit_score2'
model = smf.ols(formula, data=risk_data).fit()
model.summary().tables[1]

 

위와 같이 회귀하지 않고, FWL 정리에 따라 인과효과 추정 과정을 세 단계로 나누면,

  1. 편향 제거 단계: T를 교란 요인 X에 회귀하여 처치 잔차 T^ = T - T^ 구하기
    • 교란 요인(X)으로부터 신용 한도(T)를 예측하는 회귀모델을 적합시키는 과정
  2. 잡음 제거 단계: Y를 교란요인 X에 회귀하여 결과 잔차 Y^ = Y - Y^ 구하기
    • 처치(T)로부터 결과(Y)를 예측하는 회귀모델을 적합시키는 과정
    •  
  3. 결과 모델 단계: 결과 잔차 Y(~)  처치 잔차 T(~)에 회귀하여 T가 Y에 미치는 인과효과 추정값 구하기
    • 처치 잔차(T~)로부터 결과 잔차(Y~)를 예측하는 회귀모델을 적합시키는 과정

→ FWL 정리는 이 인과효과 추정 단계회귀 모델본질적으로 같음을 보여줌

→ 또한, 선형회귀의 편향 제거 구성 요소를 분리할 수 있음을 보여줌

 

위의 세 단계를 자세히 살펴보자.


4.3.1 FWL 편향 제거 단계 (T~X)

  • 예제로 돌아가면, 교란편향의 영향으로 신용 한도에 따라 채무불이행률이 감소하는 추세를 보였었음
  • FWL 정리에 따르면, 교란 요인(X)으로부터 신용 한도(T)를 예측하는 회귀 모델을 적합시켜 처치 잔차 T(~)를 구하여 데이터의 편향을 제거할 수 있었음

처치 잔차 T(~)

 

  • 처치 잔차T(~)는 편향 제거 모델에 사용된 변수와 상관관계가 없는 버전의 처치 (←Y를 생성한 변수와 직교하기 때문)

처치 잔차를 구하고, 필요에 따라 평균 처치를 다시 추가할 수 있다.

 

편향 제거 단계(처치잔차 구하기)

: X(교란요인, wage+credit_score1+credit_score2)T(처치, credit_limit) 에 회귀하기

debiasing_model = smf.ols(
    'credit_limit ~ wage + credit_score1  + credit_score2',
    data=risk_data
).fit()

risk_data_deb = risk_data.assign(
    # 시각화를 위해 avg(T) 를 잔차에 추가하기
    credit_limit_res=(debiasing_model.resid 
                      + risk_data["credit_limit"].mean())
)

 

결과 변수 Y(default)를 편향 제거된 debiasing_model의 T(~)인 credit_limit_res에 회귀하면, 편향 제거 모델에 사용된 교란 요인을 통제하면서, T가 Y에 미치는 영향을 파악할 수 있음

model_w_deb_data = smf.ols('default ~ credit_limit_res',
                           data=risk_data_deb).fit()

model_w_deb_data.summary().tables[1]

  • p값이 이전( -2.17e-05 )보다 높다.
  • 그 이유는, 분산 감소를 담당하는 잡음 제거(denoising) 단계를 거치지 않았기 때문
  • 하지만, 편향 제거 단계만 적용하더라도 모든 교란 요인이 모델에 포함된다면, T가 Y에 미치는 인과적 영향에 대해 편향되지 않은 추정값을 얻을 수 있음

편향 제거된 T와 Y를 시각화해보자.

plt_df = (risk_data_deb
          .assign(size=1)
          .assign(credit_limit_res = lambda d: d["credit_limit_res"].round(-2))
          .groupby("credit_limit_res")
          .agg({"default": "mean", "size":sum})
          .query("size>30")
          .reset_index())

plt.figure(figsize=(10,4))
sns.scatterplot(data=plt_df,
                x="credit_limit_res",
                y="default",
                size="size",
                sizes=(1,100))

plt.title("Default Rate by Debiased Credit Limit")

 

편향 제거된 신용 한도(T)에 따른 채무불이행률(Y)

 

→ 편향되었을 때와 달리, 두 변수(T,Y)의 관계가 하향선을 그리지 않는다.


✅ 또 다른 회귀계수 공식

: 처치를 잔차화한다는 것을 이용해서 회귀계수 공식을 작성해보면,

단순선형회귀 회귀계수 식
다중선형회귀 회귀계수 식


4.3.2  FWL  잡음 제거 단계 (Y~X)

 

  • 잡음 제거 단계로 처치 효과의 추정값을 바뀌지 않지만, 분산을 줄일 수 있다.
  • 이 단계에서는 결과 Y를 T가 아닌 공변량(X)에 대해 회귀하여 결과 잔차 Y(~)를 얻음
  • 여기에서도 시각화 목적으로 잡음이 제거된 Y 변수에 평균Y를 더할 수 있다.

denoising_model = smf.ols(
    'default ~ wage + credit_score1  + credit_score2',
    data=risk_data_deb
).fit()

risk_data_denoise = risk_data_deb.assign(
    default_res=denoising_model.resid + risk_data_deb["default"].mean()
)

4.3.3 회귀 추정량의 표준오차

 

② 잡음 제거 단계(Y~X)에서의 잡음과 관련된 회귀 표준오차의 계산법

ε(^) : 회귀 모델의 잔차 

DF: 모델의 자유도(추정하는 매개변수의 수)

표준오차를 코드로 확인해보자

1. 분자 - ε(^) 회귀 모델의 잔차 

model_se = smf.ols(
    'default ~ wage + credit_score1  + credit_score2',
    data=risk_data
).fit()

print("SE regression:", model_se.bse["wage"])

> SE regression: 5.364242347548197e-06

 

결과를 잘 예측할 수록 잔차가 작아지므로, 추정값의 분산이 낮아진다. 

T가 Y를 많이 설명하면, 매개변수 추정값의 표준오차도 작아짐 (오차는 잔차에 비례)

 

2. 분모 

model_wage_aux = smf.ols(
    'wage ~ credit_score1 + credit_score2',
    data=risk_data
).fit()

# 모델의 자유도 N - 4
se_formula = (np.std(model_se.resid)
              /(np.std(model_wage_aux.resid)*np.sqrt(len(risk_data)-4)))

print("SE formula:   ", se_formula)

> SE formula:    5.364242347548201e-06

 

오차는 잔차화된 T의 분산에 반비례한다.

→ 직관적으로 생각했을 때, T가 많이 바뀌면, 그 영향을 측정하기 더 쉬워지기 때문


✅ 연속형 처치를 이용한 실험

 

표준 오차를 근사하여 회귀분석에서 매개변수 추정값으로 효과를 측정하고자 하는 실험을 설계할 때 유용하게 쓰인다.

 

단순 선형회귀에서는 y의 분산이 잔차의 분산보다 크기에, 보수적인 근삿값을 얻게 된다.

→ T가 Y의 일부를 설명할 수도 있어서 오차가 작아 잔차화된 T의 분산이 큰 것

(*오차는 T의 분산에 반비례)

근사 후 2장에서 배웠던 표본 크기 계산 공식에 사용

 

2장에서 배웠던 표본 크기 계산 공식에 이 근사한 표준오차(SE)를 입력하면 된다.

*실험 설계 시 T에서 표본 분포를 선택해야 하므로 복잡해질 수 있다. (T의 분산이 표준오차에 영향을 줄수 있기 때문)


4.3.4 FWL ③ 최종 결과 모델

: 두 단계로 구한 잔차 Y(~)를 T(~)에 대해 회귀하기

model_w_orthogonal = smf.ols('default_res ~ credit_limit_res',
                             data=risk_data_denoise).fit()

model_w_orthogonal.summary().tables[1]

 

위와 같이 신용 한도(T)와 다른 모든 공변량(X)를 사용하여 회귀했을 때와 편향 제거 단계에서 얻은 매개변수 추정값과 같다.

(②는 단지 분산을 줄이는 과정이므로)

또한, 표준오차와 p값도 모든 변수를 포함하여 처음 모델을 실행했을 때와 같다.


4.3.5 FWL 정리 요약

 

T와 Y사이의 관계를 추정하고 싶지만, 교란 요인 X가 있는 상황에서,

  • 처치는 x축, 결과는 y축에 표시하고 교란 요인은 색을 사용해 표시
  • 처음에는 T와 Y의 관계가 음의 기울기였으나, 도메인 지식에서 비롯된 근거로 볼 때, 이 관계는 양의 관계여야 한다고 확신할 수 있다. 
  • 따라서 데이터의 편향을 제거하기 위해서 FWL ① 편향 제거 단계에서 E[T|X]를 추정하고, 편향이 제거된 버전의 처치 T(~) = T - E[T|X]를 구한다. 
  • 여전히 잡음이 많이 존재

  • 그 후 잡음을 처리하기 위해 FWL ② 잡음 제거 단계에서 E[Y|X]를 추정하고, 잡음이 제거된 버전의 결과 Y(~) = Y - E[Y|X]를 만든다.

 

이 잡음 제거된 결과 Y를 "공변량 X에 의해 설명된 모든 분산을 고려한 후의 결과"로 볼 수 있다.

이 마지막 회귀식은 Y를 T와 X에 동시에 회귀했을 때의 기울기와 정확히 같다.


✅ 편향 제거와 절편

  • 인과추론에서는 절편보다는 주로 회귀선의 기울기에 관심을 둔다.
  • 기울기가 연속형 처치의 효과에 대한 선형 근삿값이기 때문
  • 반사실 예측을 할 때처럼 절편에 신경을 쓴다면, 편향 제거와 잡음 감소는 절편을 0으로 만든다는 사실을 명심해야 함

 

 

 

Comments