楼主: 治感冒
6328 5

请问SAS中如何操作矩阵与计算特征值 [推广有奖]

  • 1关注
  • 1粉丝

博士生

82%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0.0036
学术水平
2 点
热心指数
2 点
信用等级
1 点
经验
341 点
帖子
178
精华
0
在线时间
452 小时
注册时间
2007-3-9
最后登录
2020-1-8

楼主
治感冒 发表于 2013-8-1 11:04:19 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
请问各位,我需要做如下操作,如何实现?例如:
  1. DATA matrix;
  2. INPUT a b c;
  3. CARDS;
  4. 1 0.4 0.3
  5. 0.8 2 0.2
  6. 0.7 0.1 0.6;
  7. RUN;
复制代码
读取了matrix这个观测,现在要做的操作如下:
  • 计算新矩阵 P = matrix - I,(I为单位矩阵)
  • 计算新矩阵的转置矩阵:P'.
  • 计算新矩阵 Q = P'P,(矩阵乘法)
  • 计算新矩阵Q的特征值


谢谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:如何操作 特征值 matrix Input cards 如何

沙发
清风慕竹1992 发表于 2013-8-1 11:26:30
同求

藤椅
ziyenano 发表于 2013-8-1 11:54:05
DATA matrix;
INPUT a b c;
CARDS;
1 0.4 0.3
0.8 2 0.2
0.7 0.1 0.6
;
RUN;

proc iml;
use matrix;
read all into g;
close matrix;
P=g-i(nrow(g));
t_P=P`;
Q=P`*P;
eig_Q=eigval(Q);
print P Q t_P eig_Q;
quit;

板凳
治感冒 发表于 2013-8-1 21:00:05
ziyenano 发表于 2013-8-1 11:54
DATA matrix;
INPUT a b c;
CARDS;
谢谢!不过如果不能用IML模块的话该如何呢?我们的SAS版本里没有IML的授权,

报纸
ziyenano 发表于 2013-8-2 23:42:00
ans1:
data p(drop=i);
set matrix;
array p(*) a b c;
do i=1 to dim(p);
   if i=_n_ then p(i)=p(i)-1;
end;
run;

ans2:
proc transpose data=p out=t_p;
run;

ans3:
data t1(rename=(a=a1 b=b1 c=c1));
set p p p;
run;

data t2;
if mod(_n_-1,3)=0 then set p;
set t1;
array p1(*) a b c;
array p2(*) a1 b1 c1;
p=0;
do i=1 to dim(p1);
   p=p+p1(i)*p2(i);
end;
run;


data Q;
array q(3);
do i=1 to 3;
   set t2(keep=p);
       q(i)=p;
end;
drop p i;
run;

用data步写矩阵太难受了,特征值不晓得怎么用data步写,
proc fcmp支持有限的矩阵运算,不过不是很好用,
实在不行用R吧,算出来结果再传回SAS

地板
yongyitian 发表于 2013-8-3 10:27:50
这是另一种方式来计算矩阵,但不包括特征值和特征向量.
如果数据不多, 可以直接在网上计算特征值和特征向量.
  1. data matrix2;
  2.   array  x{3,3} _temporary_ ;     array II{3,3} _temporary_ (1 0 0 0 1 0 0 0 1);
  3.   array  p{3,3} _temporary_ ;     array pp{3,3} _temporary_ ;
  4.   array  q{3,3} _temporary_  (0 0 0 0 0 0 0 0 0);
  5.   array qq{3,3} _temporary_  (0 0 0 0 0 0 0 0 0);

  6.   if _n_ = 1 then do;       /* do the matrix calculations      */
  7.       do i = 1 to 3;
  8.          set matrix point=i;  
  9.             x[i, 1] = a;    /* create the matrix from vector a b c */
  10.             x[i, 2] = b;
  11.             x[i, 3] = c;
  12.       end;     
  13.       do i = 1 to 3;
  14.          do j = 1 to 3;
  15.             p[i, j] = x[i, j] - II[i, j];  /* P = Matrix - I */
  16.          end;
  17.       end;
  18. /* transpose */
  19.       do i = 1 to 3;           /* PP is the transpose of P */
  20.         do j = 1 to 3;
  21.                  PP[i, j] = p[j, i];
  22.         end;
  23.       end;
  24.       do i = 1 to 3;                               /* Q = PP * P */
  25.          Q[i, 1] = pp[i, 1] *p[1, 1] + pp[i, 2] *p[2, 1] + pp[i, 3]*p[3, 1] ;  
  26.          Q[i, 2] = pp[i, 1] *p[1, 2] + pp[i, 2] *p[2, 2] + pp[i, 3]*p[3, 2] ;  
  27.          Q[i, 3] = pp[i, 1] *p[1, 3] + pp[i, 2] *p[2, 3] + pp[i, 3]*p[3, 3] ;  
  28.       end;  
  29.       do i = 1 to 3;                     /* another way to calculate QQ=PP*P */  
  30.         do j = 1 to 3;
  31.           do k = 1 to 3;
  32.                   QQ[i, j] = QQ[i,j] + PP[i, k]*P[k, j];    /* Q = PP * P */
  33.       end; end; end;
  34.   end;  /* end of _n_=1 loop for matrix calculation   */
  35.   set matrix;   /* output the calculated matrix to the dataset */   
  36.       p1 =  p[_n_, 1];    p2 =  p[_n_, 2];   p3 =  p[_n_, 3];  
  37.      pp1 = pp[_n_, 1];   pp2 = pp[_n_, 2];  pp3 = pp[_n_, 3];
  38.       q1 =  q[_n_, 1];    q2 =  q[_n_, 2];   q3 =  q[_n_, 3];
  39.      qq1 = qq[_n_, 1];   qq2 =  q[_n_, 2];  qq3 =  q[_n_, 3];
  40.      drop  j k;
  41. run;
复制代码

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-5 23:39