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
- Permalink
- Email to a Friend
- Report Inappropriate Content

09-24-2014 09:45 AM

Please, I wish to ask if any could help correct this error:

NOTE: Module FUNC defined.

47 interval = {A, B};

**48 call quad(answer, "Func", interval);**

** param must be numeric**

**ERROR: (execution) Character argument should be numeric**

*This is data set and code:*

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;

interval = {A, B};

call quad(answer, "Func", interval);

create kaplan1n var{A B Answer };

append;

quit;

Accepted Solutions

Solution

09-24-2014
03:11 PM

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

Posted in reply to desireatem

09-24-2014 03:11 PM

You want to allocate a vector outside of the loop and fill it within the loop, as described in this article: Pre-allocate arrays to improve efficiency - The DO Loop

This and other efficiency tips that you've asked about are found in Chapter 2 of *Statistical Programming with SAS/IML Software*

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

do i = 1 to nrow(A);

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

answer* = result;*

end;

All Replies

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

Posted in reply to desireatem

09-24-2014 10:30 AM

If you are trying to compute four integrals, use the i_th row of DM as the interval for the i_th computation:

do i = 1 to nrow(DM);

call quad(answer, func, DM[i,]);

...

end;

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

Posted in reply to Rick_SAS

09-24-2014 02:35 PM

Hello Rick, My interval is A, B. The lower limit is A and upper limit is B, , the code does not specified the upper and lower limit. I have to pick the correct limit .

do i = 1 to nrow(DM);

call quad(answer, func, DM[i,]);

...

end;

I modified my code as such:

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;

do i = 1 to nrow(DM);

call quad(answer, "Func", DM[i,]);

end;

create kaplan1n var{A B Answer };

append;

quit;

statement : CALL at line 8281 column 1

ERROR: (execution) Matrices do not conform to the operation.

operation : QUAD at line 8307 column 1

operands : *LIT1007, _TEM1001

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

Func

_TEM1001 1 row 1 col (numeric)

3

statement : CALL at line 8307 column 1

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

Posted in reply to desireatem

09-24-2014 02:44 PM

Your error is that DM[1,2] is a scalar, whereas QUAD is expecting a vector with two elements, as in my code. You could also use A* || B , if you prefer.*

Of course, you also will want to accumulate the results inside the loop. Currently you are just overwriting ANSWER four times, and the data set is only writing the answer to the last integration.

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

Posted in reply to Rick_SAS

09-24-2014 02:57 PM

Thanks a lot. Yes you are right,

This just give me one answer and I need a result for each row.

This code below gives me and answer. How ever, just as you said , it is not giving me the answer for each row. How do I loop it from 1 to 4 so that each row has an answer. ?

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;

do i = 1 to nrow(DM);

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

end;

create kaplan1n var{A B Answer };

append;

quit;

Solution

09-24-2014
03:11 PM

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

Posted in reply to desireatem

09-24-2014 03:11 PM

You want to allocate a vector outside of the loop and fill it within the loop, as described in this article: Pre-allocate arrays to improve efficiency - The DO Loop

This and other efficiency tips that you've asked about are found in Chapter 2 of *Statistical Programming with SAS/IML Software*

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

do i = 1 to nrow(A);

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

answer* = result;*

end;

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

Posted in reply to Rick_SAS

09-24-2014 03:23 PM

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;