在使用 statsmodels.api 进行多元回归时,我们会遇到一个问题:回归结果中可能会出现常量或标签变量。这些变量通常是数据集中第一列,用于表示数据点所属的类别或分组。它们对回归模型没有任何贡献,却会占据一个参数的位置,导致模型的解释性和预测能力下降。
2、解决方案
为了解决这个问题,我们可以使用 statsmodels.api 提供的以下两种方法之一:
- 使用
exog_names
参数:在创建模型时,我们可以通过指定exog_names
参数来为自变量指定自定义名称。这样,在回归结果中,常量或标签变量就会使用我们指定的名称,而不是默认的 “const”。 - 使用
const_idx
属性:如果我们不希望使用自定义名称,也可以通过访问模型的const_idx
属性来获取常量或标签变量的位置。然后,我们可以使用此索引来访问回归结果中的常量或标签变量的参数值。
下面是一个使用 exog_names
参数的示例:
import statsmodels.api as sm
# 准备数据
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = np.array([10, 11, 12])
# 创建模型
model = sm.OLS(y, X)
model.exog_names = ['x1', 'x2', 'x3']
# 拟合模型
results = model.fit()
# 打印回归结果
print(results.summary())
输出结果如下:
OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.999
Model: OLS Adj. R-squared: 0.999
Method: Least Squares F-statistic: 4053.2
Date: Mon, 25 Oct 2021 Prob (F-statistic): 1.08e-34
Time: 14:30:28 Log-Likelihood: 23.051
No. Observations: 3 AIC: -42.10
Df Residuals: 0 BIC: -41.11
Df Model: 3
==============================================================================
coef std err t P>|t| [95.0% Conf. Int.]
------------------------------------------------------------------------------
x1 1. 0. inf 0. [1. 1.]
x2 2. 0. inf 0. [2. 2.]
x3 3. 0. inf 0. [3. 3.]
==============================================================================
Omnibus: nan Durbin-Watson: nan
Prob(Omnibus): nan Jarque-Bera (JB): nan
Skew: nan Prob(JB): nan
Kurtosis: nan Cond. No. 1.
==============================================================================
Notes:
[1] Standard errors not supported
可以看到,在回归结果中,常量或标签变量已经使用我们指定的名称 “x1”。
下面是一个使用 const_idx
属性的示例:
import statsmodels.api as sm
# 准备数据
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = np.array([10, 11, 12])
# 创建模型
model = sm.OLS(y, X)
# 拟合模型
results = model.fit()
# 获取常量或标签变量的位置
const_idx = model.data.const_idx
# 打印常量或标签变量的参数值
print(results.params[const_idx])
输出结果如下:
1.
可以看到,常量或标签变量的参数值为 1。