1. 注意事項
一元線性回歸模型對異常值比較敏感,應考慮在生成方程前對數據進行預處理。
對於回歸分析的相關定義,請參考:
2. MATLAB中的相關函數
直接使用regress函數或polyfit函數都可直接獲得表示預測變量與響應變量線性關系的方程的系數
2.1 regress函數
函數說明:多元線性回歸函數
詳細說明請參考:
https://ww2.mathworks.cn/help/stats/regress.html
[b,bint,r,rint,status] = regress(Y,X,alpha);
等式右邊:
- Y——響應變量數據( n×1 數值向量 )
- X——預測變量數據( n×p 數值矩陣。X 的行對應於各個觀測值,列對應於預測變量 )
- alpha——顯著性水平
等式左邊:
- b——系數估計值( p×1 向量,其中 p 是 X 中預測變量的數目 )
- bint——系數估計值的置信區間 ( 置信邊界下限和置信邊界上限 )( p×2 矩陣,其中 p 是 X 中預測變量的數目 )
- r——殘差( p×1 向量,其中 p 是 X 中預測變量的數目 )
- rint——殘差的置信區間( 診斷離群值的區間 )( p×2 矩陣,其中 p 是 X 中預測變量的數目 )
參數說明:
- 如果status中的第一個參數R^2接近於1且第三個參數P值小於0.05,則響應Y和X中的預測變量之間存在顯著的線性回歸關系
- 如果觀測值 i 的 rint(i,:) 區間不包含零,即表明存在離群值
使用示例:
% 女子身高和腿長數據 height = [143;145;146;147;149;150;153;154;155;156;157;158;159;160;162;164]; leg_length = [88;85;88;91;92;93;93;95;96;98;97;96;98;99;100;102]; % 使用身高預測腿長(X是固定格式) X=[height,ones(length(height),1)]; Y=leg_length; alpha = 0.05;
% 注意regress函數中的預測變量和響應變量必須是列向量 [b,bint,r,rint,status] = regress(Y,X,alpha)
函數說明:多項式曲線擬合函數
詳細說明請參考:
https://ww2.mathworks.cn/help/matlab/ref/polyfit.html
常用方式:
[p,S] = polyfit(X,Y,degree);
等式右邊:
- X——預測變量數據( 列向量 )
- Y——響應變量數據( 列向量 )
- degree——多項式p的次數( 多項式擬合的次數 )( >0 )
等式左邊:
- p——最小二乘擬合多項式系數( 長度為 n+1,包含按降冪排列的多項式系數,最高冪為 n )
- S——誤差估計結構體
參數說明:
使用示例:
% 女子身高和腿長數據 height = [143;145;146;147;149;150;153;154;155;156;157;158;159;160;162;164]; leg_length = [88;85;88;91;92;93;93;95;96;98;97;96;98;99;100;102]; degree = 1; [p,S] = polyfit(height,leg_length,degree);
2.3 polyconf函數
函數說明:計算多項式的置信區間函數
詳細說明請參考:
https://ww2.mathworks.cn/help/stats/polyconf.html
常用方式:
[Y1,DELTA1] = polyconf(p,xdata,S,'predopt','observation');
[Y2,DELTA2] = polyconf(p,xdata,S,'alpha',alpha,'predopt','curve');
等式右邊:
- p——最小二乘擬合多項式系數
- xdata——預測變量數據( 列向量 )
- S——誤差估計結構體
- 'predopt'—— 'observation' (默認值)用於計算X值處的新觀測值的預測區間,或 'curve' 用於計算X值處的擬合值的置信區間
等式左邊:
- Y——在 x 中的每個點處計算多項式 p 所得的新觀測值( 擬合值 )
- DELTA——當輸入參數 'predopt' 的值為 'observation' 時,得到的是用於計算X值處的新觀測值的預測區間;當輸入參數 'predopt' 的值為 'curve' 時,得到的是用於計算X值處的擬合值的置信區間
說明:
預測區間和置信區間的相關概念請參考百度百科和:
https://www.zhihu.com/question/263893098
使用示例:
% 女子身高和腿長數據 height = [143;145;146;147;149;150;153;154;155;156;157;158;159;160;162;164]; leg_length = [88;85;88;91;92;93;93;95;96;98;97;96;98;99;100;102]; % xdata將預測變量以列向量的形式表示
xdata = reshape(height,[length(height),1]); alpha = 0.05; % 設定多項式的次數 degree = 1; % 多項式曲線擬合a=polyfit(x,y,n): x是預測變量,y是響應變量,a是次數為n的多項式的系數 [p,S] = polyfit(height,leg_length,degree); % 輸出S(誤差估計結構體)給出Y的95%預測區間Y±DELTA [Y1,DELTA1] = polyconf(p,xdata,S,'alpha',alpha,'predopt','observation'); % 輸出S(誤差估計結構體)給出Y的95%置信區間Y±DELTA [Y2,DELTA2] = polyconf(p,xdata,S,'alpha',alpha,'predopt','curve');
2.4 polyval函數
函數說明:多項式計算函數
詳細說明請參考:
https://ww2.mathworks.cn/help/matlab/ref/polyval.html#d120e898668
常用方式:
[y,delta] = polyval(p,x,S)
等式右邊:
- p——最小二乘擬合多項式系數( 長度為 n+1,包含按降冪排列的多項式系數,最高冪為 n )
- x——預測變量數據( 列向量 )
- S——誤差估計結構體
等式左邊:
- y——在 x 中的每個點處計算多項式 p 所得的結果
- delta——預測的標准誤差,以標量形式返回。通常,區間 y ± Δ 對應於大型樣本的未來觀測值約 68% 的預測區間,y ± 2Δ 對應於約 95% 的預測區間
使用示例:
% 女子身高和腿長數據 height = [143;145;146;147;149;150;153;154;155;156;157;158;159;160;162;164]; leg_length = [88;85;88;91;92;93;93;95;96;98;97;96;98;99;100;102]; % 設定多項式的次數 degree = 1; [p,S] = polyfit(height,leg_length,degree); % 多項式曲線擬合的響應值數組 [preresult,delta]=polyval(p,height,S);
3. 散點圖+趨勢線+95%預測區間 或 95%置信區間
使用示例:
% 輸出S(誤差估計結構體)給出Y的95%預測區間Y±DELTA
[Y1,DELTA1] = polyconf(p,xdata,S,'alpha',alpha,'predopt','observation');
hold on; plot(height,leg_length,'k+',height,preresult,'r'); % 95%預測區間 plot(xdata,Y1+DELTA1,'b--'); plot(xdata,Y1-DELTA1,'b--'); legend('Data','Linear Fit','95% Prediction Interval'); xlabel('身高'); ylabel('腿長'); hold off;
% 輸出S(誤差估計結構體)給出Y的95%置信區間Y±DELTA
[Y2,DELTA2] = polyconf(p,xdata,S,'alpha',alpha,'predopt','curve');
hold on; plot(height,leg_length,'k+',height,preresult,'r'); % 95%置信區間 plot(xdata,Y2+DELTA2,'b--'); plot(xdata,Y2-DELTA2,'b--'); legend('Data','Linear Fit','95% Confidence Interval'); xlabel('身高'); ylabel('腿長'); hold off;
% 女子身高和腿長數據 height = [143;145;146;147;149;150;153;154;155;156;157;158;159;160;162;164]; leg_length = [88;85;88;91;92;93;93;95;96;98;97;96;98;99;100;102]; % 使用身高預測腿長(X是固定格式) X=[height,ones(length(height),1)]; Y=leg_length; alpha = 0.05; [b,bint,r,rint,status] = regress(Y,X,alpha); % 通過計算不包含 0 的殘差區間 rint 來診斷離群值。 contain0 = (rint(:,1)<0 & rint(:,2)>0); idx = find(contain0==false); hold on scatter(Y,r); % 填充離群值對應的點 scatter(Y(idx),r(idx),'b','filled'); xlabel('腿長'); ylabel('殘差'); hold off