Chapter Contents Previous Next
 The MODEL Procedure

## Diagnostics and Debugging

PROC MODEL provides several features to aid in finding errors in the model program. These debugging features are not usually needed; most models can be developed without them.

The example model program that follows will be used in the following sections to illustrate the diagnostic and debugging capabilities. This example is the estimation of a segmented model.

```      *---------Fitting a Segmented Model using MODEL----*
|      |                                           |
|   y  | quadratic          plateau                |
|      | y=a+b*x+c*x*x      y=p                    |
|      |                     ..................... |
|      |              .     :                      |
|      |          .         :                      |
|      |       .            :                      |
|      |     .              :                      |
|      |    .               :                      |
|      +-----------------------------------------X |
|                          x0                      |
|                                                  |
| continuity restriction: p=a+b*x0+c*x0**2         |
| smoothness restriction: 0=b+2*c*x0 so x0=-b/(2*c)|
*--------------------------------------------------*;
data a;
input y x @@;
datalines;
.46 1  .47  2 .57  3 .61  4 .62  5 .68  6 .69  7
.78 8  .70  9 .74 10 .77 11 .78 12 .74 13 .80 13
.80 15 .78 16
;
proc model data=a;
parms a 0.45 b 0.5 c -0.0025;

x0 = -.5*b / c;      /* join point */
if x < x0 then       /* Quadratic part of model */
y = a + b*x + c*x*x;
else                 /* Plateau part of model */
y = a + b*x0 + c*x0*x0;

fit y;
run;
```

### Program Listing

The LIST option produces a listing of the model program. The statements are printed one per line with the original line number and column position of the statement.

The program listing from the example program is shown in Figure 14.73.

 The MODEL Procedure

 Listing of Compiled Program Code Stmt Line:Col Statement as Parsed 1 34657:83 x0 = (-0.5 * b) / c; 2 34657:105 if x < x0 then 3 34657:133 PRED.y = a + b * x + c * x * x; 3 34657:133 RESID.y = PRED.y - ACTUAL.y; 3 34657:133 ERROR.y = PRED.y - y; 4 34657:157 else 5 34657:185 PRED.y = a + b * x0 + c * x0 * x0; 5 34657:185 RESID.y = PRED.y - ACTUAL.y; 5 34657:185 ERROR.y = PRED.y - y;

Figure 14.73: LIST Output for Segmented Model

The LIST option also shows the model translations that PROC MODEL performs. LIST output is useful for understanding the code generated by the %AR and the %MA macros.

### Cross-Reference

The XREF option produces a cross-reference listing of the variables in the model program. The XREF listing is usually used in conjunction with the LIST option. The XREF listing does not include derivative (@-prefixed) variables. The XREF listing does not include generated assignments to equation variables, PRED, RESID, and ERROR-prefixed variables, unless the DETAILS option is used.

The cross-reference from the example program is shown in Figure 14.74.

 The MODEL Procedure

 Cross Reference Listing For Program Symbol----------- Kind Type References (statement)/(line):(col) a Var Num Used: 3/34682:139 5/34682:191 b Var Num Used: 1/34682:91 3/34682:142 5/34682:194 c Var Num Used: 1/34682:94 3/34682:148 5/34682:201 x0 Var Num Assigned: 1/34682:94 Used: 2/34682:112 5/34682:194 5/34682:201 5/34682:204 x Var Num Used: 2/34682:112 3/34682:142 3/34682:148 3/34682:150 PRED.y Var Num Assigned: 3/34682:145 5/34682:198

Figure 14.74: XREF Output for Segmented Model

### Compiler Listing

The LISTCODE option lists the model code and derivatives tables produced by the compiler. This listing is useful only for debugging and should not normally be needed.

LISTCODE prints the operator and operands of each operation generated by the compiler for each model program statement. Many of the operands are temporary variables generated by the compiler and given names such as #temp1. When derivatives are taken, the code listing includes the operations generated for the derivatives calculations. The derivatives tables are also listed.

