2020. 10. 12. 23:18ㆍ계량경제학
일반적으로, 회귀분석에 Interaction term을 포함하는 이유는 한 독립변수의 변화가 "또다른 독립변수의 종속변수 Y에 대한 영향력을 어떻게 변경"하는지를 알아보기 위해서입니다. 예를 들어 Interaction term을 활용하여 학력수준이 연봉에 미치는 영향이 남,녀에 따라 다름을 보일 수 있습니다.
이러한 상호작용은 회귀분석에 크게 2가지 주요 유형으로 분류할 수 있습니다.
1. 두 개의 Binary 변수사이에 상호작용
2. 하나의 Binary 변수와 하나의 Continuous 변수사이에 상호작용
먼저, 두 개의 Binary 변수사이에 상호작용부터 알아보겠습니다.
[두 개의 Binary 변수사이에 상호작용]
두 개의 Binary 변수를 $D_1$(성별), $D_2$(학력)라고 해보겠습니다. 그렇다면 상호작용 회귀분석은 아래와 같이 표현될 수 있습니다.
여기서 $D_{1i}\cdot D_{2i}$가 상호작용 term이며, $\beta_3$이 성별에 따른 학력수준 영향력 차이를 보여줍니다. 예제를 통해 살펴보겠습니다.
import statsmodels.api as sm
import statsmodels.formula.api as smf
CASchools = pd.read_csv("CASchools.csv")
CASchools["size"]=CASchools["students"]/CASchools["teachers"]
CASchools["score"]=(CASchools["read"]+CASchools["math"])/2
CASchools["HiSTR"]=CASchools["size"].apply(lambda x : 1 if x>=20 else 0)
CASchools["HiEL"]=CASchools["english"].apply(lambda x : 1 if x>=10 else 0)
bi_model = smf.ols("score~HiSTR*HiEL",data = CASchools).fit()
bi_model.summary()
'''
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
Intercept 664.1433 1.316 504.852 0.000 661.557 666.729
HiSTR -1.9078 2.235 -0.854 0.394 -6.301 2.485
HiEL -18.3155 2.144 -8.544 0.000 -22.529 -14.102
HiSTR:HiEL -3.2601 3.223 -1.012 0.312 -9.596 3.075
==============================================================================
Omnibus: 7.998 Durbin-Watson: 0.569
Prob(Omnibus): 0.018 Jarque-Bera (JB): 8.251
Skew: 0.336 Prob(JB): 0.0162
Kurtosis: 2.856 Cond. No. 6.50
==============================================================================
'''
위의 결과를 바탕으로 수식으로 표현하면 아래와 같습니다.
위에서 추정된 계수를 활용하여 위의 식을 해석해보겠습니다. HiEL이 1일 때(영어를 배운 아이들의 비율이 높은 지역)에서 HiSTR이 Testscore에 미치는 영향은 -1.9-3.3 = -5.2가 됩니다. HiEL이 0일 때(영어를 배운 아이들의 비율이 낮은 지역)에서는 HiSTR이 Testscore에 미치는 영향은 -1.9입니다. 즉, 영어를 배운 아이들의 비율이 높은 지역에서 HiSTR(학생-선생님 비율, 높을수록 선생님에 비해 학생이 많음)이 Testscore에 더 많은 영향을 미치고 있음을 알 수 있습니다.
[하나의 Binary 변수와 하나의 Continuous 변수사이에 상호작용]
하나의 Binary변수와 Continuous변수사이에 상호작용을 나타내는 모델은 3개로 표현될 수 있습니다.
첫 번째는 Different intercept, Same slope 입니다. 모델은 아래와 같습니다.
두 번째는 Different intercept, Different slope 입니다. 모델은 아래와 같습니다.
세 번째는 Same intercept, Different slope 입니다. 모델은 아래와 같습니다.
세 가지 모형에 대해서 시뮬레이션 데이터를 활용하여 비교해보도록 하겠습니다.
## Binary and Continuous
X = np.random.uniform(0, 15, 200)
D = np.random.randint(0,2,200)
Y = 450+150*X+500*D+50*(X*D)+np.random.normal(0, 300, 200)
data_ = pd.DataFrame(data=[X,D,Y]).T
data_.rename(columns = {0:"X",1:"D",2:"Y"}, inplace=True)
data_["log_Y"]=np.log(data_["Y"])
## Different intercept, Same Slope
mod1_=smf.ols("np.log(Y)~X+D", data=data_).fit()
mod1_.summary()
data_["pred1"]=mod1_.predict(data_[["X","D"]])
## Different intercept, Different Slope
mod2_=smf.ols("np.log(Y)~X+D+X:D", data=data_).fit()
mod2_.summary()
data_["pred2"]=mod2_.predict(data_[["X","D"]])
## Same InterCept, Different Slope
mod3_=smf.ols("np.log(Y)~X+X:D", data=data_).fit()
mod3_.summary()
data_["pred3"]=mod3_.predict(data_[["X","D"]])
## 시각화
fig = plt.figure()
ax1 = fig.add_subplot(3, 1, 1)
ax2 = fig.add_subplot(3, 1, 2)
ax3 = fig.add_subplot(3, 1, 3)
sns.scatterplot(data=data_.loc[data_["D"]==1], x="X", y="log_Y" , ax=ax1)
sns.scatterplot(data=data_.loc[data_["D"]==0], x="X", y="log_Y", color="r" , ax=ax1)
sns.lineplot(data=data_.loc[data_["D"]==1], x="X", y="pred1", ax=ax1)
sns.lineplot(data=data_.loc[data_["D"]==0], x="X", y="pred1", color="r", ax=ax1)
ax1.set_title("Different intercept, Same Slope")
sns.scatterplot(data=data_.loc[data_["D"]==1], x="X", y="log_Y" ,ax=ax2)
sns.scatterplot(data=data_.loc[data_["D"]==0], x="X", y="log_Y", color="r" ,ax=ax2)
sns.lineplot(data=data_.loc[data_["D"]==1], x="X", y="pred2",ax=ax2)
sns.lineplot(data=data_.loc[data_["D"]==0], x="X", y="pred2", color="r",ax=ax2)
ax2.set_title("Different intercept, Different Slope")
sns.scatterplot(data=data_.loc[data_["D"]==1], x="X", y="log_Y",ax=ax3 )
sns.scatterplot(data=data_.loc[data_["D"]==0], x="X", y="log_Y", color="r" ,ax=ax3)
sns.lineplot(data=data_.loc[data_["D"]==1], x="X", y="pred3",ax=ax3)
sns.lineplot(data=data_.loc[data_["D"]==0], x="X", y="pred3", color="r",ax=ax3)
ax3.set_title(" Same InterCept, Different Slope")
'계량경제학' 카테고리의 다른 글
Panel 회귀모형 (0) | 2020.10.24 |
---|---|
회귀분석의 해석 (0) | 2020.10.18 |
비선형 회귀모형 > 다항 모형, Log 모형 (0) | 2020.10.04 |
회귀분석 가설검정 > F-test (1) | 2020.10.03 |
회귀분석 가설검정 (0) | 2020.09.17 |