根据文本变量计算预期值

时间:2013-10-15 17:24:54

标签: sas

我想在下表的每一行计算一些预期值:

proc sql;  
create table delete
       (t0avgStakeRank num,
        eventtime num,
        previousnode char(10),
bettors num);
quit;

proc sql;  
insert into delete                                                                                                                 
(t0avgStakeRank, eventtime, previousnode, bettors)                                                                                         
    values(0,1,' ',1000)
    values(0,2, 'L',500)
    values(0,2, 'W',500)
    values(0,3, 'LL',250)
    values(0,3, 'LW',250)
    values(0,3, 'WL',250)
    values(0,3, 'WW',250)
    values(0,4, 'LLL',125)
    values(0,4, 'LLW',125)
    values(0,4, 'LWL',125)
    values(0,4, 'LWW',125)
    values(0,4, 'WLL',125)
    values(0,4, 'WLW',125)
    values(0,4, 'WWL',125)
    values(0,4, 'WWW',125)
    values(0,5, 'LLLL',62.5)
    values(0,5, 'LLLW',62.5)
    values(0,5, 'LLWL',62.5)
    values(0,5, 'LLWW',62.5)
    values(0,5, 'LWLL',62.5)
    values(0,5, 'LWLW',62.5)
    values(0,5, 'LWWL',62.5)
    values(0,5, 'LWWW',62.5)
    values(0,5, 'WLLL',62.5)
    values(0,5, 'WLLW',62.5)
    values(0,5, 'WLWL',62.5)
    values(0,5, 'WLWW',62.5)
    values(0,5, 'WWLL',62.5)
    values(0,5, 'WWLW',62.5)
    values(0,5, 'WWWL',62.5)
    values(0,5, 'WWWW',62.5)
    values(1,1, '',1000)
    values(1,2, 'L',500)
    values(1,2, 'W',500)
    values(1,3, 'LL',250)
    values(1,3, 'LW',250)
    values(1,3, 'WL',250)
    values(1,3, 'WW',250)
    values(1,4, 'LLL',125)
    values(1,4, 'LLW',125)
    values(1,4, 'LWL',125)
    values(1,4, 'LWW',125)
    values(1,4, 'WLL',125)
    values(1,4, 'WLW',125)
    values(1,4, 'WWL',125)
    values(1,4, 'WWW',125)
    values(1,5, 'LLLL',62.5)
    values(1,5, 'LLLW',62.5)
    values(1,5, 'LLWL',62.5)
    values(1,5, 'LLWW',62.5)
    values(1,5, 'LWLL',62.5)
    values(1,5, 'LWLW',62.5)
    values(1,5, 'LWWL',62.5)
    values(1,5, 'LWWW',62.5)
    values(1,5, 'WLLL',62.5)
    values(1,5, 'WLLW',62.5)
    values(1,5, 'WLWL',62.5)
    values(1,5, 'WLWW',62.5)
    values(1,5, 'WWLL',62.5)
    values(1,5, 'WWLW',62.5)
    values(1,5, 'WWWL',62.5)
    values(1,5, 'WWWW',62.5);                                                                                                                                                                                                   
quit; 

计算将基于'previousnode'变量,两个静态变量:一个值为3456(例如),另一个值为0.75(例如)和eventTime变量。我想将previousnode变量的值解析为公式。例如,在节点'L',结果将是3456 *(1-(0.75 ^ 2),因为eventTime是2并且结果是丢失。在节点'LWLW',结果将是3456 * (0.25 * 0.75 * 0.25 * 0.75)因为在另一方中有失败,胜利,失败和胜利。

如果没有在庞大的PROC SQL查询中明确编写代码,我怎么能这样做呢?我可以通过检查这些字符串中的每一个是“L”还是“W”然后相应地相乘来对最后一个,倒数第二个等结果进行子串,但我觉得可能有更简单的方法来做到这一点。 / p>

1 个答案:

答案 0 :(得分:1)

PROC FCMP可能就是您的答案。根据您给出上述评论的答案,这可能会起作用或需要稍微调整 - 但一般来说应该是一个简单的方法。

options cmplib=work.funcs;
proc fcmp outlib=work.funcs.foo;
function calcodds(percent,results $);
  odds=1;
  do x = 1 to length(results);
    odds = odds * ifn(char(results,x)='W',percent,1-percent);
  end;
  return(odds);
endsub;
quit;

使用以前的数据集:

DATA FOO;
length previousnode $8;
percent=0.75;
DO t0avgStakeRank=0,1;
    DO eventtime=1 to 5;
        if eventtime=1 then do;
            previousnode=' ';
            output;
        end;
        else do;
            do _t = 0 to 2**(eventtime-1)-1;
                previousnode=translate(translate(trimn(putn(_t,'BINARY.',eventtime-1)),'L','1'),'W','0');
                odds = calcodds(percent,previousnode);
                output;
            end;
        end;
    END;    
END;
run;

您也可以在SQL中使用该功能。