IML里面最后作出的P和PROC 出来的tb1中的主成分不一样。估计是P的公式有问题,但是实在没有找出来。
高手给我看看这是为什么?多谢!下面是code:
%let n=5;
proc iml;
reset deflib=work;
a={22 10 2 3 7,
14 7 10 0 8,
-1 13 -1 -11 3,
-3 -2 13 -2 4,
9 8 1 -2 4,
9 1 -7 5 -1,
2 -6 6 5 1,
4 5 0 -2 2};
create tb from a;
append from a ;
call svd(u,q,v,a);
reset fuzz;
print a u q v ;
sq=sum(q);
print sq;
dq=diag(q);
print dq;
trace=trace(dq);
print trace;
retain_eig={0};
idx={0};
do i=1 to &n.;
eig=q[i];
retain_eig=retain_eig+eig;
rate_eig=retain_eig/sq;
if rate_eig >= 0.7 then do;idx=i; new_eig=q[1:idx];stop;end;
end;
print retain_eig;
print idx;
print new_eig;
u1=u[1:idx,];
print u1;
p=a*(u1)`;
print p;
quit;
proc princomp data=tb out=tb1;
run;