Как использовать строки данных вместо «карт» в al oop в SAS? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть базовая c проблема с SAS. У меня есть блок кода, который вычисляет три значения в пределах 6 переменных, указанных как «КАРТА» в SAS. С каждой строкой карты мне нужно снова и снова запускать весь код. Я должен сделать это более 500 раз. Я хочу создать в коде код al oop, который вычисляет 3 значения для каждой строки Excel вместо использования карточек одна за другой. Вот полный код, который я использовал:

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
.  .     .  .  .    .
.  .     .  .  .    .

Мне нужно заменить следующие строки, чтобы создать al oop или что-то

CARDS;
2   40.0    19.4    1   7.8 29.0
;

, чтобы вычислить значения для каждой строки.

Я надеюсь, вы можете помочь! Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Разве это не делает то, что вы хотите? По крайней мере, в первой части я не касался части 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;
0 голосов
/ 15 апреля 2020

Вы просто ищете оператор DO DATA в PRO C IML? https://documentation.sas.com/?docsetId=imlug&docsetTarget=imlug_langref_sect131.htm&docsetVersion=15.1&locale=en

PROC IML ;
  USE Example ;
  do data ;
    READ next VAR {zi1 zi2 zi3 zi4 zi5 zi6} INTO Zk;
    READ next VAR {res} INTO RES;
    READ next 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;
  end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...