數據預處理->數據探索->模型選擇->殘差檢驗、共線性爭端,強影響點判斷->模型修正(否->模型選擇,是->模型預測)
一:數據預處理
二:數據探索
看y是否服從正態分布(PP圖)
proc univariate data=reg.b_fitness; var Runtime -- Performance; histogram Runtime -- Performance / normal; /*主要從統計指標上面看*/ probplot Runtime -- Performance /normal (mu=est sigma=est color=red w=2);/*主要從圖形來看*/ run;
看x的離散程度(散點圖)
看y與x的相關系數(散點圖,R^2)
proc gplot data=reg.b_fitness; plot Oxygen_Consumption *(Run_Pulse Rest_Pulse Maximum_Pulse Performance Runtime Age Weight ); symbol v=dot color=red; run; quit; proc corr data=reg.b_fitness; var Run_Pulse Rest_Pulse Maximum_Pulse Performance Runtime Age Weight; with Oxygen_Consumption; run;
三:模型選擇
CP法(全模型法)
功能:在特定的模型大小范圍內,找出指定的最佳模型(具有最小CP)
BEST=N 表示在不同的變量個數組成的模型中,選擇N個最好的模型,所有組合數為[2^(變量個數)-1]
在由1個自變量組成的模型中選N個最好的
在由2個自變量組成的模型中選N個最好的
。。。。。。。。。。。
在由M(總共變量的個數)個自變量組成的模型中選N個最好的
總共會選M*N個模型
這里統計量為Cp,建議是Cp<=p ,p是所有變量個數加1
逐步法
向前回歸法
特點:和變量進入的順序有很大關系,如果第一個進來的變量的解釋效應過大,很可能造成后進的變量進不來模型
引入第一個變量進入方程,對整個方程進行F檢驗,並對單個回歸系數進行T檢驗,計算殘差平方和Se1,如果通過檢驗則保留,否則剔除
引入第二個變量進入方程,對整個方程進行F檢驗,並對單個回歸系數進行T檢驗,計算殘差平方和Se2,那么Se1>Se2,稱Se1-Se2為第二個變量的偏回歸平方和,如果該值明顯偏大,則保留,說明其對因變量有影響,否則剔除。
。。。。
直到引入所有變量
向后回歸法
特點:和向前一樣,和變量的離開順序有關
和向前回歸相反,首先引入所有變量,然后再一個一個的根據(偏回歸平方和)刪除不顯著的變量
逐步回歸法
綜合向前和向后的特性
引入變量時需要利用(偏回歸平方和)進行顯著性檢驗
當方程加入變量后,又要對原有的老變量利用(偏回歸平方和)進行檢驗,一旦某變量不顯著則要進行刪除。
直到所有老變量不能被刪除,新變量不能被加入為止
proc reg data=reg.b_fitness; title 'full model'; reg_full: model Oxygen_Consumption = Performance Runtime Age Weight Run_Pulse Rest_Pulse Maximum_Pulse /selection=rsquare adjrsq cp best=4; /*選擇adjrsq高的模型 且cp<=p的模型,根據需求多選幾組*/ title 'step model'; forward: model Oxygen_Consumption = Performance Runtime Age Weight Run_Pulse Rest_Pulse Maximum_Pulse /selection=forward; backward: model Oxygen_Consumption = Performance Runtime Age Weight Run_Pulse Rest_Pulse Maximum_Pulse /selection=backward; stepwise: model Oxygen_Consumption = Performance Runtime Age Weight Run_Pulse Rest_Pulse Maximum_Pulse /selection=stepwise; run;
四:模型診斷
1:殘差檢驗
方法:主要就是看圖,如果基本上是帶狀,說明就是正態分布了,其他奇怪的形狀就要再做考慮了
學生化殘差(Student residual):殘差除以標准誤
1.1:如果是小樣本,該值在-2~+2之間。
1.2:如果是大樣本,該值在-3~+3之間。
2:強影響點判斷
可以根據如下四個統計量
2.1:學生化殘差(Student residual也叫標准化殘差近似服從~N(0,1)),當殘差過大,表明樣本點到擬合之前的鉛直距離比較大,即為異常點(大小標准同上),這是針對於響應變量。
2.2:pii針對自變量,pii過大,表明xi與x的矩陣距離過遠,一般設定閾值0.2進行篩選
2.3:Cook's D:衡量第i個觀測被刪除后,對回歸估計系數的影響度
2.4:RStudent residual:不含該觀測所擬合模型給出的學生化殘差
2.5:DFFITS:衡量第i個觀測被刪除后,對應預測值的標准化影響度
3:共線性診斷
方差膨脹因子:VIF
VIF>3表明有共線性,共線性變量時成對出現,若有,要根據需求選擇去除一個。
/*殘差分析*/ proc reg data=reg.b_fitness; model Oxygen_Consumption = Runtime Age Run_Pulse Maximum_Pulse; plot r.*(p. Runtime Age Run_Pulse Maximum_Pulse);/*假定中殘差與預測變量和響應變量(擬合值)都是獨立的*/ plot student. *obs.;/*如果觀測的順序很重要,這個是很必要的,例如按時間或空間順序得到的觀測*/ plot nqq.*student.; symbol v=dot color=red; run; quit; /*強影響點判斷*/ proc reg data=reg.b_fitness; PREDICT: model oxygen_consumption = runtime age run_pulse maximum_pulse / r influence; id name; output out=ck4outliers rstudent=rstud dffits=dfits cookd=cooksd; title; run; quit; /* set the values of these macro variables, */ /* based on your data and model. */ %let numparms = 5; /* # of predictor variables + 1 */ %let numobs = 31; /* # of observations */ %let idvars = name; /* relevant identification variable(s) */ /*EM模塊中的程序*/ data influential; set ck4outliers; cutdifts = 2*(sqrt(&numparms/&numobs)); cutcookd = 4/&numobs; rstud_i = (abs(rstud)>3); dfits_i = (abs(dfits)>cutdifts); cookd_i = (cooksd>cutcookd); sum_i = rstud_i + dfits_i + cookd_i; if sum_i > 0; run; /****3.共線性診斷***/ proc reg data=reg.b_fitness; FULLMODL: model oxygen_consumption = runtime age run_pulse maximum_pulse / vif collin collinoint; /*vif成對出現,vif>2即認為有共線性*/ title 'Collinearity -- Full Model'; run; quit;
五:模型修正
如果有強影響點或共線性,則去除,然后再進行模型選擇->三種診斷,再一步步修正,直到所有不好的東西都不出現
六:進行預測
data need_prediction; input Performance @@; datalines; 0 6 6 9 12 ; run; data pre_now; set reg.b_fitness need_prediction; run; proc reg data=pre_now; model Oxygen_Consumption = Performance / p; /*表示輸出自變量對應的預測值*/ id performance; output out=me p=ic r=ocr; /*out=數據集 p=因變量的預測值 r=殘差*/ run; quit;