0

これは、 SO に関する以前の投稿のフォローアップです。

人種、性別、民族性を含む人口統計の頻度表を作成しようとしています。1 つの表は、調査のヒスパニック系参加者の性別による人種のクロス集計です。ただし、これまでのところヒスパニック系の参加者はいません。したがって、テーブルはすべてゼロになりますが、それでも報告する必要があります。

これはRで実行できますが、これまでのところ、SAS の解決策は見つかりませんでした。サンプルデータは以下です。


data race;
input race  eth  sex   ;
cards;
1   2   1
1   2   1
1   2   2
2   2   1
2   2   2
2   2   1
3   2   2
3   2   2
3   2   1
4   2   2
4   2   1
4   2   2
run;




data class;
    do race = 1,2,3,4,5,6,7;
        do eth = 1,2,3;
            do sex = 1,2;
                output;
            end;
        end;
    end;
run;



proc format;

    value   frace   1 = "American Indian / AK Native"
                        2 = "Asian"
                        3 = "Black or African American"
                        4 = "Native Hawiian or Other PI"
                        5 = "White"
                        6 = "More than one race"
                        7 = "Unknown or not reported" ;

    value   feth            1 = "Hispanic or Latino"
                            2 = "Not Hispanic or Latino"
                            3 = "Unknown or Not reported" ;

    value   fsex        1 = "Male"
                        2 = "Female"  ;

run;






*****  ethnicity by sex  ;

proc tabulate data = race missing classdata=class ;
class  race eth sex ;
table eth, sex / misstext = '0' printmiss;
format race frace. eth feth.  sex fsex. ;
run;



*****  race by sex  ;

proc tabulate data = race missing classdata=class ;
class  race eth sex ;
table race, sex / misstext = '0' printmiss;
format race frace. eth feth.  sex fsex. ;
run;



*****  race by sex, for Hispanic only  ;
*****  log indicates that a logical page with only missing values has been deleted ;
*****  Thanks SAS, you're a big help...  ;

proc tabulate data = race missing classdata=class ;
where eth = 1 ;
class  race eth sex ;
table race, sex / misstext = '0' printmiss;
format race frace. eth feth.  sex fsex. ;
run;

どこが1に等しいかを選択しているため、コードが実際に機能しないことを理解していますeth(条件を満たすケースはありません...)。実行するコマンドを指定してもby eth機能しません。

どんな指導も大歓迎です...

4

3 に答える 3

1

最も簡単な方法は、欠損値を持つデータに行を作成することだと思います。これを大規模に行う方法については、次の論文を参照してください。

http://www.nesug.org/Proceedings/nesug11/pf/pf02.pdf

PROC FREQ には SPARSE オプションがあり、テーブル内のすべての変数 (欠落している変数を含む) のすべての可能な組み合わせを提供しますが、必要なものが正確に得られるようには見えません。

于 2013-04-18T18:36:18.290 に答える
1

Westat の良き友人がこの問題に取り組んでいるようです。そこにあるソリューションの説明をここに示します

便宜上コードを以下に示しますが、参照する場合は元のコードを引用してください


PROC FORMAT;
value ethnicf
1 = 'Hispanic or Latino'
2 = 'Not Hispanic or Latino'
3 = 'Unknown (Individuals Not Reporting Ethnicity)';
value racef
1 = 'American Indian or Alaska Native'
2 = 'Asian'
3 = 'Native Hawaiian or Other Pacific Islander'
4 = 'Black or African American'
5 = 'White'
6 = 'More Than One Race'
7 = 'Unknown or Not Reported';
value gndrf
1 = 'Male'
2 = 'Female'
3 = 'Unknown or Not Reported';
RUN;



DATA shelldata;
format ethlbl ethnicf. racelbl racef. gender gndrf.;
    do ethcat = 1 to 2;
        do ethlbl = 1 to 3;
            do racelbl = 1 to 7;
                do gender = 1 to 3;
                output;
                end;
            end;
        end;
    end;
RUN;



DATA test;
input pt $ 1-3 ethlbl gender racelbl ;
cards;
x1 2 1 5
x2 2 1 5
x3 2 1 5
x4 2 1 5
x5 2 1 5
x6 2 2 2
x7 2 2 2
x8 2 2 5
x9 2 2 4
x10 2 2 4
RUN;





DATA enroll;
set test;
if ethlbl = 1 then ethcat = 1;
else ethcat = 2;
format ethlbl ethnicf. racelbl racef. gender gndrf.;
label ethlbl = 'Ethnic Category'
racelbl = 'Racial Categories'
gender = 'Sex/Gender';
RUN;




%MACRO TAB_WHERE;


/* PROC SQL step creates a macro variable whose */
/* value will be the number of observations */
/* meeting WHERE clause criteria. */
PROC SQL noprint;
select count(*)
into :numobs
from enroll
where ethcat=1;
QUIT;


/* PROC FORMAT step to display all numeric values as zero. */
PROC FORMAT;
value allzero low-high='     0';
RUN;

/* Conditionally execute steps when no observations met criteria. */
%if &numobs=0 %then 
    %do;
        %let fmt = allzero.; /* Print all cell values as zeroes */
        %let str = ; /*No Cases in Subset - WHERE cannot be used */
    %end;

%else
    %do;
        %let fmt = 8.0;
        %let str = where ethcat = 1;
    %end;


PROC TABULATE data=enroll classdata=shelldata missing format=&fmt;
&str;
format racelbl racef. gender gndrf.;
class racelbl gender;
classlev racelbl gender;
keyword n pctn all;
tables (racelbl all='Racial Categories: Total of Hispanic or Latinos'),
gender='Sex/Gender'*N=' ' all='Total'*n='' / printmiss misstext='0'
box=[LABEL=' '];
title1 font=arial color=darkblue h=1.5 'Inclusion Enrollment Report';
title2 ' ';
title3 font=arial color=darkblue h=1' PART B. HISPANIC ENROLLMENT REPORT:
Number of Hispanic or Latinos Enrolled to Date (Cumulative)';
RUN;


%MEND TAB_WHERE;

%TAB_WHERE

于 2013-04-18T18:59:54.100 に答える