A LISTCODE option prints the transformed equations from the example shown in Figure 14.75 and Figure 14.76.

 The MODEL Procedure

 Listing of Compiled Program Code Stmt Line:Col Statement as Parsed 1 34707:83 x0 = (-0.5 * b) / c; 1 34707:83 @x0/@b = -0.5 / c; 1 34707:83 @x0/@c = (0 - x0) / c; 2 34707:105 if x < x0 then 3 34707:133 PRED.y = a + b * x + c * x * x; 3 34707:133 @PRED.y/@a = 1; 3 34707:133 @PRED.y/@b = x; 3 34707:133 @PRED.y/@c = x * x; 3 34707:133 RESID.y = PRED.y - ACTUAL.y; 3 34707:133 @RESID.y/@a = @PRED.y/@a; 3 34707:133 @RESID.y/@b = @PRED.y/@b; 3 34707:133 @RESID.y/@c = @PRED.y/@c; 3 34707:133 ERROR.y = PRED.y - y; 4 34707:157 else 5 34707:185 PRED.y = a + b * x0 + c * x0 * x0; 5 34707:185 @PRED.y/@a = 1; 5 34707:185 @PRED.y/@b = x0 + b * @x0/@b + (c * @x0/@b * x0 + c * x0 * @x0/@b); 5 34707:185 @PRED.y/@c = b * @x0/@c + ((x0 + c * @x0/@c) * x0 + c * x0 * @x0/@c); 5 34707:185 RESID.y = PRED.y - ACTUAL.y; 5 34707:185 @RESID.y/@a = @PRED.y/@a; 5 34707:185 @RESID.y/@b = @PRED.y/@b; 5 34707:185 @RESID.y/@c = @PRED.y/@c; 5 34707:185 ERROR.y = PRED.y - y;

Figure 14.75: LISTCODE Output for Segmented Model - Statements as Parsed

 The MODEL Procedure

 1 Stmt ASSIGN line 16129 column 83. (1) arg=x0 argsave=x0 Source Text: x0 = -.5*b / c; Oper * at 16129:91 (30,0,2). * : #temp1 <- -0.5 b Oper / at 16129:94 (31,0,2). / : x0 <- #temp1 c Oper eeocf at 16129:94 (18,0,1). eeocf : _DER_ <- _DER_ Oper / at 16129:94 (31,0,2). / : @x0/@b <- -0.5 c Oper - at 16129:94 (33,0,2). - : @1dt1_2 <- 0 x0 Oper / at 16129:94 (31,0,2). / : @x0/@c <- @1dt1_2 c 2 Stmt IF line 16129 column 105. (2) arg=#temp1 argsave=#temp1 ref.st=ASSIGN stmt number 5 at 16129:185 Source Text: if x < x0 then Oper < at 16129:112 (36,0,2). < : #temp1 <- x x0 3 Stmt ASSIGN line 16129 column 133. (1) arg=PRED.y argsave=y Source Text: y = a + b*x + c*x*x; Oper * at 16129:142 (30,0,2). * : #temp1 <- b x Oper + at 16129:139 (32,0,2). + : #temp2 <- a #temp1 Oper * at 16129:148 (30,0,2). * : #temp3 <- c x Oper * at 16129:150 (30,0,2). * : #temp4 <- #temp3 x Oper + at 16129:145 (32,0,2). + : PRED.y <- #temp2 #temp4 Oper eeocf at 16129:150 (18,0,1). eeocf : _DER_ <- _DER_ Oper * at 16129:150 (30,0,2). * : @1dt1_1 <- x x Oper = at 16129:145 (1,0,1). = : @PRED.y/@a <- 1 Oper = at 16129:145 (1,0,1). = : @PRED.y/@b <- x Oper = at 16129:145 (1,0,1). = : @PRED.y/@c <- @1dt1_1 3 Stmt Assign line 16129 column 133. (1) arg=RESID.y argsave=y Oper - at 16129:133 (33,0,2). - : RESID.y <- PRED.y ACTUAL.y Oper eeocf at 16129:133 (18,0,1). eeocf : _DER_ <- _DER_ Oper = at 16129:133 (1,0,1). = : @RESID.y/@a <- @PRED.y/@a Oper = at 16129:133 (1,0,1). = : @RESID.y/@b <- @PRED.y/@b Oper = at 16129:133 (1,0,1). = : @RESID.y/@c <- @PRED.y/@c 3 Stmt Assign line 16129 column 133. (1) arg=ERROR.y argsave=y Oper - at 16129:133 (33,0,2). - : ERROR.y <- PRED.y y 4 Stmt ELSE line 16129 column 157. (9) Source Text: else

Figure 14.76: LISTCODE Output for Segmented Model - Compiled Code

 Chapter Contents Previous Next Top