Python:使用statsmodel找到logit回归模型的拐点

Python:使用statsmodel找到logit回归模型的拐点,python,statistics,Python,Statistics,我在Python中使用的是statsmodel: import statsmodels.formula.api as smf 我有一个包含x1值和d值的数据帧。d列是我的因变量。我绘制了d与x1的对比图,得到: 现在,我使用statsmodel拟合logit回归模型: logit_mod = smf.logit('d ~ x1', data = df).fit() print print(logit_mod.summary()) logithat = logit_mod.predict(df

我在Python中使用的是statsmodel:

import statsmodels.formula.api as smf
我有一个包含x1值和d值的数据帧。d列是我的因变量。我绘制了d与x1的对比图,得到:

现在,我使用statsmodel拟合logit回归模型:

logit_mod = smf.logit('d ~ x1', data = df).fit()
print
print(logit_mod.summary())
logithat = logit_mod.predict(df)

plt.plot(df['x1'], logithat, 'o')
plt.scatter(df['x1'], df['d'], color='orange')
结果是:

如何获得该logit曲线拐点的值


谢谢

这很有帮助!虽然它返回的值是0.94,所以我认为它给了我一些不同于拐点的东西。该值是否可能是平衡点或曲线开始变平的位置?如果x值位于均匀间距的网格上,或者更好,则在等间距的网格上评估预测值。否则,有限差将基于x的不同增量。是的,它在等距网格上是精确的@user333700。所以我会更正我的答案。但是,没有必要插入。您可以使用网格调用
predict
logit\u mod.predict(df\u grid)
。(Logit也应该有直接的分析导数计算,但它在内部用于计算利润率。)这很有用!虽然它返回的值是0.94,所以我认为它给了我一些不同于拐点的东西。该值是否可能是平衡点或曲线开始变平的位置?如果x值位于均匀间距的网格上,或者更好,则在等间距的网格上评估预测值。否则,有限差将基于x的不同增量。是的,它在等距网格上是精确的@user333700。所以我会更正我的答案。但是,没有必要插入。您可以使用网格调用
predict
logit\u mod.predict(df\u grid)
。(Logit也应该有一些直接的解析导数计算,但它在内部用于计算裕度。)Logit函数在零附近对称,或者概率为0.5。我认为拐点是线性预测为零0=const+b*x_I,其中b是斜率系数,因此它应该是
x_I=-params[0]/params[1]
。(未验证)那么你的意思是
x_I=-logit_mod.params[0]/logit_mod.params[1]
?因为它返回0.511,这是我所期望的。logit函数是围绕零对称的,或者概率是0.5。我认为拐点是线性预测为零0=const+b*x_I,其中b是斜率系数,因此它应该是
x_I=-params[0]/params[1]
。(未验证)那么您的意思是
x_I=-logit_mod.params[0]/logit_mod.params[1]
?因为它返回0.511,这是我所期望的。
import pandas as pds
df1  = pds.DataFrame({'lgt' : logithat,'x':x1}).set_index('x')
grid = np.linspace(df1.index.min(),df1.index.max(),df1.shape[0]+1)
df2 = pds.DataFrame({'grid':grid}).reset_index().set_index('grid')
df2 = pds.concat([df1,df2],join='outer',axis=1)
df2['lgt_'] = df2['lgt'].interpolate()


inflexion       = df2['lgt_'].diff().argmax()

fig = plt.figure()
ax = fig.add_subplot(111)
df2['lgt_'].plot(ax=ax)
ax.vlines(inflexion,df2['lgt_'].min(),df2['lgt_'].ix[inflexion])