SAS:在数据步骤中即时计算标准偏差

时间:2013-07-25 12:38:22

标签: sas

我有以下示例数据:

data have;
 input username $ stake betdate : datetime.;
dateOnly = datepart(betdate) ;
format betdate DATETIME.;
format dateOnly ddmmyy8.;
datalines; 
player1 90 12NOV2008:12:04:01
player1 -100 04NOV2008:09:03:44
player2 120 07NOV2008:14:03:33
player1 -50 05NOV2008:09:00:00
player1 -30 05NOV2008:09:05:00
player1 20 05NOV2008:09:00:05
player2 10 09NOV2008:10:05:10
player2 -35 15NOV2008:15:05:33
run;
PROC PRINT; RUN;
proc sort data=have;
by username betdate;
   run;
 data want;
set have;
by username dateOnly betdate;   
retain calendarTime eventTime cumulativeDailyProfit standardDeviationStake;
if first.username then calendarTime = 0;
if first.dateOnly then calendarTime + 1;
if first.username then eventTime = 0;
if first.betdate then eventTime + 1;
if first.username then cumulativeDailyProfit = 0;
if first.dateOnly then cumulativeDailyProfit = 0;
if first.betdate then cumulativeDailyProfit + stake;
run;
PROC PRINT; RUN;

我需要某种方式来比较具有不同股权规模的玩家并规范他们的投注金额。对于每个玩家的赌注,我正在考虑计算该赌注的标准差(如下所示)。然后我可以添加这些的方块并获得平方根以获得每个玩家投注的总标准差。然后我可以将玩家正在玩的每个赌注与他的总标准差进行比较。

如果此游戏是掷硬币,则获胜的概率为0.50。这是二项式结果,因此标准差为σ=(p(1 - p)/ n)1/2。所以上面第一次下注的标准差是90 * [0.5 * 0.5] ^ 0.5 = 45.

我如何计算每个玩家赌注的标准差,就像我计算下面的累积利润值一样?我可能需要每个投注的标准偏差(对于每个玩家),每个玩家的总标准偏差,以及“标准化赌注”,即赌注的赌注除以赌注的标准偏差。然后,我可以在具有不同数量的赌注的玩家之间进行一种比较。

我对此感到非常感激!

感谢。

1 个答案:

答案 0 :(得分:2)

标准差对单次下注没有任何意义;它只对整个玩家或在特定时间段内对玩家有意义。特定定义的选择(即什么时间段等)远远超出Stack Overflow的范围;这将是一个CrossValidated问题。但是,计算标准差本身当然是在范围内:

proc means data=have;
class username;
var stake;
output out=want stddev=stake_stddev;
run;

如果您不想要所有玩家的stddev,可以添加type username;语句。你也可以要求一个均值或总和或任何你认为有用的东西。

如果您想跨时间段执行此操作,您可以创建一个具有时间段变量的数据集,根据需要重复行,以便它们符合条件的每个时间段,并将其添加到类语句中;或者如果您拥有许可证(ETS =时间序列分析),您可以使用其中一个ETS触发器。 PROC EXPAND可能是您最好的选择,因为它可以让您选择将变量转换为STDEV和/或USS / CSS(以及许多其他选项)。如果您已获得许可并发现有用,请在评论中说明,我或其他人可以帮助构建该代码。