Thanks Rick. I have a related question: I implemented your IML code with a small alteration. While yours works perfectly, mine has the following error: 107 D = vecdiag(X`*X); ERROR: (execution) Invalid argument or operand; contains missing values. The (X`*X) is causing the issue. Here is the code Im running /* Ridge regression example from PROC REG documentation
data acetyl;
input x1-x4 @@;
x1x2 = x1 * x2;
x1x1 = x1 * x1;
call streaminit(12345);
w = rand("uniform");
datalines;
1300 7.5 0.012 49 1300 9 0.012 50.2 1300 11 0.0115 50.5
1300 13.5 0.013 48.5 1300 17 0.0135 47.5 1300 23 0.012 44.5
1200 5.3 0.04 28 1200 7.5 0.038 31.5 1200 11 0.032 34.5
1200 13.5 0.026 35 1200 17 0.034 38 1200 23 0.041 38.5
1100 5.3 0.084 15 1100 7.5 0.098 17 1100 11 0.092 20.5
1100 17 0.086 29.5
;
proc reg data=acetyl outest=b ridge=0.5 noprint;
model x4=x1 x2 x3 x1x2 x1x1;
weight w;
run;
proc print data=b(where=(_TYPE_="RIDGE")) noobs;
var _RIDGE_ Intercept x1 x2 x3 x1x2 x1x1;
run;
*/
libname CmeData "\\link\CME_SAS_inputData_differentPeriods";
run;
data GlobalRegData;
set data_database;
output GlobalRegData;
run;
/***************************************************************
Global Curvature
****************************************************************/
proc reg data=GlobalRegData
outest=bb ridge = 0.5;
OurPick3: model Curvature_Ch = Curvature_Lag12 Yld10yr_Ch;
weight SqrtGdpwgtNorm;
where 195001<=Eom<=200512 and CountryID^=100;
run;
proc print data=bb;
run;
/* Ridge regression coefficients computed in SAS/IML */
proc iml;
use GlobalRegData;
read ALL var {Curvature_Lag12 Yld10yr_Ch} into X;
read all var {Curvature_Ch} into y;
read all var {SqrtGdpwgtNorm};
close GlobalRegData;
/*
use b where(_TYPE_="RIDGE");
read all var {_RIDGE_} into k;
read all var {Intercept x1 x2 x3 x1x2 x1x1} into RegB;
close;
*/
start WtMean(x, w);
m = (x#w)[+,] / sum(w); /* compute weighted mean */
return( m );
finish;
w=SqrtGdpwgtNorm;
/* ridge regression */
xBar = WtMean(X,w); /* save row vector of means */
yBar = WtMean(y,w); /* save mean of Y */
X = X - xBar; /* center X and y; do not add intercept */
y = y - yBar;
print xBar;
/* include weights for matrix computations */
X = sqrt(w)#X;
y = sqrt(w)#y;
D = vecdiag((X`)*X);
print (X`);
Z = X / sqrt(D`); /* Z`Z = corr(X) */
b = (1/sqrt(D)) # inv(Z`*Z + k*I(ncol(X))) * (Z`*y); /* formula in REG doc */
... View more