turn on suggestions

Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.

Showing results for

Find a Community

Topic Options

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

09-25-2014 11:16 PM

**Please can anyone help correct this code for me::**

**Data sim;**

**Input A B C Beta;**

**cards;**

**1 3 3 0.5**

**2 7 4 0.5**

**3 10 3 0.5**

**4 12 6 0.5**

**;**

**Run;**

**proc iml;**

**use sim;**

**read all var{A B C} into DM;**

**close;**

**A = DM[,1]; B = DM[,2]; C = DM[,3]; Beta = DM[,4];**

**n = nrow(DM);**

**start Func(x);**

** return( exp(x-1)*exp(2-x +Beta*C )#(cdf("Normal", x-10+Beta*C)-cdf("Normal", x-4+C)));**

**finish;**

**answer = j(nrow(DM),1);**

**do i = 1 to nrow(DM);**

**call quad(result, "Func", A || B,);**

**answer = result;**

**end;**

**create kaplan1n var{A B C Beta Answer };**

**append;**

**quit;**

**LOG FILE**

114 proc iml;

NOTE: IML Ready

115 use sim;

116 read all var{A B C} into DM;

117 close;

NOTE: Closing WORK.SIM

118 A = DM[,1];

118! B = DM[,2];

118! C = DM[,3];

118! Beta = DM[,4];

ERROR: (execution) Invalid subscript or subscript out of range.

operation : [ at line 118 column 47

operands : DM, , *LIT1005

DM 4 rows 3 cols (numeric)

1 3 3

2 7 4

3 10 3

4 12 6

*LIT1005 1 row 1 col (numeric)

4

statement : ASSIGN at line 118 column 38

119 n = nrow(DM);

120 start Func(x);

121 return( exp(x-1)*exp(2-x +Beta*C*)#(cdf("Normal", x-10+Beta*C )-cdf("Normal",*

121! x-4+C*)));*

122 finish;

NOTE: Module FUNC defined.

123 answer = j(nrow(DM),1);

124 do i = 1 to nrow(DM);

125 call quad(result, "Func", A* || B ,);*

126 answer* = result;*

127 end;

ERROR: (execution) Matrix has not been set to a value.

operation : [ at line 121 column 37

operands : C, i

C 0 row 0 col (type ?, size 0)

i 0 row 0 col (type ?, size 0)

statement : RETURN at line 121 column 4

traceback : module FUNC at line 121 column 4

Convergence could not be attained over the subinterval

(1 , 3 )

The function might have one of the following:

1) A slowly convergent or a divergent integral.

2) Strong oscillations.

3) A small scale in the integrand: in this case

you can change the independent variable

in the integrand, or,

provide the optional vector describing roughly

the mean and the standard deviation of the

integrand

4) Points of discontinuities in the interior

in this case, you can provide a vector containing

the points of discontinuity and try again.

ERROR: Execution error as noted previously. (rc=100)

operation : QUAD at line 125 column 1

operands : *LIT1014, _TEM1003,

*LIT1014 1 row 1 col (character, size 4)

Func

_TEM1003 1 row 2 cols (numeric)

1 3

statement : CALL at line 125 column 1

128 create kaplan1n var{A B C Beta Answer };

129 append;

130 quit;

NOTE: Exiting IML.

NOTE: The data set WORK.KAPLAN1N has 4 observations and 5 variables.

NOTE: The SAS System stopped processing this step because of errors.

NOTE: PROCEDURE IML used (Total process time):

real time 0.03 seconds

cpu time 0.03 seconds

Accepted Solutions

Solution

09-26-2014
11:07 AM

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

09-26-2014 11:07 AM

start Func(x) global( Beta_i, C_i );

