loops - 如何在 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
;
为了计算每一行的值。
我希望你能帮忙!提前致谢。
解决方案
这不是你想要的吗?至少在第一部分,我没有接触 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;
推荐阅读
- spring-boot - 如何在 Spring Boot Feign Client 上定义全局静态标头
- acumatica - 采购订单屏幕上的 CuryUnitCost,POLine DAC
- django - 在 Django 中自定义错误消息“请填写此表格”
- countif - COUNTIFS() 用于定义为 NAME 的非连续范围
- visual-studio - 签入 TFS 时,Visual Studio 找不到路径 system.net.http 的一部分
- django - 禁止 403:Firefox 中的 CSRF 验证失败错误,而不是 chrome
- javascript - 节点动态参数和从函数传递信息到变量
- sql - 选择指定记录后的下 3 条记录时缺少数据
- liquibase - Liquibase 可以处理不带引号的 csv 数据吗
- javascript - JavaScript ES6 模块:避免污染全局命名空间