gpt4 book ai didi

python - 逻辑回归统计模型概率预测的置信区间

转载 作者:太空狗 更新时间:2023-10-29 22:12:21 25 4
gpt4 key购买 nike

我正在尝试重新创建统计学习简介 中的图,但我无法弄清楚如何计算概率预测的置信区间。具体来说,我正在尝试重新创建此图 (figure 7.1) 的右侧面板,该面板根据年龄的 4 次多项式和相关的 95% 置信区间预测工资>250 的概率。工资数据为here如果有人关心的话。

我可以使用以下代码预测并绘制预测概率

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 method找到预测概率的近似方差。即,

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()

它绘制了如下漂亮的图: enter image description here

对于您的示例,代码将是

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()

它会给出下面的图片

enter image description here

看起来很像里面有大象的 python 。

您可以将它与 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()

enter image description here

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()

所以他们得到发散区间:

enter image description here

这些方法会产生如此不同的结果,因为它们假设不同的东西(预测概率和对数几率)呈正态分布。即,delta 方法假设预测概率是正常的,而在书中,log-odds 是正常的。事实上,它们在有限样本中都不是正态的,而在无限样本中都收敛于正态,只是它们的方差同时收敛于零。最大似然估计对重新参数化不敏感,但它们的估计分布却很敏感,这就是问题所在。

关于python - 逻辑回归统计模型概率预测的置信区间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47414842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com