Thanks Vince, It's pretty straightforward to follow! Here's the final code. One thing I don't get is why the NVAR variable defined in the CALL SYMPUT won't work in the DATA step but if I add in the %LET NVAR = &NVAR, it works. Any thoughts? Many thanks Emre DATA _NULL_; SET CORREL NOBS=N; CALL SYMPUT('NVAR',N); RUN; %LET NVAR = &NVAR; PROC FCMP OUTLIB=WORK.FUNCS.MATRIX; SUBROUTINE MMULT(Z [*,*], Y [*,*]); OUTARGS Y; ARRAY CORREL[&NVAR,&NVAR] / NOSYMBOLS; RC1 = READ_ARRAY('CORREL', CORREL); CALL MULT(Z, CORREL, Y); ENDSUB; RUN; OPTIONS CMPLIB=WORK.FUNCS; DATA COPULA; ARRAY Z [&NVAR] Z1-Z&NVAR; ARRAY ZZ [1, &NVAR] _TEMPORARY_; ARRAY Y [&NVAR] Y1-Y&NVAR; ARRAY YY [1, &NVAR] _TEMPORARY_; ARRAY X [&NVAR] X1-X&NVAR; ARRAY XX [1, &NVAR] _TEMPORARY_; ARRAY U [&NVAR] U1-U&NVAR; ARRAY UU [1, &NVAR] _TEMPORARY_; KEEP SIM U1-U&NVAR; DO SIM=1 TO &SIMS; DO J=1 TO DIM(Z); Z = RAND('NORM', 0, 1); ZZ[1, J] = Z ; END; CALL MMULT(ZZ, YY); DO J=1 TO DIM(Y); Y = YY[1, J]; END; DO J=1 TO DIM(X); CHI = RAND('CHISQ', &DOF); X = Y * SQRT(&DOF) / SQRT(CHI); XX[1, J] = X ; END; DO J=1 TO DIM(U); U = CDF('T', X , &DOF); UU[1, J] = U ; END; OUTPUT; END; RUN;
... View more