SAS IML交互式数据处理及小实例



  • /*3 交互式矩阵语言 IML*/
    /*3.1  概述*/
    Proc IML;
    	Sc=15.25;
    	Vh={1 2};
    	Print Sc;
    	Print Vh;
    Quit;
    
    /*3.2  数据集操作语句*/
    Proc IML;
    filename out 'user.matrix'; 
    file out; 
        do i=1 to nrow(x); 
           do j=1 to ncol(x); 
              put (x[i,j]) 1.0 +2 @; 
           end; 
         	put;
    	end; 
       closefile out;
    QUIT;
    
    /*3.3  循环语句*/
    /*3.4  分支语句*/
    /*3.5  CALL语句*/
    /*3.5  实例*/
    
    /*实例1:方程组求解*/
    
    PROC IML;
    		A={2 3 1, 4 -1 2, 3 -1 1};
    		b={10, 13,8};
    		X=INV(A)*b;
    		PRINT A b X;
    QUIT;
    
    /*	实例2:非线性方程的迭代求解*/
    PROC IML;
      	maxiter=50; /* 定义最大迭代次数 */ 
        converge=.000001; /* 定义收敛精度*/ 
           /* 定义待求解函数 */ 
    start fun; 
          f= x**3-x+2; 
       finish fun; 
           /* 定义导函数 */ 
       start deriv; 
          df=3*x**2-1; 
       finish deriv; 
    start newton; 
          run fun;          
          do iter=1 to maxiter  /* 迭代直到最大迭代次数 */ 
          while(max(abs(f))>converge);            /* 收敛则提前退出 */ 
             run deriv;                /* 计算导函数 */ 
             delta=f/df;      /* 计算增量 */ 
             x=x-delta;                    /* 更新值 */ 
             run fun;                      /* 计算函数值 */ 
         end; 
       finish newton; 
    do; 
          print "Solving the equation:" ,; 
          x=-1;     /* 赋初值 */ 
          run newton; 
    	  iter=iter-1;
    	  print x f iter; 
    	  if iter>maxiter then print 'Not converge!';
       end;
    QUIT;
    
    /*实例3:把环比指数转化为定基指数*/
    data a;
    input id index;
    cards;
    1 100
    1 93
    1 103
    1 97
    2 100
    2 97
    2 116
    2 98
    run;
    proc iml;
    use a;
    read all into mat;
    index=j(8,1,1);
    index[1]=mat[1,2];
    do i=2 to 8 by 1;
       if (mat[i,1]=mat[i-1,1]) then index[i]=index[i-1]*mat[i,2];
       else index[i]=mat[i,2]; 
    end;
     print index;
    create b from index;
    append from index;
    close b;
    run;
    

登录后回复