公告

[公告]
2014/01/17
由於已經是faculty的關係,不太有足夠時間寫部落格。因此更新的速度會相當緩慢。再加上近幾年來SAS GLOBAL FORUM沒有出現讓我覺得驚艷的技術文件,所以能分享的文章相對也減少許多。若有人推薦值得分享的SAS技術文件,請利用『問題討論區』告知。

2013/07/19
臉書留言板的功能因為有不明原因故障,因此特此移除。而intensedebate的留言板因管理不易,也一併移除。目前已經開啟內建的 G+ 留言系統,所以請有需要留言的朋友,可直接至『問題討論區』裡面留言。


2007年6月12日 星期二

Solutions to Violations of Assumptions of Ordinary Least Squares Regression Models Using SAS®

原文載點:http://www2.sas.com/proceedings/forum2007/131-2007.pdf

筆者從事模式配適這檔子事情多年,最讓我感到困擾的模式倒不是 mixed model,而是一般人在大學時代修統計學時都會上過的線性迴歸模式。他難的地方不在模式配適的過程,而是在模式檢定步驟。由於整個線性迴歸模式是架構在許多相當嚴苛條件下,因此只要有任何一個假設條件不滿足原始的設定,那估計出來的參數、估計標準差、信賴區間和檢定都有可能是有偏誤的。無奈看過許多使用迴歸模式的研究報告,大部分的人都自動省略模式假設的檢定步驟,讓我對整篇報告打上大大個問號。當然,我瞭解許多非統計背景出身的學者可能不瞭解事情的嚴重性,或者覺得若要一一照著教科書上來做則根本不可能配出一個像樣的迴歸模式。但本著學術良知,我還是誠懇地建議這一步驟千萬不要省略。如果只想貪圖速成(迴歸模型的配適的確很快),那我通常會建議對方用其他模式去試看看。如果非用迴歸不可,那我就會先替他們做好心理建設。因為接下來有很多困難必須去面對,絕對不可能像教科書上的範例一樣那麼完美。

回到正題,迴歸模式的四大設訂不外乎是:一、線性,二、獨立,三、常態,四、變異數同質性。除了這四個假設是絕對不能違反以外,「共線性」也是一個不可忽略的問題,尤其當自變數相當多的時候。Leonor Ayyangar 在 SAS GLOBAL FORUM 2007 發表了一篇技術文件,一一說明如何用 SAS 來檢查上述四大設定和共線性,並提出當違反設定時的可能解決方法。

ASSUMPTION 1: LINEARITY

線性迴歸模式,從字面上看來,「線性」是他最主要的特徵。而線性的定義,是依變數和所有自變數間具有線性的關係。當使用簡單線性迴歸時,可以使用最簡單的 PROC CORR 來檢定 X 和 Y 是否具有線性關係。當使用複迴歸時,則需要看 partial residual plot。在 PROC REG 中,只需要在 model statement 後面加上 partial 這個 option 即可,如下所示:
PROC REG data=cabgdata;
MODEL dsur_tot = totmin iopktrf rbc savebld toticu age numcomplic / partial;
TITLE’ Graphical Test of Linearity Assumption’;
QUIT;


當線性關係不存在時,最明顯的影響是會導致參數估計值產生偏誤。另一方面,R-square 值也會被低估。有幾個方法可以來解決這個問題:

一、將某些自變數分群,並把分群後的每一組都設定成一個 dummy variable。如果分成五群,則需產生四個 dummy variable 在模式裡面。
二、對自變數做變數變換。常見的變數變換有 log, inverse 或 polynomial。另外,spline transformation(使用 PROC TRANSREG)也是個不錯的點子。
三、使用非線性模式,如 PROC GENMOD。

ASSUMPTION 2: INDEPENDENCE OF ERROR TERMS


第二個假定是迴歸模式的誤差項一定是需要互相獨立的。如果不是獨立的話,則表示該模式有自相關(autocorrelation)的情況。

要檢定模式是否有自相關,則可對殘差進行 Durbin-Watson 檢定(簡稱 DW)。另外也可以做一張殘差和時間相關自變數的圖。如果沒有自相關的情況,則圖上的點不會呈現特殊的趨勢。程式如下所示:
PROC REG data=cabgdata;
MODEL dsur_tot = totmin rbc savebld toticu age numcomplic/dw;
OUTPUT OUT=autocorr_test (keep= timepd res)
RESIDUAL=res;
TITLE’ Durbin-Watson Test of Autocorrelation';
QUIT;

