簡體   English   中英

Logistic回歸statsmodels的概率預測置信區間

[英]Confidence interval of probability prediction from logistic regression statsmodels

我正在嘗試從“統計學習簡介”重新創建一個圖,我無法弄清楚如何計算概率預測的置信區間。 具體來說,我正在嘗試重新創建該圖的右側面板( 圖7.1 ),該面板預測工資> 250的概率基於4度多項式的年齡和相關的95%置信區間。 如果有人關心,工資數據就在這里

我可以使用以下代碼預測並繪制預測概率

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from sklearn.preprocessing import PolynomialFeatures

wage = pd.read_csv('../../data/Wage.csv', index_col=0)
wage['wage250'] = 0
wage.loc[wage['wage'] > 250, 'wage250'] = 1

poly = Polynomialfeatures(degree=4)
age = poly.fit_transform(wage['age'].values.reshape(-1, 1))

logit = sm.Logit(wage['wage250'], age).fit()

age_range_poly = poly.fit_transform(np.arange(18, 81).reshape(-1, 1))

y_proba = logit.predict(age_range_poly)

plt.plot(age_range_poly[:, 1], y_proba)

但我對如何計算預測概率的置信區間感到茫然。 我已經考慮過多次引導數據以獲得每個年齡段的概率分布,但我知道有一種更簡單的方法,這是我無法掌握的。

我有估計的系數協方差矩陣和與每個估計系數相關的標准誤差。 如果給出這些信息,我將如何計算置信區間,如上圖右側面板所示?

謝謝!

您可以使用delta方法查找預測概率的近似方差。 也就是說,

var(proba) = np.dot(np.dot(gradient.T, cov), gradient)

其中gradient是模型系數的預測概率導數的向量,而cov是系數的協方差矩陣。

事實證明,Delta方法可以漸近地用於所有最大似然估計。 但是,如果您有一個小的訓練樣本,漸近方法可能無法正常工作,您應該考慮自舉。

以下是將delta方法應用於邏輯回歸的玩具示例:

import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt

# generate data
np.random.seed(1)
x = np.arange(100)
y = (x * 0.5 + np.random.normal(size=100,scale=10)>30)
# estimate the model
X = sm.add_constant(x)
model = sm.Logit(y, X).fit()
proba = model.predict(X) # predicted probability

# estimate confidence interval for predicted probabilities
cov = model.cov_params()
gradient = (proba * (1 - proba) * X.T).T # matrix of gradients for each observation
std_errors = np.array([np.sqrt(np.dot(np.dot(g, cov), g)) for g in gradient])
c = 1.96 # multiplier for confidence interval
upper = np.maximum(0, np.minimum(1, proba + std_errors * c))
lower = np.maximum(0, np.minimum(1, proba - std_errors * c))

plt.plot(x, proba)
plt.plot(x, lower, color='g')
plt.plot(x, upper, color='g')
plt.show()

它繪制了以下精美圖片: 在此輸入圖像描述

對於您的示例,代碼將是

proba = logit.predict(age_range_poly)
cov = logit.cov_params()
gradient = (proba * (1 - proba) * age_range_poly.T).T 
std_errors = np.array([np.sqrt(np.dot(np.dot(g, cov), g)) for g in gradient])
c = 1.96 
upper = np.maximum(0, np.minimum(1, proba + std_errors * c))
lower = np.maximum(0, np.minimum(1, proba - std_errors * c))

plt.plot(age_range_poly[:, 1], proba)
plt.plot(age_range_poly[:, 1], lower, color='g')
plt.plot(age_range_poly[:, 1], upper, color='g')
plt.show()

它會給出如下圖片

在此輸入圖像描述

看起來非常像一個有大象的蟒蛇。

您可以將它與bootstrap估計值進行比較:

preds = []
for i in range(1000):
    boot_idx = np.random.choice(len(age), replace=True, size=len(age))
    model = sm.Logit(wage['wage250'].iloc[boot_idx], age[boot_idx]).fit(disp=0)
    preds.append(model.predict(age_range_poly))
p = np.array(preds)
plt.plot(age_range_poly[:, 1], np.percentile(p, 97.5, axis=0))
plt.plot(age_range_poly[:, 1], np.percentile(p, 2.5, axis=0))
plt.show()

在此輸入圖像描述

delta方法和bootstrap的結果看起來幾乎相同。

然而,本書的作者走的是第三種方式。 他們使用的事實

proba = np.exp(np.dot(x,params))/(1 + np.exp(np.dot(x,params)))

並計算線性部分的置信區間,然后用logit函數進行變換

xb = np.dot(age_range_poly, logit.params)
std_errors = np.array([np.sqrt(np.dot(np.dot(g, cov), g)) for g in age_range_poly])
upper_xb = xb + c * std_errors
lower_xb = xb - c * std_errors
upper = np.exp(upper_xb) / (1 + np.exp(upper_xb))
lower = np.exp(lower_xb) / (1 + np.exp(lower_xb))
plt.plot(age_range_poly[:, 1], upper)
plt.plot(age_range_poly[:, 1], lower)
plt.show()

所以他們得到了不同的間隔:

在此輸入圖像描述

這些方法產生如此不同的結果,因為它們假設正常分布的不同事物 (預測概率和對數概率)。 也就是說,delta方法假設預測的概率是正常的,並且在書中,對數概率是正常的。 實際上,它們在有限樣本中都不是正常的,但它們都收斂於無限樣本中,但它們的方差同時收斂於零。 最大似然估計對重新參數化不敏感,但它們的估計分布是,這就是問題所在。

這是一個有效且有效的方法來計算擬合的標准誤差('se')('mean_se')和單個觀察('obs_se')在statsmodels Logit().fit()對象('fit')之上),與ISLR一書中的方法和David Dale的答案中的最后一種方法相同:

fit_mean = fit.model.exog.dot(fit.params)
fit_mean_se = ((fit.model.exog*fit.model.exog.dot(fit.cov_params())).sum(axis=1))**0.5
fit_obs_se = ( ((fit.model.endog-fit_mean).std(ddof=fit.params.shape[0]))**2 + \
                fit_mean_se**2 )**0.5

類似於ISLR一書中的數字

陰影區域代表擬合和單個觀察的95%置信區間。

我們非常歡迎改進的想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM