2요인 고정효과 모형 (two-way fixed effect) 추정에서, de-meaning (그룹별로 각 평균을 빼주는 형태) 을 직접 하는 코드를 파이썬으로 작성했다. 계량경제학 과제 하는 느낌이긴 한데, 이렇게 연습하다보니 이해가 명확해지기는 한다. 그리고, 구글 Colab 으로 회귀식을 돌리는데, 고정효과 (fixed effect) 를 사용하는 회사 아이디 (firm_id) 가 2천8백여개가 되니까, 고정효과 사용하는 식들이 계속 안 돌아가서 원인을 아직 못 찾고 있다. 일단 2요인 고정효과 모형에서 이렇게 de-meaning 을 할 수 있다는 것을 이용하면, 보다 간단한 이중차분 (difference-in-difference) 에서도 de-meaning 이 가능할 것으로 이해하고 있다.
관련 코드는 구글 Colab 링크에서 확인할 수 있다.
아래 파이썬 코드와 같은 기능을 하는 SQL 코드도 링크에 담아두었다.
파이썬 코드 (1)
# compute the mean of log1p_pageviews by week_id
avgW_log1p_pageviews = data.groupby('week_id')['log1p_pageviews'].transform('mean')
# demean log1p_pageviews by subtracting the mean
data['demW_log1p_pageviews'] = data['log1p_pageviews'] - avgW_log1p_pageviews
# compute the mean of log1p_pageviews by week_id
avgW_using_ab_only = data.groupby('week_id')['using_ab_only'].transform('mean')
# demean log1p_pageviews by subtracting the mean
data['demW_using_ab_only'] = data['using_ab_only'] - avgW_using_ab_only
# compute the mean of log1p_stack2 by week_id
avgW_log1p_stack2 = data.groupby('week_id')['log1p_stack2'].transform('mean')
# demean log1p_pageviews by subtracting the mean
data['demW_log1p_stack2'] = data['log1p_stack2'] - avgW_log1p_stack2
파이썬 코드 (2)
# compute the mean of log1p_pageviews by firm_id
avgF_log1p_pageviews = data.groupby('firm_id')['log1p_pageviews'].transform('mean')
# demean log1p_pageviews by subtracting the mean
data['demF_log1p_pageviews'] = data['log1p_pageviews'] - avgF_log1p_pageviews
# compute the mean of log1p_pageviews by firm_id
avgF_using_ab_only = data.groupby('firm_id')['using_ab_only'].transform('mean')
# demean log1p_pageviews by subtracting the mean
data['demF_using_ab_only'] = data['using_ab_only'] - avgF_using_ab_only
# compute the mean of log1p_stack2 by firm_id
avgF_log1p_stack2 = data.groupby('firm_id')['log1p_stack2'].transform('mean')
# demean log1p_pageviews by subtracting the mean
data['demF_log1p_stack2'] = data['log1p_stack2'] - avgF_log1p_stack2
파이썬 코드 (3)
import numpy as np
# compute the mean of the log1p_pageviews column
avg_log1p_pageviews = np.mean(data['log1p_pageviews'])
# subtract the mean from each element in the column and create a new column
data['demWF_log1p_pageviews'] = data['log1p_pageviews'] - avgW_log1p_pageviews - avgF_log1p_pageviews + avg_log1p_pageviews
# compute the mean of the log1p_pageviews column
avg_using_ab_only = np.mean(data['using_ab_only'])
# subtract the mean from each element in the column and create a new column
data['demWF_using_ab_only'] = data['using_ab_only'] - avgW_using_ab_only - avgF_using_ab_only + avg_using_ab_only
# compute the mean of the log1p_pageviews column
avg_log1p_stack2 = np.mean(data['log1p_stack2'])
# subtract the mean from each element in the column and create a new column
data['demWF_log1p_stack2'] = data['log1p_stack2'] - avgW_log1p_stack2 - avgF_log1p_stack2 + avg_log1p_stack2
위와 같이 demeaning 을 한 후에 단순한 OLS 회귀식을 돌리면 2요인 고정효과 모형의 추정치가 나타난다.
# OLS
import statsmodels.api as sm
# Add dummy variables to explanatory variables
X = sm.add_constant(data[['demW_using_ab_only']])
X = pd.concat([X], axis=1)
# Fit a linear model
ols_model = sm.OLS(data['demW_log1p_pageviews'], X)
# Get the fitted coefficients and p-values
ols_results = ols_model.fit()
# Print the regression summary
print(ols_results.summary())
'인과추론' 카테고리의 다른 글
정책의 점진적인 도입 효과를 추론하고 싶다면? (two-way fixed effects model) (0) | 2023.04.02 |
---|---|
[AWS로 SQL] 2요인 고정효과 모형 (0) | 2023.04.02 |
[인과추론 테크 회사 리포트/리서치 논문 모음 (링크) (0) | 2022.05.30 |
[인과추론] 매칭 (feat. PSM) (0) | 2022.05.17 |
[인과추론] Randomization (0) | 2022.04.26 |