return( exp(-x)*exp(2-x +Beta_i*C_i)#(cdf("Normal", x-2+Beta_i*C_i)-cdf("Normal", x-1+C_i)) );

finish;

answer = j(nrow(DM),1);

do i = 1 to nrow(DM);

Beta_i = Beta*; C_i = C ; /* set global variables */*

call quad(result, "Func", A* || B ,);*

answer* = result;*

end;

Here is a blog post that describes the GLOBAL statement and why it is necessary:

All Replies

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

09-26-2014 09:26 AM

Try reading four variables into DM:

**read all var{A B C Beta} into DM;**

**or**

**read all var _NUM_ into DM;**

By the way, you never use DM for anything except for finding the length of obervations. You could save yourself some trouble if you read the data like this:

**use sim nobs n; /* n contains number of observations */**

**read all var{A B C Beta}; /* A B C and Beta are defined as vectors */**

**close;**

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

09-26-2014 09:55 AM

Hello Rick, Thanks for the help. I did that but still having issue:

I think the problem is with this line : **return( exp(x-1)*exp(2-x +Beta*C )#(cdf("Normal", x-10+Beta*C)-cdf("Normal", x-4+C)));**

Data sim;

Input A B C Beta;

cards;

1 3 3 0.5

2 7 4 0.5

3 10 3 0.5

4 12 6 0.5

;

Run;

proc iml;

use sim;

read all var _NUM_ into DM;

close;

A = DM[,1]; B = DM[,2]; C = DM[,3]; Beta = DM[,4];

n = nrow(DM);

start Func(x);

return( exp(x-1)*exp(2-x +Beta*C*)#(cdf("Normal", x-10+Beta*C )-cdf("Normal", x-4+C)));*

finish;

answer = j(nrow(DM),1);

do i = 1 to nrow(DM);

call quad(result, "Func", A* || B ,);*

answer* = result;*

end;

create kaplan1n var{A B C Beta Answer };

append;

quit;

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

09-26-2014 10:14 AM

Think carefully when you get an error. Does the error message give useful information that would help you debug the problem yourself? In this case, 'i' is not defined in the function, so C* is undefined.*

To help you out, here are some blog posts where I have discussed error messages and how to interpret them:

How to interpret SAS/IML error messages - The DO Loop

How to find and fix programming errors - The DO Loop

Interpreting PROC IML error messages: Matrices do not conform to the operation - The DO Loop

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

09-26-2014 10:44 AM

Hello Rick, Thanks for the help. I tried to fix it , however it runs without error but there is no answer because it never converges.

Data sim;

Input A B C Beta;

cards;

1 2 7 0.5

1 2.5 9 0.5

1 2.5 8 0.5

1 3 9 0.5

;

Run;

proc iml;

use sim;

read all var _NUM_ into DM;

close;

A = DM[,1]; B = DM[,2]; C = DM[,3]; Beta = DM[,4];

n = nrow(DM);

start Func(x);

**do i = 1 to nrow(DM);**

** return( exp(-x)*exp(2-x +Beta *C)#(cdf("Normal", x-2+Beta*C)-cdf("Normal", x-1+C)));**

**end;**

**finish;**

answer = j(nrow(DM),1);

do i = 1 to nrow(DM);

call quad(result, "Func", A* || B ,);*

answer* = result;*

end;

create kaplan1n var{A B C Beta Answer };

append;

quit;

LOG FILE

417 Data sim;

418 Input A B C Beta;

419 cards;

NOTE: The data set WORK.SIM has 4 observations and 4 variables.

NOTE: DATA statement used (Total process time):

real time 0.06 seconds

cpu time 0.00 seconds

424 ;

425 Run;

426 proc iml;

NOTE: IML Ready

427 use sim;

428 read all var _NUM_ into DM;

429 close;

NOTE: Closing WORK.SIM

430 A = DM[,1];

430! B = DM[,2];

430! C = DM[,3];

430! Beta = DM[,4];

431 n = nrow(DM);

432

433 start Func(x);

434 do i = 1 to nrow(DM);

435 return( exp(-x)*exp(2-x +Beta**C )#(cdf("Normal", x-2+Beta*C)-cdf("Normal",*

435! x-1+C*)));*

436 end;

437 finish;

NOTE: Module FUNC defined.

438 answer = j(nrow(DM),1);

439 do i = 1 to nrow(DM);

440 call quad(result, "Func", A* || B ,);*

441 answer* = result;*

442 end;

Convergence could not be attained over the subinterval

(1 , 2 )

The function might have one of the following:

1) A slowly convergent or a divergent integral.

2) Strong oscillations.

3) A small scale in the integrand: in this case

