인과추론

[파이썬 코드] 2요인 고정효과 모형

W[더블유] 2023. 4. 2. 02:40

 

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())