目录
基本原理:
逐步回归法的整体思路:
Example&代码示例:
当我们选取的回归模型之中有多个变量时,一般从中选取若干个变量构建回归模型,那么如何选择合适的变量使得模型是最优?
原则:选取对因变量影响最大的自变量进入模型
PS:自变量选择过多时会导致调整后的下降,不是我们所希望的结果。
选择变量的标准:,AIC统计量(理论上,调整后的越大越好,AIC值越小越好)
变量选择的方法有很多种,其中使用最广泛的是逐步回归法。
通过逐步将自变量输入模型,如果模型具统计学意义,并将其纳入在回归模型中。同时移出不具有统计学意义的变量。最终得到一个自动拟合的回归模型。
forward_selected方法:在每一步迭代过程中,分别将进行到当前步骤时剩余的自变量一个个加入模型,计算输出相关的统计学变量(例如使用调整后R方作为标准选择最佳模型, 也可以使用AIC,BIC,PRESS等统计量),得到使得该模型最优的自变量加入模型,这样完成一步迭代。
导入需要使用的资源包,并导入数据:
import statsmodels.formula.api as smf
import pandas as pd
import numpy as np
###导入数据
X1=np.array([7, 1, 11, 11, 7, 11, 3, 1, 2, 21, 1, 11, 10])
X2=np.array([26, 29, 56, 31, 52, 55, 71, 31, 54, 47, 40, 66, 68])
X3=np.array([6, 15, 8, 8, 6, 9, 17, 22, 18, 4, 23, 9, 8])
X4=np.array([60, 52, 20, 47, 33, 22, 6, 44, 22, 26, 34, 12, 12])
Y =np.array([78.5, 74.3, 104.3, 87.6, 95.9, 109.2, 102.7, 72.5,
93.1,115.9, 83.8, 113.3, 109.4])
data = pd.DataFrame(np.array([X1, X2, X3, X4, Y]).T, columns = ['X1','X2', 'X3', 'X4', 'Y'])
下一步就是实现forward_selected方法:
def forward_selected(data, response):
#remaining = set(data.columns)
###自变量名称,从DataFrame取出
remaining=list(data.columns)
###从数据里去掉响应变量,作为自变量列表
remaining.remove(response)
selected = []
current_score, best_new_score = 0.0, 0.0
print('-----------初始变量列表:',remaining)
i=1
while remaining and current_score == best_new_score:
scores_with_candidates = [] # 候选的打分列表
###从剩余变量中弹出一个变量迭代加入模型
for candidate in remaining:
formula = "{} ~ 1 + {}".format(response, ' + '.join(selected + [candidate]))
result = smf.ols(formula, data).fit() # 注意与smf.OLS的区别,该处是通过公式构建模型
score = result.rsquared_adj
aic = result.aic
#press准则:Prediction Error of Square Sum
#预测误差平方和
press=np.sum(result.get_influence().resid_press**2)
scores_with_candidates.append((score, candidate))
print('\n模型:',formula,'\n调整后R方:',np.round(score,3),
', AIC:',np.round(aic,3),'PRESS:',np.round(press,3))
###对模型按照score排序,list对象的sort函数是从小到大排序
scores_with_candidates.sort()
###弹出一个变量及其评分,注意list的pop函数是弹出最后一个元素,即最大评分的自变量组合
best_new_score, best_candidate = scores_with_candidates.pop()
###通过rsquared_adj比较模型自变量增减前后的模型效果。
###如果rsquared_adj增加,则从selected中移除候选模型,增加新的最佳模型。
if current_score < best_new_score:
remaining.remove(best_candidate)
selected.append(best_candidate)
current_score = best_new_score
print('-----------remaining',i,'-',remaining)
print('+++++++++++selected',i,'-',selected)
i=i+1
formula = "{} ~ 1+ {}".format(response,' + '.join(selected))
model = smf.ols(formula, data).fit()
return model,scores_with_candidates
调用这个方法得出逐步回归的过程和结果:
model, swc = forward_selected(data, 'Y')
model.summary()
考察回归参数的显著性检验,X4的回归系数P值(0.205)远大于0.05,说明该系数不显著。同样,X2的显著性也十分可疑。
下面我们尝试去掉显著性最差的X4,尝试Y = 1 + X1 + X2 进行验证:
formula='Y~X1+X2'
result=smf.ols(formula,data=data).fit()
print(result.summary())
# PRESS(预测误差平方和)统计量 Leave One Observation Out具体在后续文章中说明
press = np.round(np.sum(result.get_influence().resid_press**2),3)
print('\n模型Y~X1+X2的PRESS:',press)
结果显示,回归参数的显著性都十分明显。调整后的值略有下降但可以接受。AIC值略有上升,上升不明显也可以接受。同理,PRESS的变化也可以接受。
注意:回归模型参数的t检验值非常重要,其显著性直接显示了模型的好坏。
结论:Y ~ X1+ X2 是最佳模型。
该笔记为个人的学习笔记,难免存在疏漏和错误。如有错误,请帮忙指出,谢谢!