在統計研究中,針對容量無限或者容量很大以至於無法直接對其進行研究的總體,都是通過從中抽取一部分個體作爲研究對象,以考察總體的特徵。被抽取的部分個體稱爲該總體的一個樣本。從總體中抽取樣本的過程,稱爲抽樣。
抽樣包括隨機抽樣和非隨機抽樣。非隨機抽樣是從總體中抽取指定的個體,具有主觀意向性,這裏不做討論。
隨機抽樣是按照隨機原則,保證個體都有一定概率被抽取到的抽樣方法。常見的隨機抽樣方式有:簡單隨機抽樣、系統抽樣、分層抽樣、整羣抽樣、多階段抽樣、二重抽樣以及比率抽樣。
以下將依次介紹各種隨機抽樣方法的原理、應用場景及其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條記錄,只保留StockCode和StockName字段,不打印;
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;