you can change the independent variable

in the integrand, or,

provide the optional vector describing roughly

the mean and the standard deviation of the

integrand

4) Points of discontinuities in the interior

in this case, you can provide a vector containing

the points of discontinuity and try again.

Convergence could not be attained over the subinterval

(1 , 2.5 )

The function might have one of the following:

1) A slowly convergent or a divergent integral.

2) Strong oscillations.

3) A small scale in the integrand: in this case

you can change the independent variable

in the integrand, or,

provide the optional vector describing roughly

the mean and the standard deviation of the

integrand

4) Points of discontinuities in the interior

in this case, you can provide a vector containing

the points of discontinuity and try again.

Convergence could not be attained over the subinterval

(1 , 2.5 )

The function might have one of the following:

1) A slowly convergent or a divergent integral.

2) Strong oscillations.

3) A small scale in the integrand: in this case

you can change the independent variable

in the integrand, or,

provide the optional vector describing roughly

the mean and the standard deviation of the

integrand

4) Points of discontinuities in the interior

in this case, you can provide a vector containing

the points of discontinuity and try again.

Convergence could not be attained over the subinterval

(1 , 3 )

The function might have one of the following:

1) A slowly convergent or a divergent integral.

2) Strong oscillations.

3) A small scale in the integrand: in this case

you can change the independent variable

in the integrand, or,

provide the optional vector describing roughly

the mean and the standard deviation of the

integrand

4) Points of discontinuities in the interior

in this case, you can provide a vector containing

the points of discontinuity and try again.

443 create kaplan1n var{A B C Beta Answer };

444 append;

445 quit;

NOTE: Exiting IML.

NOTE: The data set WORK.KAPLAN1N has 4 observations and 5 variables.

NOTE: PROCEDURE IML used (Total process time):

real time 0.15 seconds

cpu time 0.11 seconds

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

09-26-2014 10:50 AM

Your function doesn't make sense.

1) DM is not defined in the function

2) You can't loop over several RETURN statements. When IML hits the first RETURN statement, it jumps out of the loop and returns.

3) Are you trying to return a vector from the "Func" function? The QUAD function expects the function to return a scalar quantity.

It would be useful if you could explain in words what you are trying to accomplish. Then we can create SAS/IML statements that reflect the statistical or mathematical objectives.

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

09-26-2014 10:57 AM

Hello Rick,

Thank you, I am just trying to integrate this function ** exp(x-1)*exp(2-x +Beta*C )#(cdf("Normal", x-10+Beta*C)-cdf("Normal", x-4+C))) numerical and have an answer for each row. The only contant is "BETA" which is 0.5. The limit is A and B that changes for each row. Also C changes for each row. I want to return a scalar. However, once I have additional variable on each row like in the case above, it doesnt give me any answer or runs with error. **

**My question is how to incorporate the variable C into the integral?? **

**I want to to something similar like the code below, just that in this case I have a additional variable C in the exponential funtion and CDF:**

Data sim;

Input A B;

cards;

1 3

2 7

3 10

4 12

;

Run;

proc iml;

use sim;

read all var{A B} into DM;

close;

A = DM[,1]; B = DM[,2];

n = nrow(DM);

start Func(x);

return( exp(2-x)#cdf("Normal", x) );

finish;

answer = j(nrow(DM),1);

do i = 1 to nrow(DM);

call quad(result, "Func", A* || B ,);*

answer* = result;*

end;

create kaplan1n var{A B Answer };

append;

quit;

Solution

09-26-2014
11:07 AM

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

09-26-2014 11:07 AM

start Func(x) global( Beta_i, C_i );

return( exp(-x)*exp(2-x +Beta_i*C_i)#(cdf("Normal", x-2+Beta_i*C_i)-cdf("Normal", x-1+C_i)) );

finish;

answer = j(nrow(DM),1);

do i = 1 to nrow(DM);

Beta_i = Beta*; C_i = C ; /* set global variables */*

call quad(result, "Func", A* || B ,);*

answer* = result;*

end;

Here is a blog post that describes the GLOBAL statement and why it is necessary:

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

09-26-2014 11:09 AM

Thanks a lot Rick, I will read the blog as well