I want to perform linear regression after every 7 days upto the total days for different serial id's. What I have done is, I used the macro function and iterated upto total days by 7... and preformed the regression... but this process is taking lot of time. Is there any better way to do it? %MACRO LR_WEEK(TABLE); PROC DATASETS LIBRARY=WORK NODETAILS NOLIST; DELETE LR_PARTS; RUN; PROC SQL NOPRINT; SELECT DISTINCT SERIAL_id INTO :SERIAL_ARRAY SEPARATED BY ' ' FROM &TABLE QUIT; PROC SQL NOPRINT; SELECT COUNT (DISTINCT SERIAL_id) AS TOT_DISTINCT_SERIAL INTO :TOT_DISTINCT_SERIAL_1 FROM &TABLE QUIT; %DO i = 1 %TO &TOT_DISTINCT_SERIAL_1.; PROC SQL NOPRINT; SELECT DISTINCT CYCLE_COUNTER INTO :CYCLE_COUNTER_ARRAY SEPARATED BY ' ' FROM &TABLE WHERE SERIAL_NR_N = %SCAN(&SERIAL_ARRAY.,&i.); QUIT; PROC SQL NOPRINT; SELECT COUNT (DISTINCT CYCLE_COUNTER) AS TOT_DISTINCT_CYCLE_COUNTER INTO :TOT_DISTINCT_CYCLE_COUNTER_1 FROM &TABLE WHERE SERIAL_id = %SCAN(&SERIAL_ARRAY.,&i.); QUIT; %DO j = 1 %TO &TOT_DISTINCT_CYCLE_COUNTER_1.; PROC SQL NOPRINT; SELECT MAX(TOTAL_DAYS) INTO :TOTAL_DAYS FROM &TABLE WHERE SERIAL_id = %SCAN(&SERIAL_ARRAY.,&i.) AND CYCLE_COUNTER = %SCAN(&CYCLE_COUNTER_ARRAY.,&j.) ; QUIT; %IF &TOTAL_DAYS. > 30 %THEN %DO; %DO k=7 %TO &TOTAL_DAYS. %BY 7; DATA LR_INP; SET &TABLE; BY MATERIAL_NR_N SERIAL_id CYCLE_COUNTER; WHERE SERIAL_id=%SCAN(&SERIAL_ARRAY.,&i.) AND CYCLE_COUNTER = %SCAN(&CYCLE_COUNTER_ARRAY.,&j.) AND DAYS_ELAPSED<&k AND TIME > 5; RUN; PROC REG DATA=LR_INP OUTEST=SIO_LR_VAR NOPRINT; BY MATERIAL_NR_N SERIAL_id CYCLE_COUNTER; MODEL SIO_MA_5 = DAYS_ELAPSED; RUN; DATA LR_ADD; SET SIO_LR_VAR; BY MATERIAL_NR_N SERIAL_id CYCLE_COUNTER; DAYS=&k; RUN; PROC APPEND BASE=WORK.LR_PARTS DATA=LR_ADD; RUN; PROC SORT DATA=LR_PARTS; BY MATERIAL_NR_N SERIAL_id CYCLE_COUNTER; RUN; PROC SQL; CREATE TABLE WORK.LR_JOIN AS SELECT A.*,B.INTERCEPT,B.DAYS_ELAPSED AS LR_SLOPE FROM &TABLE A LEFT JOIN LR_PARTS B ON A.SERIAL_id=B.SERIALid AND A.CYCLE_COUNTER=B.CYCLE_COUNTER AND A.DAYS_ELAPSED=B.DAYS ORDER BY SERIAL_id,CYCLE_COUNTER,DATE_N; QUIT; %END; %END; %END; %END; %MEND;
... View more