Output from imlxmp1.sas |
Source
0 Graphs |
---|
NOTE: Capture of log output started.
NOTE: %INCLUDE (level 1) file n:\psy6140\examples\iml\imlxmp1.sas is file n:\psy6140\examples\iml\imlxmp1.sas.
1309 +title 'Basic matrix operations in Proc IML'; 1310 +options nodate ls=79 pageno=1; 1311 +/*----------------------------------------------------* 1312 + | Basic operations in Proc IML | 1313 + *----------------------------------------------------*/ 1314 + 1315 +proc iml;
IML Ready
1316 + 1317 + reset print log; 1318 + 1319 + *-- Scalars; 1320 + x = 12.3;
X 1 row 1 col (numeric) 12.3
1321 + y = {57};
Y 1 row 1 col (numeric) 57
1322 + 1323 + name = 'Bob';
NAME 1 row 1 col (character, size 3) Bob
1324 + msg = "Hi there,";
MSG 1 row 1 col (character, size 9) Hi there,
1325 + 1326 + print msg name x y;
MSG NAME X Y Hi there, Bob 12.3 57
1327 + 1328 + *-- Creating matrices and vectors; 1329 + 1330 + a = { 2 4, 1331 + 3 1};
A 2 rows 2 cols (numeric) 2 4 3 1
1332 + b = { 4 5, 0 1};
B 2 rows 2 cols (numeric) 4 5 0 1
1333 + 1334 + c = { 1 2 3 };
C 1 row 3 cols (numeric) 1 2 3
1335 + d = { 1, 2, 3};
D 3 rows 1 col (numeric) 1 2 3
1336 + 1337 + e={'a' 'b' 'c', 'd' 'e' 'f'};
E 2 rows 3 cols (character, size 1) a b c d e f
1338 + 1339 + *-- Simple matrix operations; 1340 + sum = a + b;
SUM 2 rows 2 cols (numeric) 6 9 3 2
1341 + diff = a - b;
DIFF 2 rows 2 cols (numeric) -2 -1 3 0
1342 + 1343 + *-- Elementwise product; 1344 + times = a # b;
TIMES 2 rows 2 cols (numeric) 8 20 0 1
1345 + *-- Matrix product; 1346 + prod = a * b;
PROD 2 rows 2 cols (numeric) 8 14 12 16
1347 + sqr = a##2;
SQR 2 rows 2 cols (numeric) 4 16 9 1
1348 + asq = a * a;
ASQ 2 rows 2 cols (numeric) 16 12 9 13
1349 + 1350 + *-- Comparison operations; 1351 + max = a<>b;
MAX 2 rows 2 cols (numeric) 4 5 3 1
1352 + min = a><b;
MIN 2 rows 2 cols (numeric) 2 4 0 1
1353 + less = a < b;
LESS 2 rows 2 cols (numeric) 1 1 0 0
1354 + more = a > b;
MORE 2 rows 2 cols (numeric) 0 0 1 0
1355 +*page; 1356 + *--------------------------------; 1357 + * Matrix-generating functions ; 1358 + *--------------------------------; 1359 + 1360 + ident = I(3);
IDENT 3 rows 3 cols (numeric) 1 0 0 0 1 0 0 0 1
1361 + ones = j(1,5);
ONES 1 row 5 cols (numeric) 1 1 1 1 1
1362 + zero = j(3,2,0);
ZERO 3 rows 2 cols (numeric) 0 0 0 0 0 0
1363 + 1364 + a = j(2,2,2);
A 2 rows 2 cols (numeric) 2 2 2 2
1365 + b = j(2,2,1);
B 2 rows 2 cols (numeric) 1 1 1 1
1366 + ab = block(a,b);
AB 4 rows 4 cols (numeric) 2 2 0 0 2 2 0 0 0 0 1 1 0 0 1 1
1367 + 1368 + a = shape({5 12},3,3);
A 3 rows 3 cols (numeric) 5 12 5 12 5 12 5 12 5
1369 + b = shape({5 12},3,3,-1);
B 3 rows 3 cols (numeric) 5 12 -1 -1 -1 -1 -1 -1 -1
1370 + 1371 + c = repeat({5 12},3,3);
C 3 rows 6 cols (numeric) 5 12 5 12 5 12 5 12 5 12 5 12 5 12 5 12 5 12
1372 + 1373 + index = 1:5;
INDEX 1 row 5 cols (numeric) 1 2 3 4 5
1374 + col = (4:6)`;
COL 3 rows 1 col (numeric) 4 5 6
1375 + rindex= 5:1;
RINDEX 1 row 5 cols (numeric) 5 4 3 2 1
1376 + 1377 + series= do(12,72,12);
SERIES 1 row 6 cols (numeric) 12 24 36 48 60 72
1378 + 1379 + vars = 'XX1': 'XX7';
VARS 1 row 7 cols (character, size 3) XX1 XX2 XX3 XX4 XX5 XX6 XX7
1380 + 1381 + *-- Diagonal matrices; 1382 + d = diag( {1 2 4} );
D 3 rows 3 cols (numeric) 1 0 0 0 2 0 0 0 4
1383 + s = diag( {1 2, 3 4} );
S 2 rows 2 cols (numeric) 1 0 0 4
1384 + v = vecdiag( a );
V 3 rows 1 col (numeric) 5 5 5
1385 + 1386 + *-----------------; 1387 + * Subscripts ; 1388 + *-----------------; 1389 + 1390 + *-- Selecting rows or columns; 1391 + col1 = d[,1];
COL1 3 rows 1 col (numeric) 1 0 0
1392 + row2 = d[2,];
ROW2 1 row 3 cols (numeric) 0 2 0
1393 + row21 = d[{2 1},];
ROW21 2 rows 3 cols (numeric) 0 2 0 1 0 0
1394 + 1395 + *-- Selecting a submatrix; 1396 + print ab;
AB 2 2 0 0 2 2 0 0 0 0 1 1 0 0 1 1
1397 + row12 = ab[{1 2},];
ROW12 2 rows 4 cols (numeric) 2 2 0 0 2 2 0 0
1398 + a = ab[1:2, 1:2];
A 2 rows 2 cols (numeric) 2 2 2 2
1399 + 1400 + *-- Assigning a row, column or element; 1401 + a[1,] = {6 7};
A 2 rows 2 cols (numeric) 6 7 2 2
1402 + a[,2] = { 0, 1403 + 10};
A 2 rows 2 cols (numeric) 6 0 2 10
1404 + a[2,2]= 0;
A 2 rows 2 cols (numeric) 6 0 2 0
1405 +*page; 1406 + *----------------------------------; 1407 + * Subscript reduction operators ; 1408 + *----------------------------------; 1409 + 1410 + a = { 0 1 2, 5 4 3, 7 6 8 };
A 3 rows 3 cols (numeric) 0 1 2 5 4 3 7 6 8
1411 + 1412 + colsum = a[+,];
COLSUM 1 row 3 cols (numeric) 12 11 13
1413 + rowsum = a[,+];
ROWSUM 3 rows 1 col (numeric) 3 12 21
1414 + colmax = a[<>,];
COLMAX 1 row 3 cols (numeric) 7 6 8
1415 + rowmin = a[,><];
ROWMIN 3 rows 1 col (numeric) 0 3 6
1416 + colmean= a[:,];
COLMEAN 1 row 3 cols (numeric) 4 3.6666667 4.3333333
1417 + colprod= a[#,];
COLPROD 1 row 3 cols (numeric) 0 24 48
1418 + colssq = a[##,];
COLSSQ 1 row 3 cols (numeric) 74 53 77
1419 +*page; 1420 + *-----------------; 1421 + * Missing data ; 1422 + *-----------------; 1423 + 1424 + x = { 1 2 . , 1425 + . 5 6 , 1426 + 7 . 9 };
X 3 rows 3 cols (numeric) 1 2 . . 5 6 7 . 9
1427 + y = { 4 . 2 , 1428 + 2 1 3 , 1429 + 6 . 5 };
Y 3 rows 3 cols (numeric) 4 . 2 2 1 3 6 . 5
1430 + 1431 + sum = x + y;
SUM 3 rows 3 cols (numeric) 5 . . . 6 9 13 . 14
1432 + times = x # y;
TIMES 3 rows 3 cols (numeric) 4 . . . 5 18 42 . 45
1433 + max = x <> y;
MAX 3 rows 3 cols (numeric) 4 2 2 2 5 6 7 . 9
1434 + *-- NB: missing treated as zero; 1435 + colsum= x[+,];
COLSUM 1 row 3 cols (numeric) 8 7 15
1436 +*page; 1437 + *--------------------------------------; 1438 + * Working with vectors and matrices ; 1439 + *--------------------------------------; 1440 + 1441 + coffee = { 4 2 2 3 2, 1442 + 3 3 1 2 2, 1443 + 2 1 0 4 5 };
COFFEE 3 rows 5 cols (numeric) 4 2 2 3 2 3 3 1 2 2 2 1 0 4 5
1444 + days = { Mon Tue Wed Thu Fri };
DAYS 1 row 5 cols (character, size 3) MON TUE WED THU FRI
1445 + names = { 'Lenny', 'Linda', 'Sue'};
NAMES 3 rows 1 col (character, size 5) Lenny Linda Sue
1446 + 1447 + print coffee;
COFFEE 4 2 2 3 2 3 3 1 2 2 2 1 0 4 5
1448 + print coffee[r=names c=days];
COFFEE MON TUE WED THU FRI Lenny 4 2 2 3 2 Linda 3 3 1 2 2 Sue 2 1 0 4 5
1449 + 1450 + *-- Calculate daily and weekly cost at $.50/cup; 1451 + daycost = .50 # coffee;
DAYCOST 3 rows 5 cols (numeric) 2 1 1 1.5 1 1.5 1.5 0.5 1 1 1 0.5 0 2 2.5
1452 + 1453 + ones = j(5,1);
ONES 5 rows 1 col (numeric) 1 1 1 1 1
1454 + weektot = daycost * ones;
WEEKTOT 3 rows 1 col (numeric) 6.5 5.5 6
1455 + weektot = daycost[,+];
WEEKTOT 3 rows 1 col (numeric) 6.5 5.5 6
1456 + daytot = daycost[+,];
DAYTOT 1 row 5 cols (numeric) 4.5 3 1.5 4.5 4.5
1457 + total = daycost[+,+];
TOTAL 1 row 1 col (numeric) 18
1458 + 1459 + print coffee[r=names c=days] weektot[format=dollar7.2] , 1460 + daytot[c=days f=dollar8.2] ' ' total[f=dollar7.2];
COFFEE MON TUE WED THU FRI WEEKTOT Lenny 4 2 2 3 2 $6.50 Linda 3 3 1 2 2 $5.50 Sue 2 1 0 4 5 $6.00 DAYTOT MON TUE WED THU FRI TOTAL $4.50 $3.00 $1.50 $4.50 $4.50 $18.00
1461 + 1462 + rowmean = coffee[,:];
ROWMEAN 3 rows 1 col (numeric) 2.6 2.2 2.4
1463 + colmean = coffee[:,];
COLMEAN 1 row 5 cols (numeric) 3 2 1 3 3
1464 + 1465 + most = weektot[<>];
MOST 1 row 1 col (numeric) 6.5
1466 + index= weektot[<:>];
INDEX 1 row 1 col (numeric) 1
1467 + who = names[index];
WHO 1 row 1 col (character, size 5) Lenny
1468 + 1469 + *-- Sum of squares and cross-products matrix; 1470 + n = nrow(coffee);
N 1 row 1 col (numeric) 3
1471 + sscp = coffee` * coffee;
SSCP 5 rows 5 cols (numeric) 29 19 11 26 24 19 14 7 16 15 11 7 5 8 6 26 16 8 29 30 24 15 6 30 33
1472 + 1473 + *-- Deviations from column means; 1474 + dev = coffee - J(n,1) * colmean;
DEV 3 rows 5 cols (numeric) 1 0 1 0 -1 0 1 0 -1 -1 -1 -1 -1 1 2
1475 + *-- Corrected SSCP matrix; 1476 + sscp= dev` * dev;
SSCP 5 rows 5 cols (numeric) 2 1 2 -1 -3 1 2 1 -2 -3 2 1 2 -1 -3 -1 -2 -1 2 3 -3 -3 -3 3 6
1477 + *-- Variance covariance matrix; 1478 + cov = sscp / (n-1);
COV 5 rows 5 cols (numeric) 1 0.5 1 -0.5 -1.5 0.5 1 0.5 -1 -1.5 1 0.5 1 -0.5 -1.5 -0.5 -1 -0.5 1 1.5 -1.5 -1.5 -1.5 1.5 3
1479 + *-- Standard deviations; 1480 + std = sqrt( diag(cov) );
STD 5 rows 5 cols (numeric) 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1.7320508
1481 + *-- Correlation matrix; 1482 + corr= inv(std) * cov * inv(std);
CORR 5 rows 5 cols (numeric) 1 0.5 1 -0.5 -0.866025 0.5 1 0.5 -1 -0.866025 1 0.5 1 -0.5 -0.866025 -0.5 -1 -0.5 1 0.8660254 -0.866025 -0.866025 -0.866025 0.8660254 1
1483 + print corr[r=days c=days f=7.2];
CORR MON TUE WED THU FRI MON 1.00 0.50 1.00 -0.50 -0.87 TUE 0.50 1.00 0.50 -1.00 -0.87 WED 1.00 0.50 1.00 -0.50 -0.87 THU -0.50 -1.00 -0.50 1.00 0.87 FRI -0.87 -0.87 -0.87 0.87 1.00
1484 + quit;
Exiting IML.
NOTE: The PROCEDURE IML used 0.38 seconds. NOTE: %INCLUDE (level 1) ending.