大师兄的应用回归分析学习笔记(十三):自变量选择与逐步回归(一)
大师兄的应用回归分析学习笔记(十五):自变量选择与逐步回归(三)
二、所有子集回归
3. 实际案例
3.1 案例一
- y表示某种消费品的销售额
表示居民可支配收入
表示该类消费品的价格指数
表示其他消费品平均价格指数
- n=18,m=3,所有自变量子集=
![]()
# import lib
import pandas as pd
import statsmodels.api as sm
from itertools import combinations
# 加载数据
data = pd.read_csv(r"C:\Users\Sunxiaoran\Desktop\data.csv")
y = data["y百万元"]
X = data[["x1元", "x2元", "x3元"]]
# 拟合全模型
X_full = sm.add_constant(X) # 添加截距项
full_model = sm.OLS(y, X_full).fit()
mse_full = full_model.mse_resid # 全模型的均方误差 (MSE)
# 最佳子集回归
def best_subset(X, y):
results = []
n = len(y) # 样本量
for k in range(1, X.shape[1] + 1):
for combo in combinations(X.columns, k):
X_subset = sm.add_constant(X[list(combo)])
model = sm.OLS(y, X_subset).fit()
sse_p = model.ssr # 当前模型的残差平方和 (SSE)
p = len(model.params) # 当前模型的参数个数
cp = (sse_p / mse_full) - (n - 2 * p) # 计算 C_p
results.append({
"Variables": combo,
"R2": model.rsquared,
"Adj R2": model.rsquared_adj,
"AIC": model.aic,
"BIC": model.bic,
"Cp": cp
})
return pd.DataFrame(results)
results = best_subset(X, y)
print(results)
- 通过计算得:
Variables R2 Adj R2 AIC BIC Cp
0 (x1元,) 0.972836 0.971138 41.114074 42.894817 6.327737
1 (x2元,) 0.955912 0.953156 49.831504 51.612247 18.992754
2 (x3元,) 0.950818 0.947744 51.799435 53.580179 22.804403
3 (x1元, x2元) 0.974617 0.971233 41.893196 44.564312 6.994696
4 (x1元, x3元) 0.978405 0.975526 38.984021 41.655136 4.159998
5 (x2元, x3元) 0.957071 0.951348 51.351593 54.022708 20.124733
6 (x1元, x2元, x3元) 0.981292 0.977283 38.401352 41.962839 4.000000
的数值随自变量增大而增大,只能作为参考。
- AIC准则、
准则的数值都是全模型最优。
- BIC准则是
最优,课件BIC准则加大了对自变量数目的惩罚力度。
- 综合全模型最优,回归方程:
。
- 在实际选择模型中,应综合考虑:
- 有时希望模型各项衡量准则较优,得到的模型又能给出合理的经济解释;
- 有时只从拟合角度考虑;
- 有时只从预测角度考虑,并不计较回归方程能否有合理的解释;
- 有时要求模型的各个衡量准则较优,而模型最好简单些,涉及的变量少些;
- 有时还看回归模型参数估计的标准差大小等。
3.2 R语言寻找最优子集
- y表示某种消费品的销售额
表示居民可支配收入
表示该类消费品的价格指数
表示其他消费品平均价格指数
- 用调整的付判定系数
准则选择最优自己回归模型。
# 加载 leaps 包,用于最佳子集回归分析
>>>library(leaps)
>>>
>>># 读取数据文件
# 文件路径为 "C:\\Users\\Sunxiaoran\\Desktop\\data.csv"
>>># head=TRUE 表示第一行是列名
>>>data <- read.csv("C:\\Users\\Sunxiaoran\\Desktop\\data.csv", head = TRUE)
>>>
>>># 使用 regsubsets 函数进行最佳子集回归分析
>>># y百万元 ~ x1元 + x2元 + x3元 是回归公式,表示 y百万元 是因变量,x1元、x2元、x3元 是自变量
>>># data = data 指定数据集
>>># nbest = 1 表示对每个子集大小(变量个数)只保留一个最佳模型
>>># really.big = T 允许处理较大的数据集
>>>exps <- regsubsets(y百万元 ~ x1元 + x2元 + x3元, data = data, nbest = 1, really.big = TRUE)
>>>
>>># 提取回归结果的摘要信息
>>>expres <- summary(exps)
>>>
>>># 将结果转换为数据框,并添加调整后的 R 方(adjr2)作为一列
>>># expres$outmat 是一个矩阵,显示每个模型中包含的变量
>>># expres$adjr2 是每个模型的调整后的 R 方
>>>res <- data.frame(expres$outmat, adjr2 = expres$adjr2)
>>>
>>># 打印结果
>>>print(res)
x1元 x2元 x3元 adjr2
1 ( 1 ) * 0.9711381
2 ( 1 ) * * 0.9755260
3 ( 1 ) * * * 0.9772828
- 用
准则和BIC准则寻找最优子集回归模型:
>>>data.frame(expres$outmat,Cp=expres$cp)
x1元 x2元 x3元 Cp
1 ( 1 ) * 6.327737
2 ( 1 ) * * 4.159998
3 ( 1 ) * * * 4.000000
>>>data.frame(expres$outmat,BIC=expres$bic)
x1元 x2元 x3元 BIC
1 ( 1 ) * -59.12471
2 ( 1 ) * * -60.36439
3 ( 1 ) * * * -60.05669