1

郵便番号に比例してサンプリングしたい 600,000 以上の観測データがあります (データ内の郵便番号の数は人口密度に比例します)。データの主要な変数は、ZIP CODEID、およびGROUPです。

SAS が郵便番号を選択するときに、そのGROUP内のすべてのレコードを選択するように、既存の SAS コードを修正する必要があります。たとえば、ID=2を選択した場合、 ID=1ID=3も必要です。したがって、すべての郵便番号がGROUP=1にあります。

ID  GROUP   ZIP
1   1   46227
2   1   46227
3   1   46227
4   2   47620
5   3   47433
6   3   47433
7   3   47433
8   4   46135
9   4   46135
10  5   46202
11  5   46202
12  5   46202
13  5   46202
14  6   46793
15  6   46793
16  7   46202
17  7   46202
18  7   46202
19  8   46409
20  8   46409
21  9   46030
22  9   46030
23  9   46030
24  10  46383
25  10  46383
26  10  46383

データから 1000 個の obs をサンプリングする次の SAS コードがありますが、 GROUP変数を考慮せずに郵便番号をランダムに選択します。

proc freq data=sample;
    tables zip / out=outfreq noprint;
run;

data newfreq error; set outfreq;
    sampnum=(percent*1000)/100;
    _NSIZE_=round(sampnum, 1);
    sampnum=round(sampnum, .01);
    if _NSIZE_=0 then output error;
    if _NSIZE_=0 then delete;
    output newfreq;
run;

data newfreq2; set newfreq error;
    by zip;
    keep zip _NSIZE_;
run;

proc sort data=newfreq2;
    by zip;
run;

proc sort data=sample;
    by zip;
run;

/* proportional stratified sampling */
proc surveyselect data=sample seed=2020 out=sampout sampsize=newfreq2;
    strata zip;
    id id zip;
run;

私の問題を明確に説明していることを願っています。そうでない場合は、不明な点を明確にしたり、詳しく説明したりします。

前もって感謝します。

4

3 に答える 3

1

これがうまくいくように見える試みです。

data test;
    input id group zip;
    cards;
1 1 46227
2 1 46227
3 1 46227
4 2 47620
5 3 47433
6 3 47433
7 3 47433
8 4 46135
9 4 46135
10 5 46202
11 5 46202
12 5 46202
13 5 46202
14 6 46793
15 6 46793
16 7 46202
17 7 46202
18 7 46202
19 8 46409
20 8 46409
21 9 46030
22 9 46030
23 9 46030
24 10 46383
25 10 46383
26 10 46383
;
run;

data test;
    set test;
    rand = ranuni(1200);
run;

proc sort data=test;
    by rand;
run;

/* 10 here is how many cases you want to sample initially */
data test;
    set test;
    if _n_ <= 10 then sample = 1;
    else sample = 0;
run;

proc sort data=test;
    by  group
        descending sample;
run;

data test;
    set test;
    by  group;
    retain keep;    

    if first.group and sample = 1 then keep = 1;
    if first.group and sample = 0 then keep = 0;

    if not first.group then keep = keep;

    drop    rand
            sample;

run;

proc sort data=test;
    by id;
run;

おまけとして、同じ結果が得られる R ワンライナーを次に示します。

# 3 here is the number of cases being sampled
test[test$group %in% (test[sample(1:nrow(test),3),]$group),]
于 2012-06-19T22:41:22.660 に答える
0

よく分からない。郵便番号をサンプリングしようとしていますか (そして、各郵便番号のすべての obs を返します)、または郵便番号ごとに階層化されたサンプル (各郵便番号から N 個の obs を意味します) が必要ですか? SAS/STAT User's Guide の例 89.4 を参照してください

于 2012-06-19T22:47:22.227 に答える
0

この「比例配分」の例は、p. 以下で参照されている記事の 6 が役立つ場合があります。

proc surveyselect data=frame out=sampsizes_prop sampsize=400;
 strata cityside **/ alloc=prop**;
run;

記事: http://analytics.ncsu.edu/sesug/2013/SD-01.pdf

于 2016-08-01T22:52:24.383 に答える