logistic模型预测人口python_基于logistic回归stats模型的概率预测置信区间

您可以使用delta method查找预测概率的近似方差。也就是说var(proba) = np.dot(np.dot(gradient.T, cov), gradient)

其中gradient是模型系数预测概率导数的向量,cov是系数的协方差矩阵。

Delta方法被证明对所有最大似然估计都是渐近的。然而,如果你有一个小的训练样本,渐近方法可能不太好用,你应该考虑自举。

下面是一个将delta方法应用于logistic回归的示例: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()

它会给出以下图片

看起来很像一条里面有大象的大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()

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方法假设预测概率是正常的,而在书中,对数概率是正常的。事实上,它们在有限样本中都不正常,但在无限样本中都收敛,但它们的方差同时收敛到零。最大似然估计对重参数化不敏感,但它们的估计分布是,这就是问题所在。

你可能感兴趣的:(logistic模型预测人口python_基于logistic回归stats模型的概率预测置信区间)