PROC PLOT data=autocorr_test;
PLOT RES*timepd;
TITLE’Graphical test of autocorrelation’;
QUIT;


另外,也可以使用 Lagrange Multiplier general test 來檢查。程式如下所示:
PROC REG data=in.sampledata;
MODEL dsur_tot = totmin rbc savebld toticu age numcomplic;
TITLE’Output Residuals and Calculate their Lagged Values’;
OUTPUT OUT=outres
RESIDUAL=res;
DATA LMTest;
SET outres;
lagresid=lag(res);
label lagresid='lagged residual';
PROC REG;
MODEL res = totmin rbc savebld toticu age numcomplic lagresid;
TITLE’Lagrange Multiplier Test of Serial Correlation (Ho: No serial correlation)’;
QUIT;


自相關會導致 T 統計量膨脹,使得估計係數的標準誤被低估。如此一來則參數的假設檢定會是錯誤的。遇到這種情況的話有幾個解決的方法:

一、作者提到不要只相信 DW test 的結果,而要去綜合地比較其他獨立性檢定。他推薦下面這個教科書中的 p.142 可提供更詳盡的說明:

Kennedy, Peter. (1992). A Guide to Econometrics. Cambridge, MA: Massachusetts Institute of Technology Press. Neter, Wasserman, and Kunter (1990). Applied Linear Statistical Models, 3rd ed., Irwin.

二、對自變數或依變數做 lag 變數變換(注意!是 lag,不是 log)。
三、考慮 time series model(使用 PROC AUTOREG)。

ASSUMPTION 3: εi ~ N(0,σ2)


誤差項需服從常態分配,應該是這幾個假設中最最最重要的一項。此外,變異數同質性也是不可忽略的(但卻經常被忽略!)。要檢定常態性,則必須將殘差抓出來進行 Shapiro-Wilk test 或 Kolmogorov-Smirnov test。Q-Q plot 也可以當作輔助判斷工具。這些檢定都可以用 PROC UNIVARIATE 完成,如下所示:
PROC REG data=cabgdata;
MODEL dsur_tot = totmin rbc savebld toticu age numcomplic;
OUTPUT OUT=outres
RESIDUAL=res PREDICTED=Yhat;
QUIT;

PROC UNIVARIATE data=outres normal;
VAR res;
HISTOGRAM res / normal;
PROBPLOT res;
TITLETests for Normality of Residuals';
QUIT;


欲檢驗模式是否有異質性(heteroskedasticity)的問題,可以進行 White test(在 model statement 後面加上 spec),或者去繪製殘差 v.s. 預測值的圖:
PROC REG data=in.cohort;
MODEL dsur_tot = totmin rbc savebld toticu age numcomplic/spec;
TITLE ’White Test of Heteroskedasticity’;
QUIT;


違反上述這兩個假設,幾乎可以宣判該迴歸模式死刑!因為所有的估計值和檢定都會因為這兩個假定違反而產生完全錯誤的結果,後果相當嚴重。解決方法有:

一、對依變數做變數變換。常見的變數變換為 square root, log 和 reciprocal。此外,作者也推薦使用 Duan's smearing operator。關於這個東西,詳見下面這個 paper:

Duan N. Smearing estimate: a nonparametric retransformation method. Journal of the American Statistical Association 1983;78:605-610.

二、使用加權最小平方法(Weighted Least Square)。在 SAS code 裡面是加上一行 weight statement,然後指定要加權的自變數。
三、考慮 robust regression(詳見 PROC ROBUSTREG)。

ASSUMPTION 4 : MEAN INDEPENDENCE : E[εi |Xij]=0


這個假定比較少人知道。在計量經濟學裡面,違反這個假定則稱為 endogeneity(中文不知道該怎樣翻譯)。若違反這個假定,可能會導致參數估計值偏誤。在 PROC REG 中,同樣使用 SPEC option 可產生相關的檢定數據。若違反這個假定,作者推薦改用 PROC SYSLIN 去做調整。

ASSUMPTION 5: Xi IS UNCORRELATED TO Xj , i ≠ j

