第一種是統計學方法,需要用到 statsmodels包
statsmodels是統計和計量經濟學的package,包含了用於參數評估和統計測試的實用工具
第二種是機器學習,需要使用sklearn中的LogisticRegression
下面以計算dis1-->dis2的OR值為例,也就是說dis1為自變量,dis2為因變量
首先我們先造一組數據: x為自變量,y為因變量
df = pd.DataFrame({'x': ['dis1', 'dis1', 'dis1', 'dis1', 'dis3', 'dis3', 'dis3', 'dis3'], 'y': ["dis2", "dis2", "dis2", "dis4", "dis4", "dis4", "dis4", "dis2"]})
因為我要使用邏輯回歸估計OR值,所以首先會計算出實際的OR值
患dis2 | 不患dis2 | |
患dis1 | A | B |
不患dis1 | C | D |
OR值的計算:OR_dis1_dis2 = AD/BC,其中A = 3, B = 1, C = 1, D = 3
ct = pd.crosstab(df.x, df.y)
oddsratio, pvalue = stats.fisher_exact(ct)
使用stamodel包中的邏輯回歸進行OR值的估計:
df["intercept"] = 1.0 # 截距項,初始化截距項,不可省 # 擬合模型 logit = sm.Logit(df['y'], df[df.columns[1:]]) result = logit.fit() print(result.summary()) # 計算得到OR值 OR1 = np.exp(result.params)
使用機器學習方法計算OR
df = pd.get_dummies(df) clf = LogisticRegression(penalty='none') clf.fit(df[['x_dis1']], df[['y_dis2']].values) print(clf) odds_ratio = np.exp(clf.coef_) print(odds_ratio)
完整代碼:
import pandas as pd import statsmodels.api as sm from sklearn.linear_model import LogisticRegression import numpy as np # 構造數據 df = pd.DataFrame({'x': ['dis1', 'dis1', 'dis1', 'dis1', 'dis3', 'dis3', 'dis3', 'dis3'], 'y': ["dis2", "dis2", "dis2", "dis4", "dis4", "dis4", "dis4", "dis2"]}) # 計算實際OR ct = pd.crosstab(df.x, df.y) oddsratio, pvalue = stats.fisher_exact(ct) # 使用統計學方法計算 df["intercept"] = 1.0 # 截距項,初始化截距項,不可省 # 擬合模型 logit = sm.Logit(df['y'], df[df.columns[1:]]) result = logit.fit() print(result.summary()) # 計算得到OR值 OR1 = np.exp(result.params) # 使用機器學習方法計算 df = pd.get_dummies(df) clf = LogisticRegression(penalty='none') clf.fit(df[['x_dis1']], df[['y_dis2']].values) print(clf) odds_ratio = np.exp(clf.coef_) print(odds_ratio)