Sas 基于文本变量计算期望值

Sas 基于文本变量计算期望值,sas,Sas,我想在下表的每一行计算一些期望值: proc sql; create table delete (t0avgStakeRank num, eventtime num, previousnode char(10), bettors num); quit; proc sql; insert into delete

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

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”来对“last”、“next to last”等结果进行子串,然后相应地进行乘法,但我觉得可能有一种更简单的方法可以做到这一点。

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中使用该函数。

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中使用该函数。

为什么eventtime=2 pnode=L概率平方,但eventtime=5 pnode=LWLW没有考虑到它在eventtime=5但只有4个以前的节点这一事实?抱歉,这是我的错误。节点2将基于概率^1,而不是我上面所说的2,因为只有在那个阶段已经有一次下注,预期值只是开始计数的一半。为什么eventtime=2 pnode=L概率的平方,但eventtime=5 pnode=LWLW没有考虑到它在eventtime=5但之前只有4个节点这一事实?抱歉,这是我的一个错误。节点2将基于概率^1,而不是2我在上面说过,因为在那个阶段只有一次下注,预期值只是开始计数的一半。