![ba98de937549e61653b5511994ddacbb.png](https://i-blog.csdnimg.cn/blog_migrate/a2226ac68a2e9f05426b9c94dc2a25f8.png)
一、概念
回归分析(regression analysis)是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。运用十分广泛,回归分析按照涉及的自变量的多少,分为回归和多重回归分析;按照自变量的多少,可分为一元回归分析和多元回归分析;按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。如果在回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多重线性回归分析。 回归分析是对具有因果关系的影响因素(自变量)和预测对象(因变量)所进行的数理统计分析处理。只有当变量与因变量确实存在某种关系时,建立的回归方程才有意义。因此,作为自变量的因素与作为因变量的预测对象是否有关,相关程度如何,以及判断这种相关程度的把握性多大,就成为进行回归分析必须要解决的问题。进行相关分析,一般要求出相关关系,以相关系数的大小来判断自变量和因变量的相关的程度。二、目的
回归分析的目的大致可分为两种: 第一,“预测”。预测目标变量,求解目标变量y和说明变量(x1,x2,…)的方程。 y=a0+b1x1+b2x2+…+bkxk+误差(方程A) 把方程A叫做(多元)回归方程或者(多元)回归模型。a0是y截距,b1,b2,…,bk是回归系数。当k=l时,只有1个说明变量,叫做一元回归方程。根据最小平方法求解最小误差平方和,非求出y截距和回归系数。若求解回归方程.分別代入x1,x2,…xk的数值,预测y的值。 第二,“因子分析”。因子分析是根据回归分析结果,得出各个自变量对目标变量产生的影响,因此,需要求出各个自变量的影响程度。三、求解
根据最小二乘法求解y=a+bx中的a和b。那么什么是最小二乘法?分别从散点图的各个数据标记点,做一条平行于y轴的平行线,相交于图中直线(如下图)四、步骤
线性回归的步骤不论是一元还是多元相同,步骤如下: 1、散点图判断变量关系(简单线性); 2、求相关系数及线性验证; 3、求回归系数,建立回归方程; 4、回归方程检验; 5、参数的区间估计; 6、预测;五、评价
我们画出的拟合直线只是一个近似,因为肯定很多的点都没有落在直线上,那么我们的直线拟合程度到底怎么样呢?在统计学中有一个术语叫做R^2(coefficient ofdetermination,中文叫判定系数、拟合优度,决定系数( R^2是“R的平方”),用来判断回归方程的拟合程度。 总偏差平方和(又称总平方和,SST,Sum of Squaresfor Total):是每个因变量的实际值(给定点的所有Y)与因变量平均值(给定点的所有Y的平均)的差的平方和,即,反映了因变量取值的总体波动情况。如下:![98ffa374be0ef7b5e0bf9699d67f8d55.png](https://i-blog.csdnimg.cn/blog_migrate/bf78f32937a4c728db06c5ad16b2d03f.png)
![c44a08b67d2e440a6252f54dac3a76f9.png](https://i-blog.csdnimg.cn/blog_migrate/c7dc32ff2d14c43ce21540a047282074.png)
六、变量的显著性检验
变量的显著性检验的目的:剔除回归系数中不显著的解释变量(也就是X),使得模型更简洁。在一元线性模型中,我们只有一个自变量X,就是要判断X对Y是否有显著性的影响;多元线性回归中,验证每个Xi自身是否真的对Y有显著的影响,不显著的就应该从模型去掉。 变量的显著性检验的思想:用的是纯数理统计中的假设检验的思想。对Xi参数的实际值做一个假设,然后在这个假设成立的情况下,利用已知的样本信息构造一个符合一定分布的(如正态分布、T分布和F分布)的统计量,然后从理论上计算得到这个统计量的概率,如果概率很低(5%以下),根据“小概率事件在一次实验中不可能发生”的统计学基本原理,现在居然发生了!(因为我们的统计量就是根据已知的样本算出来的,这些已知样本就是一次实验)肯定是最开始的假设有问题,所以就可以拒绝最开始的假设,如果概率不低,那就说明假设没问题。 T检验用于对某一个自变量Xi对于Y的线性显著性,如果某一个Xi不显著,意味着可以从模型中剔除这个变量,使得模型更简洁。 F检验用于对所有的自变量X在整体上看对于Y的线性显著性 T检验的结果看P-value,F检验看Significant F值,一般要小于0.05,越小越显著(这个0.05其实是显著性水平,是人为设定的,如果比较严格,可以定成0.01或0.1)七、代码
Python版本(预测为例)
Step 1: Data Preprocessing
Importing the libraries
importpandasaspd
importnumpyasnp
Importing the dataset
dataset=pd.read_csv('50_Startups.csv') #CSV文件,修改成自己要用的文件名
X=dataset.iloc[ : , :-1].values #读取自变量数据
Y=dataset.iloc[ : , 4 ].values #读取因变量数据
以下两步,部分问题不涉及编码不需要
Encoding Categorical data
fromsklearn.preprocessingimportLabelEncoder, OneHotEncoder
labelencoder=LabelEncoder()
X[: , 3] =labelencoder.fit_transform(X[ : , 3])
onehotencoder=OneHotEncoder(categorical_features= [3])
X=onehotencoder.fit_transform(X).toarray()
Avoiding Dummy Variable Trap
X=X[: , 1:]
Splitting the dataset into the Training set and Test set
fromsklearn.cross_validationimporttrain_test_split
X_train, X_test, Y_train, Y_test=train_test_split(X, Y, test_size=0.2, random_state=0)#分训练集和测试集,测试集比例根据需要修改,一般为0.2-0.3
Step 2: Fitting Multiple Linear Regression to the Training set
fromsklearn.linear_modelimportLinearRegression
regressor=LinearRegression()#导入线性回归
regressor.fit(X_train, Y_train)#训练集拟合
Step 3: Predicting the Test set results
y_pred=regressor.predict(X_test)#拟合好的模型用于预测
Step 4: Test
from sklearn.metrics import r2_score
score = r2_score(y_test,y_pred)#拟合优度检验
y_mean = np.mean(y_test)
n = len(y_test)
k = np.size(X_test,1)
TSS = sum((y_test-y_mean)**2)#总离差平方和
ESS = sum((y_pred-y_mean)**2) #回归平方和
RSS = sum((y_pred-y_test)**2) #残差平方和
R2 = 1-RSS/TSS
Adjust_R2 = 1-(1-R2)*(n)/(n-k)#调整R2
alpha = 0.05
#回归方程显著性检验 F检验 检验不通过原因有2:1、重要自变量遗漏;2、关系非线性
F = ESS/k/(RSS/(n-k))
critical2 = f.ppf(1-alpha,k,n-k) #双尾 临界值
#输出检验结果
if F>critical2:
print ('the linear regression between x and y is significant')
else:
print('the linear regression between x and y is not significant')
#复相关检验
MC_R2 = np.sqrt(RSS/TSS)#越接近于1越好
#回归系数显著性检验
Cij = np.dot(np.transpose(X_test),X_test)
Cjj = []
t_statistic = []
for i in range(k):
Cjj.append(Cij[i][i])
t_statistic.append(para[i]/(np.sqrt(Cjj[i]*RSS/(n-k))))
# 已知临界值求p值
p = []
for i in range(k):
p.append(t.sf(t_statistic[i], n-k))
for i in range(k):
if p[i]<0.05:
print ('the linear regression between x and y is significant')
else:
print('the linear regression between x and y is not significant')
Step 5: Visualization
Visualising the Training results
plt.scatter(X_train , Y_train, color = 'red')
plt.plot(X_train , regressor.predict(X_train), color ='blue')
Visualizing the test results
plt.scatter(X_test , Y_test, color = 'red')
plt.plot(X_test , regressor.predict(X_test), color ='blue')
matlab 版本
clear;clc;
data=xlsread('jc_p133_example.xlsx','sheet1');%换成自己的数据读取xls/xlsx
xi=data(:,1:end-1);%自变量
[n,k]=size(data);
k=k-1;%自变量个数
index_of_xi_array=ones(1,k);
X=[ones(n,1) xi];%含常数项回归
Y=data(:,end);
fprintf('第1次计算结果:\r')
beta_mao=((X'*X)\X'*Y)'; %最小二乘法估计系数
fmt_str0='';
for i0=1:k+1
fmt_str0=[fmt_str0 'β' num2str(i0-1) ' = %0.4f\r'];
end
fprintf(fmt_str0,beta_mao)
fprintf('\r')
%%检验回归方程的显著性
x_ba=mean(xi);
y_ba=mean(Y);
St_square=sum(Y.^2)-n*y_ba^2;
lxy=sum((xi-ones(n,1)*x_ba).*((Y-y_ba)*ones(1,k)));
Sr_square=sum(beta_mao(2:end).*lxy);
Se_square=St_square-Sr_square;
c_flag=Sr_square/Se_square;
F_alpha=input('>>>>>>请输入您要求的显著性水平(0
while ~(isscalar(F_alpha) && F_alpha<1 && F_alpha>0)
F_alpha=input('您的输入有误,请重新输入一个大于0,小于1的数,α= ');
end
F_fenweidian=finv(1-F_alpha,k,n-k-1);
c=k/(n-k-1)*F_fenweidian;
if c_flag>c
fprintf(['\r--------------------回归方程显著性检验(H0:β1=β2=...=βk=0)' ...
'--------------------\r经过计算:拒绝H0,原假设不成立。'])
else
fprintf(['\r--------------------回归方程显著性检验(H0:β1=β2=...=βk=0)' ...
'--------------------\r经过计算:接受H0,原假设成立。'])
end
%%检验回归系数的显著性(循环检验,直到OK,得出最后结果)
fprintf(['\r\r-----------------回归系数显著性检验(分别对β1、β2、...、βk进行)' ...
'------------------'])
flag_go_on=1;
num_of_loop=0;
while flag_go_on
cij=inv(X'*X);
cii=diag(cij);
F_fenweidian_1=finv(1-F_alpha,1,n-k-1);
ci=sqrt(cii(2:end)*Se_square*F_fenweidian_1/(n-k-1));
format_str='%15.4f';
for ii=1:k-1
format_str=[format_str '%13.4f'];
end
fprintf(['\r第%d次检验:\rcii: ' format_str '%13.4f\r ci: ' ...
format_str '\rβi:' format_str '%13.4f'],num_of_loop+1,cii,ci,beta_mao)
if ~all(abs(beta_mao(2:end))>ci')
flag_go_on=1;
beta_1tok=beta_mao;
beta_1tok(1)=[];
fi_xin=beta_1tok.^2./cii(1:end-1)';
min_fi=min(fi_xin);
beta_index=find(fi_xin==min_fi)+1;
fprintf('\rx%d对y的线性影响最不显著( |β%d|=%0.4f )。删除x%d,进行第%d次计算:',...
beta_index-1+num_of_loop,beta_index-1+num_of_loop,...
abs(beta_mao(beta_index)),beta_index-1+num_of_loop,...
beta_index-1+num_of_loop+1)
else
fmt_str2='x%d';
index_of_xi=find(index_of_xi_array);
for i2=1:length(find(index_of_xi))-1
fmt_str2=[fmt_str2 '、x%d'];
end
fprintf(['\r\r经过检验,剩余所有变量:' ...
fmt_str2 '对y的线性影响均显著。检验结束。\r'],index_of_xi)
flag_go_on=0;
end
if flag_go_on
num_of_loop=num_of_loop+1;
k=k-1;
if ~k
fprintf('\r\r警告:通过一一对所有变量做显著性检验,已剔除所有变量!');
break;
end
beta_mao=beta_mao-beta_mao(beta_index)/cii(beta_index)*cij(beta_index,:);
beta_mao(beta_index)=[];
fmt_str1='';
for i1=2:k+1
fmt_str1=[fmt_str1 'β' num2str(i1-1+num_of_loop) ' = %0.4f\r'];
end
fprintf(['\rβ0 = %0.4f\r' fmt_str1],beta_mao)
X(:,beta_index)=[];
index_of_xi_array(beta_index-1+num_of_loop-1)=0;
xi=X(:,2:end);
x_ba=mean(xi);
lxy=sum((xi-ones(n,1)*x_ba).*((Y-y_ba)*ones(1,k)));
Sr_square=sum(beta_mao(2:end).*lxy);
Se_square=St_square-Sr_square;
end
end
文字 | 原创
图片 | 可商用
文字请替换
一个分享AI学习的公众号
欢迎订阅,一起学习,一起交流