본문 바로가기

파이썬3

2개의 회귀선의 기울기를 통계적으로 비교하는 법

728x90
반응형

H0 : beta1과 beta2는 같다.

H1 : beta1과 beta2는 다르다.

 

def compare_slope_test(x1,x2,y):
    from statsmodels.formula.api import ols
    import numpy as np
    from scipy.stats import t
    '''
    x1,x2,y : np.array or list conatining numeric values. They should have same size.
    '''
    df=pd.DataFrame({'x1':x1,'x2':x2,'y':y})
    x1_model=ols('y~x1',data=df).fit()
    x2_model=ols('y~x2',data=df).fit()
    slope_difference=x1_model.params['x1']-x2_model.params['x2']
    se_difference=np.sqrt(x1_model.bse['x1']**2+x2_model.bse['x2']**2)
    t_statistics=slope_difference/se_difference
    degree_of_freedom=len(df)-4 # degree of freedom를 -4 하는 이유는 y가 2번 x1, x2가 각각 1번 씩 들어가기 때문임.
    p_value=2*(1-t.cdf(np.abs(t_statistics),degree_of_freedom))
    return p_value

two-sided로 테스트하기 때문에 p_value에 값을 2를 곱하는 것임. one-sided로 할 것이라면 제거하면 됨.

 

테스트

import numpy as np
import pandas as pd
import seaborn as sns
x1=np.random.randn(50)
x1=x1[np.argsort(x1)]
x2=x1+np.random.rand(50)/10+1
y=np.random.randn(50)
y=y[np.argsort(y)]
compare_slope_test(x1,x2,y)
# 0.7521
# p-value값은 달라질 수 있음.

df=pd.DataFrame({'x1':x1,'x2':x2,'y':y})
df=df.melt(id_vars='y')
sns.lmplot(data=df,x='value',y='y',hue='variable')

# 기울기를 직각으로 만드는 경우
import numpy as np
import pandas as pd
import seaborn as sns
x1=np.random.randn(50)
x1=x1[np.argsort(x1)]
x2=x1[np.argsort(-x1)]+np.random.rand(50)/10+1
y=np.random.randn(50)
y=y[np.argsort(y)]
compare_slope_test(x1,x2,y)

df=pd.DataFrame({'x1':x1,'x2':x2,'y':y})
df=df.melt(id_vars='y')
sns.lmplot(data=df,x='value',y='y',hue='variable')
# 0.0

 

 

출처 : https://real-statistics.com/regression/hypothesis-testing-significance-regression-line-slope/comparing-slopes-two-independent-samples/

 

728x90
반응형