SAS隨機抽樣

    在統計研究中,針對容量無限或者容量很大以至於無法直接對其進行研究的總體,都是通過從中抽取一部分個體作爲研究對象,以考察總體的特徵。被抽取的部分個體稱爲該總體的一個樣本。從總體中抽取樣本的過程,稱爲抽樣。

    抽樣包括隨機抽樣和非隨機抽樣。非隨機抽樣是從總體中抽取指定的個體,具有主觀意向性,這裏不做討論。

    隨機抽樣是按照隨機原則,保證個體都有一定概率被抽取到的抽樣方法。常見的隨機抽樣方式有:簡單隨機抽樣、系統抽樣、分層抽樣、整羣抽樣、多階段抽樣、二重抽樣以及比率抽樣。

    以下將依次介紹各種隨機抽樣方法的原理、應用場景及其SAS實現。在論述之前,需要準備好測試數據。我們從互聯網上找了一批數據形成一張表,數據的內容是國內股票市場各只股票的若干財務數據,字段如下:

列名 中文名
StockCode
股票代碼
StockName
股票名稱
Source
來源板塊
EPS
每股收益(元)
EPS_YOY
每股收益同比(%
NAPS
每股淨資產(元)
ROE
淨資產收益率(%
CFPS
每股現金流量(元)
NP
淨利潤(萬元)

該表共有2472條觀測(記錄),按照Source(來源板塊)進行統計,則各組觀測數如下:

創業板             351

滬市主板           948

深市主板           473

中小板             700

數據下載地址:http://pan.baidu.com/share/link?shareid=134615&uk=1258687326

構建程序初始環境:

data_null_;

    workspace       =  "D:\SASWorkspace\練習";    *工作區根目錄;

    call symput("workspace", workspace);

run;

libname Practice"&workspace.\中間數據\";


然後把原始數據上傳到Practice邏輯庫中,並命名爲MainIndex_2012sea3。

*爲了不破壞原始數據,把表copy到work邏輯庫中;

data Work.MainIndex_2012sea3;

    setPractice.MainIndex_2012sea3;

run;


下面逐一介紹各種隨機抽樣方法及其SAS實現。

(1)簡單隨機抽樣

簡單隨機抽樣,指從總體中等概率地抽取出n個個體組成樣本。在SAS中,可以使用surveyselect過程步來實現隨機抽樣。Surveyselect過程步的基本格式如下:

PROC SURVEYSELECT

    DATA=  * 輸入數據集;

    OUT=  * 輸出數據集;

    METHOD=  * 抽樣方法;

    SAMPSIZE=  * 選擇項指定需要抽樣的樣本量;

    SAMPRATE= * ;

    REP=

    SEED=

    NOPRINT;

    ID variable; 指定抽取的樣本所保留的源數據集變量

    STRATA variables;  指定分層變量

    CONTROL variables; 控制變量

    SIZE variables; 不等概抽樣指標變量

RUN;

 

在第一個程序中,我們來實現最簡單的場景:從2472條觀測中隨機抽取100條。在程序中,除了必要的data和out選項外,還需使用method設置抽樣方法爲簡單隨機抽樣,其值爲srs;並設置抽取的樣本容量sampsize = 100或n = 100。代碼如下:

 

*隨機抽取100條記錄,保留所有字段,不打印;

procsurveyselect

    data = Work.MainIndex_2012sea3

    out = Work.MainIndex_2012sea3_srs1

    method = srs

    sampsize =100 /*也可以使用n = 100 */

    noprint

    ;

run;

   

上面的程序對於結果表保留了原始表的所有字段,如果我們只需要保留其中的某幾個字段,則可以使用id語句。

 

*隨機抽取100條記錄,只保留StockCodeStockName字段,不打印;

procsurveyselect

    data = Work.MainIndex_2012sea3

    out = Work.MainIndex_2012sea3_srs2

    method = srs

    sampsize =100

    noprint;

    id StockCode StockName;

run;

 

如果沒有指定隨機數種子(seed),則SAS程序會使用計算機的時間作爲種子。可以使用seed選項設定隨機數初始種子。Seed的值必須是一個正整數,否則SAS會使用計算機的時間作爲種子(零或負整數的情況),或者出錯(小數的情況)。

 

*隨機抽取100條記錄,保留所有字段,不打印;

*指定隨機數種子;

procsurveyselect

    data = Work.MainIndex_2012sea3

    out = Work.MainIndex_2012sea3_srs4

    method = srs

    sampsize =100

    seed =1000

    noprint;

run;

 

在實際應用場景中,有時候需要獨立重複抽取多組樣本,這時可以使用rep選項。SAS程序會以rep設定的值獨立重複抽取若干次樣本,每組樣本的容量是sampsize或n選項指定的值。

 

*隨機抽取100條記錄,保留所有字段,不打印;

*指定獨立重複抽樣的次數;

procsurveyselect

    data = Work.MainIndex_2012sea3

    out = Work.MainIndex_2012sea3_srs5

    method = srs

    sampsize =100

    rep =3

    noprint

    ;

run;

 

樣本容量的另一種表述是其佔總體的比例。比如,抽取10%的樣本。這時我們使用samprate或rate替代sampsize。Samprate的值可以是正小數,也可以是正整數。當samprate的值是正小數時,其值在(0, 1]之間,不可爲零;爲1時表示100%。當samprate是正整數時,表示相應的百分比,如10表示10%,需要注意的是,整數1表示100%,而不是1%。

 

*隨機抽取總體的10%作爲樣本,保留所有字段,不打印;

procsurveyselect

    data = Work.MainIndex_2012sea3

    out = Work.MainIndex_2012sea3_srs6

    method = srs

    samprate =0.1/*也可以使用rate =0.1 */

    noprint

    ;

run;

 

*隨機抽取總體的10%作爲樣本,保留所有字段,不打印;

procsurveyselect

    data = Work.MainIndex_2012sea3

    out = Work.MainIndex_2012sea3_srs7

    method = srs

    samprate =10/*也可以使用rate =10 */

    noprint

    ;

run;

 

有時候,我們並不需要把原始表的所有觀測都作爲研究對象,而只是針對其中的某一子集來抽樣。比如如果我們只需要研究滬市主板的股票,那麼只需要在相關的觀測中抽取樣本作爲研究對象。Data選項後面可以使用where=語句來實現對總體觀測的篩選。

 

*如果只想在滬市主板上抽取100個樣本;

procsurveyselect

    data = Work.MainIndex_2012sea3(where=(Source ='滬市主板'))

    out = Work.MainIndex_2012sea3_srs8

    method = srs

    sampsize =100

    noprint

    ;

run;

 

(2)分層抽樣

分層抽樣是將總體按某種特徵分爲若干次級總體(層),再在每一層中進行隨機抽樣,把結果組成一個樣本的方法。描述層次特徵的變量稱爲分層變量,比如在我們的測試數據中,我們可以使用Source(來源板塊)變量把原始數據分爲滬市主板、深市主板、中小板、創業板四類(層)。Surveyselect過程步使用strata語句來指定分層變量。在抽樣之前,需要對原始數據按照strata指定的分層變量進行排序。最簡單的分層抽樣場景是,最總體中的所有樣本,指定一個分層變量,每一層都使用同樣的抽樣比例。以下是最簡單分層抽樣場景的代碼:

 

*由於分層抽樣需要對原始數據進行排序,因此我們再複製一張臨時表;

data Work.MainIndex_2012sea3_tmp;

    setWork.MainIndex_2012sea3;

run;

 

*按照分層變量Source排序;

procsortdata =Work.MainIndex_2012sea3_tmp;by Source;

 

*用Source分層,每一層抽取10%的樣本;

procsurveyselect

    data = Work.MainIndex_2012sea3_tmp

    out = Work.MainIndex_2012sea3_strata1

    method = srs

    samprate =0.1

    noprint;

    strata Source; * 使用Source作爲分層變量;

run;

 

如果各層抽取的比例不一樣,則應賦予samprate一個數組,數組的每一個元素的值分別代表各個層的抽樣比例。數組元素的順序需與分層變量排序後的順序一致。

 

*用Source分層,一共有4層,各層抽取的比例不一樣,在samprate中定義;

*分層變量Source的排序順序是:創業板 滬市主板 深市主板 中小板;

procsurveyselect

    data = Work.MainIndex_2012sea3_tmp

    out = Work.MainIndex_2012sea3_strata2

    method = srs

    samprate = (0.1,0.3,0.5,0.2)

    noprint

    ;

    strata Source; * 使用Source作爲分層變量;

run;

 

同樣,也可以使用sampsize分別指定每一層的抽樣個數。

 

*用Source分層,一共有4層,各層抽取的個數不一樣,在sampsize中定義;

*分層變量Source的排序順序是:創業板 滬市主板 深市主板 中小板;

procsurveyselect

    data = Work.MainIndex_2012sea3_tmp

    out = Work.MainIndex_2012sea3_strata3

    method = srs

    sampsize = (10,60,50,30)

    noprint;

    strata Source; * 使用Source作爲分層變量;

run;

 

如果層數較多,且需要對不同層分別指定抽樣比例或抽樣個數,則需要建立抽樣表。抽樣表需要包含分層變量,以及每一層對應的抽樣比例或抽樣個數;如果是抽樣比例,則變量必須命名爲_rate_,如果是抽樣個數,則變量必須命名爲_nsize_。

 

*按比例分層抽樣,建立抽樣表;

procsql;

    create tableWork.Samptab_rate (

        Sourcechar(10),

        _rate_num

    );

    insert intoWork.Samptab_rate values ('創業板',0.1);

    insert intoWork.Samptab_rate values ('滬市主板',0.3);

    insert intoWork.Samptab_rate values ('深市主板',0.5);

    insert intoWork.Samptab_rate values ('中小板',0.2);

quit;

 

*按比例分層抽樣,將抽樣表賦值給samprate;

procsurveyselect

    data = Work.MainIndex_2012sea3_tmp

    out = Work.MainIndex_2012sea3_strata4

    method = srs

    samprate = Work.Samptab_rate

    noprint;

    strata Source; * 使用Source作爲分層變量;

run;

 

*按個數分層抽樣,建立抽樣表;

procsql;

    create tableWork.Samptab_size (

        Sourcechar(10),

        _nsize_num

    );

    insert intoWork.Samptab_size values ('創業板',10);

    insert intoWork.Samptab_size values ('滬市主板',60);

    insert intoWork.Samptab_size values ('深市主板',50);

    insert intoWork.Samptab_size values ('中小板',30);

quit;

 

*按個數分層抽樣,將抽樣表賦值給sampsize;

procsurveyselect

    data = Work.MainIndex_2012sea3_tmp

    out = Work.MainIndex_2012sea3_strata5

    method = srs

    sampsize = Work.Samptab_size

    noprint;

    strata Source; * 使用Source作爲分層變量;

run;

 

(3)系統抽樣

系統抽樣是把總體的個體進行排序,計算出抽樣距離,然後按照這一固定的抽樣距離抽取樣本的方法。第一個樣本採用簡單隨機抽樣的辦法抽取,此後每隔一個抽樣距離的大小抽取一個樣本。抽樣距離等於總體容量除以樣本容量。

 

*每隔10個抽取一個1個;

procsurveyselect

    data = Work.MainIndex_2012sea3

    out = Work.MainIndex_2012sea3_sys1

    method = sys

    sampsize =248/*總體容量2472,樣本容量248,意味着抽樣距離爲10 */

    noprint;

run;

 

在系統抽樣中,可以使用控制變量來對原始數據進行排序。控制變量使用control語句。SAS程序首先安裝control中的變量排序,然後採用系統抽樣抽取樣本。

 

*每隔10個抽取一個1個;

*使用Source作爲控制變量,這樣程序會對輸入數據按照Source進行排序;

procsurveyselect

    data = Work.MainIndex_2012sea3

    out = Work.MainIndex_2012sea3_sys2

    method = sys

    sampsize =248

    noprint;

    control Source;

run;

 

下面的程序是將系統抽樣與分層抽樣相結合,實現較爲複雜的抽樣方式,以滿足實際應用的需求。在這個例子中,程序按照strata指定的變量對原始數據進行分層,在每一層中使用control變量排序,然後分別進行系統抽樣各抽取248個個體,因此,最終的結果有992條觀測。


*分層系統抽樣;

procsurveyselect

    data = Work.MainIndex_2012sea3_tmp

    out = Work.MainIndex_2012sea3_sys3

    method = sys

    sampsize =248

    noprint;

    strata Source;

    control EPS;

run;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章