The following code works for 3 of my 4 variables. But with one variable, I get the following message:
NOTE: IML Ready
ERROR: (execution) Invalid argument to function.
operation : SQRT at line 4121 column 1
operands : _TEM1001
_TEM1001 5 rows 1 col (numeric)
0.0002809
0.0005076
0.0112643
-0.00117
0.0018209
statement : ASSIGN at line 4121 column 1
ERROR: (execution) Matrix has not been set to a value.
Here is the macro code:
%MACRO clus2OLS(yvar, xvars, cluster1, cluster2, dset);
/* do interesection cluster*/
proc surveyreg data=&dset; cluster &cluster1 &cluster2; model &yvar= &xvars / covb; ods output CovB = CovI; quit;
/* Do first cluster */
proc surveyreg data=&dset; cluster &cluster1; model &yvar= &xvars / covb; ods output CovB = Cov1; quit;
/* Do second cluster */
proc surveyreg data=&dset; cluster &cluster2; model &yvar= &xvars / covb; ods output CovB = Cov2 ParameterEstimates = params; quit;
/* Now get the covariances numbers created above. Calc coefs, SEs, t-stats, p-vals using COV = COV1 + COV2 - COVI*/
proc iml; reset noprint; use params;
read all var{Parameter} into varnames;
read all var _all_ into b;
use Cov1; read all var _num_ into x1;
use Cov2; read all var _num_ into x2;
use CovI; read all var _num_ into x3;
cov = x1 + x2 - x3; /* Calculate covariance matrix */
dfe = b[1,3]; stdb = sqrt(vecdiag(cov)); beta = b[,1]; t = beta/stdb; prob = 1-probf(t#t,1,dfe); /* Calc stats */
print,"Parameter estimates",,varnames beta[format=8.4] stdb[format=8.4] t[format=8.4] prob[format=8.4];
conc = beta || stdb || t || prob;
cname = {"estimates" "stderror" "tstat" "pvalue"};
create clus2dstats from conc [ colname=cname ];
append from conc;
conc = varnames;
cname = {"varnames"};
create names from conc [ colname=cname ];
append from conc;
quit;
data clus2dstats; merge names clus2dstats; run;
%MEND clus2OLS;
%clus2OLS(yvar=dependentvariable, xvars=listofindependentvariables, cluster1=gvkey, cluster2=fyear, dset=gtx.prepforreg);
Here is how I call the macro
%clus2OLs(yvar=Chgroa3, xvars=vb_nvb roa chgroa GrAS, cluster1=gvkey, cluster2=fyear, dset=Reg_ROA);
I receive PARAMETER ESTIMATES when I use a different "yvar" from the same dataset. But when I use this similar variable in my call statement (Chgroa3), I get the above error messages and no PARAMETER ESTIMATES.
Thank you
Your covariance matrix is wrong. Consequently you are getting an error (the sqrt of a negative number) when you compute
cov = x1 + x2 - x3;
stdb = sqrt(vecdiag(cov));
There is no reason why a linear combination of matrices should be a valid covariance matrix and clearly it is not for your data.
ERROR: (execution) Invalid argument to function.
operation : SQRT at line 4121 column 1
You can't take a square root of a negative number. You get a negative number from
cov = x1 + x2 - x3;
I don't think this is really a way to obtain a covariance matrix, and I have never seen anyone subtract a covariance from another covariance matrix, so I'm not really sure why you are doing this subtraction.
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.
Learn how to run multiple linear regression models with and without interactions, presented by SAS user Alex Chaplin.
Find more tutorials on the SAS Users YouTube channel.