Recently in the SAS Community Library: SAS' @StuartRogers provides a close look at the new Microsoft Entra Gallery application and details how it can be used.
Hey there, I recently learned Clinical SAS, so I want to have some online projects with the guidance of experts so that I can manifest my skills which will be helpful for my future, I would be so grateful if I get the chance to work through it. Thank you and I will be waiting for your responses. Your's Faithfully Suryanshi Gupta
... View more
Hi guys,
how can I calculate person-years from two dates for ex: 16FEB2019 and 08JAN2020?
I have two variables with around 20.000 rows in my table.
Thank you in advance.
Best
... View more
I am trying to perform SG Annotation with BY Variables. In this trivial example, I want one plot with a red arrow for the plot of Male data; and one plot for the females with a green arrow, depending on the value of SEX in SASHELP.CLASS
Here's my code that doesn't work (stealing from the example here).
%sganno
data sgannodata;
set sashelp.class(obs=2);
if sex='M' then do;
%sgarrow(x1=51, x2=30, y1=30, y2=30, linecolor="red")
end;
else if sex='F' then do;
%sgarrow(x1=51, x2=30, y1=30, y2=35, linecolor="green")
end;
keep sex;
run;
proc sort data=sashelp.class out=class;
by descending sex ;
run;
proc sgplot data=class sganno=sgannodata;
scatter x=age y=weight;
by descending sex;
run;
Here's the incorrect output (the correct output would be the red arrow on the males and the green arrow on the females, not both arrows on both plots)
... View more
Proc export giving additional quotes to the quoted char values.and if u use data step for that it is giving a space or . To numeric values which is not required . Needs to change nothing.now it is , , but want ,, no space no .for missing numeric value.
... View more
How may I CALCULATE THE EQUAL-WEIGHTED (EW) AND VALUE-WEIGHTED (VW) COMPOUND DAILY RETURN FOR THE SUBSEQUENT WEEK AND MONTH BEGINNING THE DAY AFTER A FIRM IS ASSIGNED TO THE MAX, MIN, OR COMPARISON PORTFOLIO BY SMALL, MEDIUM, BIG SIZE. Thx a lot!!!
AVERAGE DAILY PORTFOLIO BUY-AND-HOLD RETURNS (IN %) ARE MEASURED FOR THE SUBSEQUENT WEEK AND MONTH BEGINNING THE DAY AFTER A FIRM IS ASSIGNED TO THE MAX, MIN, OR COMPARISON PORTFOLIO.
DM'LOG; CLEAR; OUT; CLEAR; ODSRESULTS; CLEAR;';
%LET FOLDER=%STR(C:\USERS\ALAIN\ONEDRIVE\桌面\HIGH);
LIBNAME HIGH "&FOLDER";
DATA HH;
SET HIGH.HH;
IF CFACPR=0 THEN DELETE;
RUN;
DATA HH;
SET HH;
IF _N_ <=1000;
RUN;
PROC SORT
DATA=HH (KEEP =SHRCD EXCHCD PERMNO DATE PRC CFACPR SHROUT CFACSHR
WHERE =( SHRCD IN (10,11) AND EXCHCD IN (1,2,3,31,32,33) )
)
OUT=HL(DROP=SHRCD EXCHCD );
BY PERMNO DATE;
RUN;
DATA HL;
SET HL;
BY PERMNO DATE;
RETAIN H L 0;
P=ABS(DIVIDE (PRC, CFACPR));
IF FIRST.PERMNO THEN H = P;
IF FIRST.PERMNO THEN L = P;
H = MAX(H, P);
L = MIN(L, P);
DROP PRC CFACPR;
RUN; /* PERMNO DATE SHROUT CFACSHR H L P */
DATA MK (DROP=_:);
SET HL;
BY PERMNO DATE;
RETAIN _FIRST_DATE_QUALIFIED .
_H .
_H_DATE .
_L .
_L_DATE .
PORTFOLIO
;
LENGTH PORTFOLIO $11;
IF FIRST.PERMNO THEN DO;
CALL MISSING(OF _:);
_FIRST_DATE_QUALIFIED=INTNX('YEAR',DATE,1,'SAME')+1;
END;
IF _H=. THEN _H=P;
IF _L=. THEN _L=P;
IF P ^=. THEN DO;
IF P > _H AND DATE >= INTNX('MONTH', _H_DATE, 1, 'SAME') THEN DO;
_H=P;
_H_DATE=DATE;
PORTFOLIO='MAX';
END;
ELSE IF P < _L AND DATE >= INTNX('MONTH', _L_DATE, 1, 'SAME') THEN DO;
_L=P;
_L_DATE=DATE;
PORTFOLIO='MIN';
END;
ELSE PORTFOLIO='COMPARISON';
END;
IF DATE >= _FIRST_DATE_QUALIFIED THEN DO;
H = _H;
H_DATE = _H_DATE;
L = _L;
L_DATE = _L_DATE;
END;
IF DATE < _FIRST_DATE_QUALIFIED THEN DO;
PORTFOLIO = 'UNQUALIFIED';
END;
FORMAT H_DATE L_DATE YYMMDD10. ;
RUN;
DATA MV;
SET MK;
BY PERMNO DATE;
RETAIN
MV
LAST_MONTH_END;
LAST_MONTH_END = INTNX('MONTH', DATE, -1, 'END');
FORMAT LAST_MONTH_END YYMMDD10. ;
MV = P * (SHROUT*CFACSHR) ;
RUN;
data LMV;
set MV ;
by permno date ;
lag_MV = lag(MV);
if first.permno then call missing(lag_MV,previous_MV);
else if month(date) ne month(lag(date)) then previous_MV=lag_MV;
retain previous_MV;
drop lag_MV;
run;
PROC SORT DATA=LMV;
BY DATE PERMNO DESCENDING previous_MV;
RUN;
PROC RANK DATA=LMV OUT=RANKED_DATA GROUPS=4TIES=LOW;
BY DATE;
VAR previous_MV;
RANKS QUARTILE;
RUN;
DATA SMB;
SET RANKED_DATA;
RETAIN
SIZE
;
LENGTH SIZE $5;
IF QUARTILE=1THEN SIZE= 'SMALL';
ELSE IF QUARTILE=2 THEN SIZE= 'MID';
ELSE SIZE = 'BIG';
RUN;
DATA SMB;
SET SMB(OBS=500);
PUT (_ALL_) (+0);
RUN;
PROC SORT DATA = SORTED;
BY DATE SIZE_GROUP PORTFOLIO;
RUN;
DATA EW_RETURNS VW_RETURNS;
SET SORTED;
BY DATE SIZE_GROUP PORTFOLIO;
RETAIN EW_RET VW_RET 0;
IF FIRST.FLAG THEN DO;
EW_RET = 1;
VW_RET = 1;
SUM_MV = 0;
END;
EW_RET = EW_RET * (1 + RET);
SUM_MV = SUM_MV + LAST_MONTH_MV;
VW_RET = VW_RET * (1 + RET * LAST_MONTH_MV / SUM_MV);
IF LAST.PORTFOLIO THEN DO;
EW_RETURN = EW_RET - 1;
VW_RETURN = VW_RET - 1;
OUTPUT EW_RETURNS;
OUTPUT VW_RETURNS;
END;
RUN;
PROC REGRESS DATA = EW_RETURNS;
MODEL EW_RETURN = MKT_RF SMB HML UMD / NOINT;
OUTPUT OUT = EW_ALPHA
P = EW_ALPHA;
RUN;
PROC REGRESS DATA = VW_RETURNS;
MODEL VW_RETURN = MKT_RF SMB HML UMD / NOINT;
OUTPUT OUT = VW_ALPHA
P = VW_ALPHA;
RUN;
EQUAL-WEIGHTED (EW) AND VALUE-WEIGHTED (VW) PORTFOLIO RETURNS ARE CALCULATED DAILY, AND THE PORTFOLIO IS REBALANCED AT THE END EACH DAY.
EW RETURNS ARE COMPOUNDED TO REDUCE BID ASK BIAS.
https://drive.google.com/file/d/1grx_6p-yVMVzrzvVjdtfwyFUjRpq10W6/view?usp=drive_link
... View more