PROC TABULATE中的类变量。需要替代ALL命令

时间:2013-12-13 12:56:19

标签: sas

我有以下两张表。一个有两个投注结果,另一个有一些需要添加的“虚拟”投注。我想获得原始样本的平均值,添加虚拟投注的样本的平均值,然后执行列之间差异的Chi Squared测试和对行之间差异的Kruskal Wallis测试。

我遇到了将数据制表以产生两个类别的平均值的问题。

   data A;
   input username $  betdate : datetime. stake winnings node $;
   dateOnly = datepart(betdate) ;
   format betdate DATETIME.;
   format dateOnly ddmmyy8.;
   datalines; 
    player1 12NOV2008:12:04:01 90 -90 X
    player1 04NOV2008:09:03:44 100 40  L
    player2 07NOV2008:14:03:33 120 -120 W
    player1 05NOV2008:09:00:00 50 15 L
    player1 05NOV2008:09:05:00 30 5 W
    player1 05NOV2008:09:00:05 20 10 L
    player2 09NOV2008:10:05:10 10 -10 W
    player2 15NOV2008:15:05:33 35 -35 W
    player1 15NOV2008:15:05:33 35 15 L
    player1 15NOV2008:15:05:33 35 15 L
run;

proc sql; create table B(toAdd num,node char(100)); quit;
proc sql;  insert into B (toAdd, node)                                                                                         
    values(5, 'X')
    values(3, 'L')
    values(7, 'W') ;                                                                                                                                                                                            
quit; 

我希望显示没有虚拟投注的平均值以及包含虚拟投注的平均值。我按如下方式添加了虚拟投注:

proc sort data=A out=A; by node; run;
data A;
    modify A B;
    by node;
    do i = 1 to toAdd;
    stake = 0;
    stakediff = -1;
    dummy = 1;
    output;
end;
run;

问题是当我将数据制表时,因为实际上并没有两个不同的类别,所以它并没有向我显示我想要的内容。

proc tabulate data=A;
class node dummy;
    var stake winnings;
    table node="",stake="" * (Mean="")*(dummy="" ALL);
run;

我正在使用虚拟投注创建一个基于大'N'的平均值。我会在PROC报告中执行此操作,并使用较大的'N'作为分子手动计算平均值,但我需要执行Kruskal Wallis和Chi-Squared测试。使用零赌注的虚拟投注更容易保持简单并在每个类别中保持正确的计数。此外,在没有每个类别的虚拟投注的情况下,即时计算标准误差(或者从PROC TABULATE创建的结果中计算出来)也是非常重要的。

如何在上面显示PROC TABULATE的结果,但是当假人为1时没有0,1和ALL类别作为条目是没有意义的?理想情况下,我希望将'WITHOUT DUMMIES'视为0,将'WITH DUMMIES'视为1,并将ALL列的结果显示为'WTIH DUMMIES'= 1类别。然后,我可以继续在'NODE'类变量上执行KRUSKAL WALLIS,在虚拟类变量上执行CHI-SQUARED,因为就目前而言,我不能仅使用0类别和1类作为类来执行这些测试测试。

如果我可以将dummy = 0类别中的所有行复制到dummy = 1类别中,我认为它会解决问题。

1 个答案:

答案 0 :(得分:1)

你的'如果我能'是一个正确的想法,很大程度上。您需要修复数据以反映所需的分组; dummy = 0应该只是非虚假的投注,如果我理解正确的话,dummy = 1应该是虚拟和非虚拟投注。因此,您需要输出dummy = 0行两次,一次使用dummy = 1,一次使用dummy = 0。

类似的东西:

data A;
    modify A B;
    by node;
    output;
    dummy=1;
    output;
    do i = 1 to toAdd;
    stake = 0;
    stakediff = -1;
    dummy = 1;
    output;
end;
run;