其實這個假定若出現問題,則共線性的問題就跟著跑了出來。因此簡而言之,這部分就是在檢定模式是否具有共線性(或稱多重共線性)。在迴歸模式中,可使用變異數膨脹係數(VIF)或容忍值(tolerance)來當作判定共線性是否存在的標準。一般來說,VIF 大於 10 或 tolerance 小於 0.1 則表示有共線性的問題。在 SAS 內計算這兩個值只需要在 model statement 後面加上 VIF 和 tol 這兩個 option 即可,如下所示:
PROC REG data=in.sampledata;
MODEL tcst_tot = tsur_tot age los /vif tolerance collinoint;
TITLE’ Test for Multicollinearity’;
QUIT;


若一個迴歸模式有共線性的問題,最容易產生的麻煩就是會讓自變數的估計參數產生異常的變動。根據筆者的經驗,在迴歸模式中最容易看出受到共線性影響的地方是,一個按照常理應該是「正」的估計參數(也就表示那個 X 和 Y 是正相關),結果估出來的係數是負的!以下有幾個方法可以解決共線性的問題:

一、適度移除幾個具有互相高度相關的自變數。
二、移除全部具有互相高度相關的自變數,而改用其交互作用項。
三、增加樣本數。
四、(這是我自己加的)使用主成分(principal components)或山脊型迴歸法(ridge regression procedure)來進行迴歸分析。其中,利用主成分來進行迴歸分析是一個相當具有高難度的技術。即利用多變量分析中的主成分分析法將所有自變數統整濃縮成幾個具有代表性的主成分因子,並重新命名(這部分是個「藝術」,相當具有挑戰性)。最後裡用這些重新命名後的主成分因子來配適迴歸模型。

總而言之,上述所有的檢定都可以利用 SAS 輕鬆完成,但困難地方在於當假定違反時該如何去進行調整。這還牽涉到一個更深入的問題,就是當利用變數變換來進行調整後,做出來的新的迴歸模式是不是(或能不能)做出合理解釋。這一切的一切都仰賴經驗的累積,非一朝一夕能夠學起。有志於大量使用線性迴歸來進行研究的朋友們,我只能說:God bless you。

CONTACT INFORMATION
Your comments and questions are valued and encouraged. Contact the author at:
Leonor Ayyangar
Health Economics Resource Center (HERC)
Palo Alto VA Health Care System
795 Willow Road, (152 MPD)
Menlo Park, CA 94025
Phone: (650) 493-5000 Ext. 22338
E-mail: Leonor.Ayyangar@va.gov

6 則留言:

  1. 你好
    想請問你在SAS下 如何使用GLS呢
    要如何在SAS下打指令??
    麻煩你了 謝謝

    回覆刪除
  2. 你是要跑什麼程序?如果是proc reg,那就用weight來控制(就是加權),如果是proc calis,那就在後面加上method=gls即可。

    回覆刪除
  3. 您好!我想請問運用Logistic Regression如何計算研究樣本數?

    回覆刪除
  4. SAS內建的PROC POWER和PROC GLMPOWER沒有辦法處理你的問題。你可以用Dr. Ralph O'Brien所寫的UnifyPow這個巨集程式來完成。原始碼和教學文件在:
    http://www.bio.ri.ccf.org/power.html

    回覆刪除
  5. 你好,發現了這個寶藏,要像你致向十二萬分的敬意與謝意。
    請問我用PROC GAM時,如何下指令可以進行Power of test? 或此程序有提供一些統計量值的計算可最為後續Model selection 的依據嗎?
    知道你在忙論文,加油!

    回覆刪除
  6. 目前所知 SAS 內建的 PROC POWER 和 PROC GLMPOWER 都不支援 GAM 的 power analysis。我也沒看過有人寫出類似的 macro program 過(連理論都沒看過)。至於 model selection 的部分,SAS 也沒提供,不過 R 的 gam() function 倒是可以算出 AIC 值。這是目前我所知道唯一可以拿來在 GAM 底下做 model selection 的工具。我會幫你密切注意有沒有人在 SUGI 發表相關的技術文件,屆時會再公布出來。

    回覆刪除

要問問題的人請在文章下方的intensedebate欄位留言,請勿使用blogger預設的意見表單。今後用blogger意見表單留言的人我就不回應了。

CODE { display: block; /* fixes a strange ie margin bug */ font-family: Courier New; font-size: 8pt; overflow:auto; background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y; border: 1px solid #ccc; padding: 10px 10px 10px 21px; max-height:200px; height:200px; // for IE6 line-height: 1.2em; }