首页 > 解决方案 > 如何在 SAS 循环中使用数据行而不是“卡片”?

问题描述

我对 SAS 有一个基本问题。我有一个代码块,可以计算 SAS 中作为“CARD”给出的 6 个变量中的三个值。对于每一行卡片,我都需要一次又一次地运行整个代码。我应该这样做超过 500 次。我想要做的是在代码中创建一个循环,计算每个 excel 行的 3 个值,而不是一张一张地使用卡片。这是我使用的完整代码:

DATA Example;
INPUT tree dbh th k h dob;
b1=-3.6652; b2=1.7867; b3=-1.3066;
b4=25.0398; a1=0.8153; a2=0.1614;
y=(dob/dbh)**2; x=h/th; x1=x-1; x2=x*x-1 ;
* Matrix of Partial Derivatives;
 IF (x >= a1) THEN DO;
   zi1=x1; zi2=x2; zi3=0;
   zi4=0; zi5=0; zi6=0;
   END;
 ELSE DO; 
   IF (a2 <= x < a1) THEN DO;
     zi1=x1; zi2=x2; zi3=(a1-x)**2;
     zi4=0.0; zi5=2*b3*(a1-x);
     zi6=0.0;
     END ;
   ELSE DO ;
     zi1=x1; zi2=x2; zi3=(a1-x)**2;
     zi4=(a2-x)**2; zi5=2*b3*(a1-x);
     zi6=2*b4*(a2-x);
     END; 
 END;
* Vector of residuals; 
 IF x >= a1 THEN DO; 
   I1=0; I2=0; 
   END;
 ELSE DO ;
   IF a2 <= x < a1 THEN DO; 
     I1=1; I2=0;
     END;
   ELSE DO; 
     I1=1; I2=1;
     END;
 END;
est=b1*x1+b2*x2+b3*((a1-x)**2)*I1+b4*((a2-x)**2)*I2;
res=y-est;
* Variance (sd) and covariance (g) structures ;
 sd1=((dbh**-0.7525)*exp(-2.9874*x))**.5; 
CARDS;
2   40.0    19.4    1   7.8 29.0
;
RUN ;
PROC IML ;
USE Example ;
READ ALL VAR {zi1 zi2 zi3 zi4 zi5 zi6} INTO Zk;
READ ALL VAR {res} INTO RES;
READ ALL VAR {sd1} INTO Gk ;
D = {0.02847 0.04895 -0.5325, 0.04895 0.09752 -0.9661,
    -0.5325 -0.9661 338.22};
Rk = 0.02594 * Gk * Gk ;
Bk = {1 0 0 , 0 0 0, 0 1 0, 0 0 1, 0 0 0, 0 0 0};
Zk = Zk*Bk;
bk = D*Zk`*INV(Zk * D * Zk` + Rk)*RES;
PRINT bk;

我在代码的开头添加了以下几行,以便将我的 6 个变量行作为数据表导入。

PROC IMPORT OUT= WORK.dataset0 
            DATAFILE= "C:\Users\John\Desktop\calibration\aaa.xlsx" 
            DBMS=EXCEL REPLACE;
     SHEET="Sheet1"; 
     GETNAMES=YES;
     RUN;

我的数据文件就像

tree dbh th k h dob
2 40.0 19.4 1 7.8 29.0
3 35.1 12.4 1 8.2 22.0
.  .     .  .  .    .
.  .     .  .  .    .

我需要替换以下几行来创建一个循环或其他东西

CARDS;
2   40.0    19.4    1   7.8 29.0
;

为了计算每一行的值。

我希望你能帮忙!提前致谢。

标签: loopssas

解决方案


这不是你想要的吗?至少在第一部分,我没有接触 IML 部分。

data want;
set dataset0;

b1=-3.6652; b2=1.7867; b3=-1.3066;
b4=25.0398; a1=0.8153; a2=0.1614;
y=(dob/dbh)**2; x=h/th; x1=x-1; x2=x*x-1 ;
* Matrix of Partial Derivatives;
 IF (x >= a1) THEN DO;
   zi1=x1; zi2=x2; zi3=0;
   zi4=0; zi5=0; zi6=0;
   END;
 ELSE DO; 
   IF (a2 <= x < a1) THEN DO;
     zi1=x1; zi2=x2; zi3=(a1-x)**2;
     zi4=0.0; zi5=2*b3*(a1-x);
     zi6=0.0;
     END ;
   ELSE DO ;
     zi1=x1; zi2=x2; zi3=(a1-x)**2;
     zi4=(a2-x)**2; zi5=2*b3*(a1-x);
     zi6=2*b4*(a2-x);
     END; 
 END;
* Vector of residuals; 
 IF x >= a1 THEN DO; 
   I1=0; I2=0; 
   END;
 ELSE DO ;
   IF a2 <= x < a1 THEN DO; 
     I1=1; I2=0;
     END;
   ELSE DO; 
     I1=1; I2=1;
     END;
 END;
est=b1*x1+b2*x2+b3*((a1-x)**2)*I1+b4*((a2-x)**2)*I2;
res=y-est;
* Variance (sd) and covariance (g) structures ;
 sd1=((dbh**-0.7525)*exp(-2.9874*x))**.5; 

run;

推荐阅读