расчет коэффициента шансов в python - PullRequest
1 голос
/ 04 апреля 2020

Проверка онлайн в здесь и здесь Я вижу, что есть два способа оценить отношение шансов в python, но результаты отличаются.

Первый способ:

import scipy.stats as stats
import pandas as pd
df=pd.DataFrame({'c':['m','m','m','m','f','f','f','f'],'l':[1,1,1,0,0,0,0,1]})
ct=pd.crosstab(df.c,df.l)
oddsratio, pvalue = stats.fisher_exact(ct)

Второй способ:

from sklearn.linear_model import LogisticRegression
df=pd.get_dummies(df,drop_first=True)
clf = LogisticRegression()
clf.fit(df[['c_m']],df[['l']].values)
odds_ratio=np.exp(clf.coef_)

Коэффициент шансов при первом подходе = 9, а коэффициент шансов при втором подходе = 1.9. Я относительно новичок в концепции отношения шансов и не уверен, как можно использовать тест Фишера и регрессию логистики c для получения одинакового значения, в чем разница и какой метод является правильным подходом для получения отношения шансов в этом дело. Буду признателен за любую подсказку. спасибо.

1 Ответ

1 голос
/ 04 апреля 2020

Краткий ответ:

В обоих случаях вы должны получить одинаковое соотношение шансов равное 9.

По умолчанию, штраф в Lle в Sklearn Logisti c регрессионная модель, которая искажает значение коэффициентов (регуляризация), поэтому, если вы используете penality = 'none, вы получите такое же соотношение шансов соответствия.

, поэтому измените на

clf = LogisticRegression(penalty='none')

и вычислите коэффициент odds_ratio

Длинный ответ:

В первом случае, коэффициент Одда является коэффициентом предыдущего шанса и составляется из таблицы непредвиденных обстоятельств / перекрестной таблицы и рассчитывается, как показано ниже / шансы на то, что m равно 0

шансы на то, что f равно 0 = P (f = 0) / P (f = 1) = (3/4) / (1/4)

шансы где m равно 0 = P (m = 0) / P (m = 1) = (1/4) / (3/4)

коэффициент шансов = ((3/4) / (1/4 )) / ((1/4) / (3/4)) = 9

Во втором случае вы получаете оценку отношения шансов путем подбора логистической c регрессионной модели. Вы получите соотношение шансов = 9, если вы используете пенальти = 'нет' По умолчанию штраф в оценке логистической регрессии равен 'L2'.

from sklearn.linear_model import LogisticRegression
df=pd.get_dummies(df,drop_first=True)
clf = LogisticRegression(penalty='none')
clf.fit(df[['c_m']],df[['l']].values)
odds_ratio=np.exp(clf.coef_)

print(odd_ratio)

array([[9.0004094]])

Вы также можете получить отношение шансов другим методом, что также приводит к тому же отношению шансов. см.

#Method 2: 
odds_of_yis_1_for_female = np.exp(clf.intercept_+clf.coef_*1) #logit for female
odds_of_yis_1_for_male = np.exp(clf.intercept_+clf.coef_*0) # logit for male
odds_ratio_2 = odds_of_yis_1_for_female/odds_of_yis_1_for_male
print(odds_ratio_2)

[[9.0004094]]

Чтобы понять, почему оба метода одинаковы, см. здесь

...