具有条件的数据的特定变量的SAS统计参数

时间:2015-05-01 17:11:30

标签: variables statistics sas conditional-statements proc

我有一个基于某个数据创建的变量。现在在这个新数据中,我需要计算不同的统计参数,但有条件 例如: *这个新变量的中位数仅适用于他们的出生国不是意大利的。 *仅当年龄> 35时,不同变量的平均值, *两种相同var的Q1和Q3(例如女性和男性) 等等。  我使用PROC FREQ还是PROC MEANS-因为它包含所有这些统计数据?无论哪种方式,这对我都不起作用。我可以在单个var数据上改变这个程序吗?

- (void)clientManager:(MSBClientManager *)clientManager clientDidConnect:(MSBClient *)client;
- (void)clientManager:(MSBClientManager *)clientManager clientDidDisconnect:(MSBClient *)client;

2 个答案:

答案 0 :(得分:0)

您可以在输入数据集中将不需要的值设置为缺失,因为proc means会忽略缺失值。然后,您可以在单个var语句中使用所有需要的变量。

假设要汇总的变量名为var1var2,您可以这样做:

data input;
    set dat2;
    if birth_country = "Italy" then call missing(var1);
    if age <= 35 then call missing(var2);
run;

proc means data = input mean median q1 q3;
    class sex;
    var var1 var2;
run;

使用class sex;可以按性别和整体提供结果。

如果这似乎难以理解,您可以将其细分为多次调用proc means

proc means data = dat2 mean median q1 q3;
    class sex;
    var var1;
    where birth_country ^= "Italy";
run;

proc means data = dat2 mean median q1 q3;
    class sex;
    var var2;
    where age > 35;
run;

有关proc means中提供的各种声明和选项的更多具体详情,请查看SAS documentation for that procedure

答案 1 :(得分:0)

我不会按照Alex A的建议创建一个单独的数据步骤。这可能是一个坏习惯,因为对于大型数据集,它在CPU方面可能非常昂贵。

相反,我会将Proc Means调用的子集,但与Alex A的建议略有不同,因为您可能不希望从&#34; by&#34;声明自&#39; by&#39;声明要求数据按&#39;排序&#39;变量(最小化的另一个代价高昂的CPU错误):

proc means data=dat2(where=(country ne 'ITALY')) 
           median n mean q1 q3 noprint nway;
var NewVar;
output out=median1(drop=_:) n=n median=median mean=mean q1=q1 q3=q3;
run;
proc print data=median1;
run;

proc means data=dat2(where=(age>35)) n median mean q1 q3 noprint nway;
var DiffVar;
class sex;
output out=median2(drop=_:) n=n median=median mean=mean q1=q1 q3=q3;
run;
proc print data=median2;
run;

&#39; noprint&#39;选项禁止SAS将输出写入列表文件。

&#39; nway&#39;选项禁止包含为性生成的自动_ type_变量 - 类变量(如Alex A.所述,SAS将为每个请求的度量生成三个级别或_type_变量:2个用于性别,一个用于整体)。

&#39; drop = _:&#39;语句删除第一个字符中带下划线的任何变量。对于Proc Means,这将包括自动变量_ type_和_ freq_以及数据集中以下划线开头的任何其他变量。

添加&#39; n&#39; Proc Means调用的选项为您提供类变量的每个子集的频率,其中_ freq_变量仅为您提供非缺失信息的整体样本,并且不会按类语句的级别将其分解。

或者,您可以使用&#39;其中&#39;将数据读入Proc Means调用。声明。我不确定,但我的印象是使用&#39; data =&#39;对数据进行子集化。呼叫在计算上更有效率。我从一般的SAS规则中推断出这一点,即关于避免可执行语句并保持“如果”,“&#39; &#39;其中&#39;在可能的情况下,在PDV(程序数据向量)级别的其他命令:

proc means data=dat2 median n mean q1 q3 noprint nway;
var NewVar;
where country ne 'ITALY';
output out=median1(drop=_:) n=n median=median mean=mean q1=q1 q3=q3;
run;