회귀분석 가설검정 > F-test

2020. 10. 3. 19:00계량경제학

반응형

F-test를 활용하여, 다중회귀분석에 대한 Joint Hypothesis Test를 수행할 수 있습니다. 이는 모든 독립변수의 계수가 0인지, 또는 하나의 계수라도 0이 아닌지를 판별하는 것으로, 아래와 같이 F-Test를 위한 귀무가설과 대립가설을 표현할 수 있습니다.

귀무가설은, $k$개의 독립변수가 있다고 가정했을 때, 추정되는 $k$개의 계수가 모두 0임을 뜻하며, 대립가설은 하나의 계수라도 0이 아님을 뜻합니다. 

이를 테스트를 수행하기 위한  F-statistic을 구하는 식은 아래와 같습니다.

해당 F-통계량은 (k, n-(k+1))의 자유도를 가지는 F 분포를 활용하여 p-value를 계산하게 됩니다. 여기서 RSS는 잔차제곱합, ESS는 회귀제곱합입니다.

Python을 통해 실습을 해보겠습니다.

from scipy.stats import f

n=len(CASchools)
k=3
multi_mod_= smf.ols('score ~ STR+ english + expenditure', data = CASchools).fit()
y_mean = CASchools["score"].mean()
SSR = multi_mod_.resid.pow(2).sum()
TSS = (CASchools["score"]-y_mean).pow(2).sum()
ESS = (multi_mod_.fittedvalues-y_mean).pow(2).sum()

F_stats = (ESS/k)/(SSR/(n-k-1)) ## 107.45
f_dist = f(k, (n-k-1))
1-f_dist.cdf(F_stats) ## 0.0000...

해당 예제를 통해 살펴보면 F-통계량은 107.45로 큰 값이 나왔고 유의수준은 0.000..으로 검정결과 귀무가설을 기각하였습니다. 이는 독립변수들의 계수 중 하나 이상은 유의성을 가짐을 확인 할 수 있습니다.

이러한 F-Test를 활용하여, 전체 계수가 아니라 특정 독립변수의 계수를 설정하여 검정을 수행할 수 있습니다.

예를 들어, 위의 실습에서 STR, english, expenditure를 독립변수로 활용했는데, 여기서 STR, english, expenditure모두를 활용한 모델을 Full 모델이라고 하고, english만 활용한 모델을 Restricted 모델이라고 해보겠습니다. 그렇다면 Full 모델과 Restricted 모델을 비교하여 STR, expenditure의 계수가 모두 0인지 또는 하나의 계수라도 유의한지 살펴볼 수 있을 것입니다. 

이때 활용한 F-statistc은 아래와 같이 표현됩니다. 

여기서 $q$는 Restricted된 모델에서 몇개의 독립변수가 제한되었는지에 대한 수입니다. 예를들어, english만 있는 모델과 3가지의 독립변수를 활용한 Full 모델을 비교한다면, q는 2가 됩니다. k는 Full모델에서 활용한 독립변수의 수입니다.

여기서 만약 Restricted 모델을 Intercept만 있는 모델이라고 하면 위에서 활용한 

를 활용하여 구한  F-통계량과

를 활용하여 구한 F-통계량의 결과가 같습니다.

Python을 통해서 실습을 해보겠습니다. 파이썬에서는 statsmodels패키지를 활용하 쉽게 회귀분석에 대한 F-test를 수행할 수 있습니다.

from statsmodels.stats.anova import anova_lm

mod_restriced = smf.ols('score ~ english ', data = CASchools).fit()
mod_unrestriced = smf.ols('score ~ STR+ english + expenditure', data = CASchools).fit()
anovaResults = anova_lm(mod_restriced, mod_unrestriced)
print(anovaResults)

'''
   df_resid           ssr  df_diff      ss_diff         F    Pr(>F)
0     418.0  89000.001934      0.0          NaN       NaN       NaN
1     416.0  85699.688218      2.0  3300.313716  8.010125  0.000386
'''

위에서 본 결과를 해석하면, STR, english, expenditure를 모두 활용한 모델이 english만 활용한 모델보다 F-통계량이 유의하게 컸습니다. 이는 STR 또는 expenditure가 유의한 변수임을 뜻할 수 있습니다.

추가적으로 Intercept만 있는 모델과 Full 모델을 패키지를 활용하여 비교해보겠습니다.

X =pd.DataFrame(np.ones(len(CASchools)))
y = CASchools["score"]
mod_intercept = sm.OLS(y, X).fit()
mod_unrestriced = smf.ols('score ~ STR + english + expenditure', data = CASchools).fit()
anovaResults = anova_lm(mod_intercept, mod_unrestriced)
print(anovaResults)

'''
   df_resid            ssr  df_diff       ss_diff           F        Pr(>F)
0     419.0  152109.580095      0.0           NaN         NaN           NaN
1     416.0   85699.688218      3.0  66409.891877  107.454747  1.602350e-51
'''

위에 F-통계량을 보면 위에서 손으로 계산한 F-통계량과 같음을 알 수 있습니다. 

반응형