SAS: вычисление стандартного отклонения на лету в datastep
У меня есть следующие примеры данных:
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 ответ:
Стандартное отклонение не имеет никакого значения для отдельной ставки; оно будет иметь значение только для игрока в целом или для игрока в течение определенного периода времени. Выбор того или иного определения (т. е. какой период времени и т.д.) находится далеко за пределами области переполнения стека; это был бы перекрестный вопрос. Однако вычисление стандартного отклонения само по себе, безусловно, имеет место:
proc means data=have; class username; var stake; output out=want stddev=stake_stddev; run;Вы можете добавить оператор
type username;, Если вам не нужен сквозной stddev для всех игроков. Вы также можете попросить среднее или сумму или все, что вы найдете полезным.Если вы хотите сделать это через периоды времени, вы можете либо создать набор данных, который имеет переменную периода времени, повторяет строки по мере необходимости, чтобы они были в каждом периоде времени, на который они претендуют, и добавить это в оператор class; или вы можете использовать один из процессов ETS, если у вас есть лицензия (ETS = анализ временных рядов).
PROC EXPAND, вероятно, ваш лучший выбор, поскольку он дает вам возможность преобразовать переменную в ее сумму STDEV и/или USS / CSS (среди многих других опций). Если у вас есть лицензия и вы находите это полезным, скажите об этом в комментариях, и я или другие люди могут помочь построить этот код.
Comments