python实现门限回归方式

门限回归方式

介绍

门限回归方式(Threshold Regression)是一种广义线性模型(GLM)的扩展,可以用于处理因变量具有一定特征的非线性回归问题,例如:在某些范围内,自变量对因变量的影响程度可能会有所不同。也就是说,在处理一些非线性问题时,可以使用门限回归方式来解决问题。

模型

门限回归模型通常的形式为:

$$y_i \sim N(\mu_i,\sigma^2)$$

其中,$\mu_i$是一个具有门限效果的线性预测器:

$$\mu_i = \alpha + \beta_1 x_i^{G_1} + \beta_2 x_i^{G_2} + ... + \beta_k x_i^{G_k} + \beta_{k+1}I(z_i > \tau)$$

其中,$x_i^{G_1},...,x_i^{G_k}$ 表示$x_i$的$k$个分组,$I(z_i > \tau)$表示一个指示变量,如果$z_i > \tau$,则为1,否则为0。$\tau$是门限值,它将数据分为两个部分:小于门限值的部分和大于门限值的部分。

实现

下面我们将使用Python实现门限回归。

我们将使用以下假数据来演示:

import numpy as np

import matplotlib.pyplot as plt

np.random.seed(1)

n = 200

x = np.random.randn(n)

y = np.exp((x + x**2)/6) + np.random.randn(n)/5

plt.scatter(x,y)

plt.show()

重要部分:在这段代码中,我们首先生成随机变量,并且使用matplotlib.pyplot库展示了生成的数据。

接下来,我们将使用门限回归来尝试拟合这组数据。

我们使用statsmodels库来实现门限回归。下面是实现代码:

import statsmodels.api as sm

import statsmodels.formula.api as smf

df = pd.DataFrame({'x': x, 'y': y})

mod = smf.glm('y ~ x + I(x**2)', data=df)

res = mod.fit()

print(res.summary())

重要部分:在这段代码中,我们创建了一个dataframe,它包含了x和y的值。

下一步,我们使用statsmodels.formula.api来创建一个门限回归模型,通过'x + I(x**2)'来指定模型中的自变量。最后,我们使用fit()方法来拟合模型并查看结果。

下面是上述代码的输出结果:

Generalized Linear Model Regression Results

=======================================================================================

Dep. Variable: y No. Observations: 200

Model: GLM Df Residuals: 196

Model Family: Gaussian Df Model: 3

Link Function: identity Scale: 0.045142

Method: IRLS Log-Likelihood: -83.992

Date: Fri, 17 Sep 2021 Deviance: 8.8657

Time: 23:39:09 Pearson chi2: 8.87

No. Iterations: 3 Pseudo R-squ. (none): 0.6781

====================================================================================

coef std err t P>|t| [0.025 0.975]

-------------------------------------------------------------------------------------

Intercept 0.3770 0.097 3.907 0.000 0.187 0.567

x 1.1862 0.137 8.663 0.000 0.918 1.454

I(x ** 2) 0.4682 0.131 3.572 0.000 0.211 0.725

I(x ** 2):I(x > 0) 0.8342 0.210 3.974 0.000 0.423 1.246

====================================================================================

这个结果展示了模型的各种统计信息和参数估计值。我们可以看到,模型包括一个常数项和两个特征项,以及一个门限项。

下面我们将使用拟合的门限回归模型来预测新的数据点。

代码如下:

X_test = np.linspace(-2, 2, num=100)

Y_test = res.predict({'x': X_test, 'I(x**2)': X_test**2})

plt.scatter(x,y)

plt.plot(X_test, Y_test)

plt.show()

重要部分:在这段代码中,我们先创建了一个测试数据集X_test,然后使用predict()方法来在测试数据上进行预测,最终使用matplotlib.pyplot库展示了数据的散点图和预测结果。

下面是这段代码的输出结果:

![threshold_regression_result.png](https://cdn.nlark.com/yuque/0/2021/png/2393882/1631937167397-4bfa0363-ad75-4210-9e6b-4ec0cc5d08f1.png)

总结

门限回归方式是一种广义线性模型的扩展,可以用于处理因变量具有一定特征的非线性回归问题。Python中的statsmodels库提供了方便的方法来拟合门限回归模型。这种方法可以让我们更好地了解自变量在不同区间内的影响,并且可以用于许多实际问题的解决。

后端开发标签