SAS IML. Использование языка SAS IML. Основы IML (1185352)
Текст из файла
Использование языка SAS/IMLЛекция 1. Основы IML.http://tiny.cc/msu_sasЗвежинский Дмитрий,SAS Russia/CISdmitry.zvezhinsky@sas.comЗамечания об ошибках и опечатках просьба направлять лектору.1Что такое IML?••Это процедура языка SAS (PROC IML;), внутри которой можно создавать своипрограммы на специальном языке.Синтаксис этого языка упрощает работу с матрицами (линейная алгебра,матричные операторы), а также содержит встроенные алгоритмы для решенияразных задач:– Численное решение линейных уравнений, систем уравнений– Численное решение диф. уравнений и систем диф. уравнений– Статистический анализ в духе «Большого SAS», т.е.
генерирование отчетов сопределенной структурой– Манипуляции наборами данных SAS– Написание собственных процедур/функций, которые, правда, работают только внутриIML– Написание программ: циклы, операторы условного перехода, …– Оптимизация– Вэйвлет- и Фурье-преобразования– Вызов процедур и функций из «Большого SAS»– …2Простейшие матричные операции• Основной объект – двумерная матрица.• Тип матрицы – числовой или символьный (смешиватьнельзя).proc iml;a={1 2,3 4};print (a);quit;15proc iml;NOTE: IML Ready16a={1 'a',3 'b'};ERROR: Mixing character with numeric in matrix literal at line=16 col=8.17print (a);ERROR: Matrix a has not been set to a value.• Доступ к элементам матрицы – по индексам:proc iml;a={1 2 3,4 5 6};print a ,, (a[1,2]) ,, (a[{1 2},2]);quit;Индексы можно задавать спомощью матрицы3Простейшие матричные операции• Особенность – всё кроме цифр считается символьнымзначением:proc iml;a={1 2,3 4};b={1 1+1,3 4};c={1 (1+1),3 4};d1=1+1;d2={1 d1,3 4};print a,,b,,c;quit;17b={1 1+1,3 4};_22200ERROR: Unequal number of elements per row in literal at line=17 col=16.4Матрицы•Можно посмотреть тип матрицы и кол-во строк/столбцов:proc iml;a={1 2,3 4};print (a[1,1]);show names;a=j(2,2,"");a[1,1]="PRIVET!";print (a[1,1]);show names;quit;••Матрицы можно переопределять.
Размер элемента символьной матрицыможно поменять, только переопределив её.Матрицы можно сохранить в каталоге - хранилище (WORK.IMLSTOR), ипользоваться ими на другом шаге IML:proc iml;a={1 2,3 4};store a;quit;proc iml;load a;print (a[1,1]);quit;proc catalog catalog=work.imlstor;contents;run;5Простейшие матричные операции•Есть матричные и поэлементные операции (проверяйте размерность!)= Т( )• Операции сравнения и минимума/максимума:proc iml;a={1 2,3 4};b={0 0,5 6};print a b ,'a<>b',(a<>b); *set maximum;b={2,3};print a b, 'a<b',(a<b);quit;6Subscript reduction operatorsоператоры сведения (матриц) по индексам (???)• Позволяют преобразовывать матрицы по заданному правилу поуказанному измерению:proc iml;a={1 2 3, 4 5 6,7 8 9};print (a[+, ]),,(a[+,<>]),,(a[+,<:>]);quit;Пример 1: суммируем по строчкам, кол-воСтолбцов остаётся как в исходной матрице.Пример 2: сначала суммируем по строчкам, потомищем максимум в получившейся матрице.Аналогичный результат дает последовательноеприменение reduction operators: (a[+,][,<>])Пример 3: суммируем по строчкам, и в полученной матрице ищем индекс (номерстолбика), где лежит максимум.Если reduction operators есть сразу в двух измерениях, сначала выполняется первый (длястрок), потом второй (для столбиков).7Простейшие матричные преобразования••••••inv (A) – обратная матрицаtrace (A) – след матрицы (сумма диаг.
эл-тов A*A)abs(A) – модуль каждого элементаsum(A,B) – сумма всех элементов из всех матрицnrow(A), ncol(B) – кол-во строк (столбцов)j (n, m, “privet!”) – матрица n строк, m столбцов, состоящая изтекстовой константы “privet!”• diag(A) – возвращает матрицу того же размера, все элементы кромедиагональных заполняются нулями• i (n) – единичная матрица размером (n x n)• loc (A) – возвращает индексы ненулевых элементов, в частностиможно найти эл-ты, удовлетворяющие условию.8МодулиВстроенные функции:• Support.sas.com/documentation• SAS/IML 9.3 User's GuideПользовательские (называются модули):• Можно их определять прямо в proc iml :START <name> <( arguments )> <GLOBAL( arguments )> ;…FINISH <name> ;• Пользоваться можно тоже только внутри IML.• Есть в виде подпрограмм (subroutine, запускаются оператором CALL),либо в виде функций (function), которые могут вернуть какое-тозначение.
Отличаются только наличием оператора Return внутримодуля (если он есть – это функция).9Модули•Область видимости для переменных: зависит от того, есть ли в определённоммодуле аргументыЕсть (it depends):•Нет (все перем. глобальные):Из модуля-процедуры без аргументов можно ссылаться на глобальныепеременные, которые определятся позднее (из модуля-функции нельзя):proc iml;start test ;print a;finish;a=5;call test;quit;10Модули• Вложенные модули преобразуются так, чтобы у них был один (и тот же)уровень вложенности.• Выражения в качестве аргументов – вычисляются, но хранятся каклокальная копия аргумента:proc iml;start test(in,out);out=in+1;print in out;finish;inx={1 2 3};outx={1 2 3};out=0;call test(inx[1],outx[1]);print (outx[1]);call test(inx[1],out);print (out);quit;Значение выражения (которое нужно как-товычислить) видно внутри модуля, но онохранится как локальная копия! И вернуть этулокальную копию в глобальную областьвидимости нужно явно.Во втором вызове out – это не выражение(его не нужно вычислять), а имя матрицы.Через него можно возвратить значение вглобальную область видимости.11Глобальная или локальная переменная?Резюме1.
Переменная инициализируется вне модуля – глобальная2. Переменная инициализируется внутри модуля, но у модуля отсутствуютаргументы – глобальнаяstart test;output=input+1;finish;input=5;output=0;call test;print output;output63. Переменная передаётся как аргумент в модуль – внутри модуля с ней можноработать как с глобальнойstart test(input,output);output=input+1;finish;in=5;out=0;call test(in,out);out64.
С помощью опции Global указываем переменную – внутри модуля она будетсчитаться глобальной.5. Если в качестве аргумента передаётся выражение, а не матрица, топеременная, которая в него входит, не считается глобальной переменной.12Глобальная или локальная переменная?proc iml;x={1 2 3 4 5};start sum1(x);return (x[1]+x[2]);finish;do i=1 to 4;print(sum1(x[i]||x[i+1]));end;quit;proc iml;x={1 2 3 4 5};start sum1;c=x[i]+x[i+1];finish;c=0;do i=1 to 4;call sum1;print (c);end;quit;х – глобальнаяа внутри модуля?(локальная)В качестве аргумента передаёмглоб.
переменнуюх – глобальнаяа внутри модуля?(как и «i», глобальная)13Глобальная или локальная переменная?proc iml;start sum1(m) global (x);c=x[m]+x[m+1];finish;x={1 2 3 4 5};c=0;do i=1 to 4;call sum1(i);print (c);end;quit;х – глобальная, m-локальнаяСоздаём вектор-строку хВызываем модуль.14Хранение модулей• В IML есть механизм для хранения модулей (для ихпоследующего использования) и матрицproc iml;start test;print "this is a test";finish;STORE MODULE= test;quit;proc iml;LOAD MODULE= test;call test;quit;3568NOTE:3569NOTE:NOTE:NOTE:STORE MODULE= test;Opening storage library WORK.IMLSTORquit;Exiting IML.Storage library WORK.IMLSTOR closed.PROCEDURE IML used (Total process time):real time0.00 secondscpu time0.00 seconds3570 proc iml;NOTE: IML Ready3571LOAD MODULE= test;NOTE: Opening storage library WORK.IMLSTOR• You can view the names of the modules in storage with theSHOW statement, as follows:show storage;15Элементы языка IML• Циклы:скобочки в условии обязательны!скобочки в условии обязательны!16Элементы языка IML• Оператор условного перехода:proc iml;if .
then do;print ". is true";end;if 0 then do;print "0 is true";end;quit;Программа ничего не печатает.Попробуйте добавить операторотрицания «^» перед условием.• Условие должно возвращать число. Истина – этолюбое значение кроме нуля и пропущенногозначения.• Если в условии один оператор, то группу do; .. end;можно не добавлять.• есть дополняющий оператор “else … ;”17Элементы языка IML• Оператор PRINT – вывод в отчет результатов и отладочнойинформации.
Общий вид вот такой:PRINT <matrices> (expression) "message" pointers <[options]> ;• Если нужно вычислить выражение (вывести элементыматрицы, арифметика, функции) – указывайте его вскобочках!• pointers – управляет разбивкой по строкам ( , ) и постраницам ( / )• Можно подписывать строки и столбцы при выводе на экран:proc iml;x = {45.125 50.500,75.375 90.825};r = {"Div A" "Div B"};c = {"Amount" "Net Pay"};print x[rowname=r colname=c format=12.2];quit;18Интеграция IML и SASЧтение наборов данных:1) Открыть набор данных для чтения:proc iml;use test;2) Прочитать нужные столбцы в матрицы:read all var {a} into char_test;read all var {b} into num_test;print char_test num_test;quit;19Интеграция IML и SAS• Мы помним, что в матрице можно хранить данные толькоодного типа.
Размер для хранения данных берётся издескриптора набора данных:data test;length a $ 3 text $ 200;input a $ b text $ ;datalines;aaa 10 blahblahblahbbb 20 blahblahblahccc 30 blahblahblahddd 40 blahblahblah;run;proc iml;use test;SYMBOLROWSCOLS TYPESIZE----------- ------ ---- -----char_test41 char3num_test41 num8text_test41 char200show datasets;read all var {a} into char_test;read all var {b} into num_test;read all var {text} into text_test;print (char_test || text_test);show names;quit;20Интеграция IML и SASЗапись наборов данных• 1) Создать набор данных с помощью оператора Create,• 2) заполнить набор данных из матрицы – оператор Append:proc iml;x=repeat(do(1,3,1),3,1);y=repeat(T(do(1,3,1)),1,3);print x y;create test1 from x;append from x;create test2 from y;append from y;quit;3849 quit;NOTE: Exiting IML.NOTE: The data set WORK.TEST1 has 3 observations and 3variables.NOTE: The data set WORK.TEST2 has 3 observations and 3variables.21Интеграция IML и SASОператор Use – открыть набор данных и сделать его текущим дляввода/вывода (то есть тем набором, который будет использованоператорами Read, Edit, Append, …)Setin/Setout – выбрать текущий набор для ввода/выводаcreatecreatesetoutappendsetoutappendtest1 from x;test2 from y;test1;from x;test2;from y;Close ..
; – закрыть набор данных, открытый операторами Use, Create, EditShow datasets; - статус наборов данных, использованных в текущем сеансеIML.22Преобразования типов• Символы в число: NUMc = {"1" "2" "3"};reset print; /*display values and type of matrices*/m = num(c);• Числа в символы:CHAR( matrix <, w> <, d> ) ;a = {-1.1 0 3.1415 4};reset print; /*display values and type of matrices*/m = char(a, 4, 1);23Вызов процедур SAS из IMLSUBMIT <parameters> </ options> ;language statements!!! Наличие пробела между “T” и “;” приводит к зависанию IMLENDSUBMIT;• Пример :proc iml;x=do(-10,10,0.5);eps=j(1,ncol(x),1);call randgen(eps, "normal", 0,2);y=3#x+5+eps;data_iml=(T(x//y));create test1 from data_iml;append from data_iml;close test1;SUBMIT;proc reg data=test1;model col2=col1;quit;ENDSUBMIT;quit;Любопытно, что внутрь SUBMIT можнопередавать переменные из IML:proc iml;VarName = "Sex";submit VarName;proc freq data=Sashelp.Class;table &VarName / out=OutFreq;run;endsubmit;quit;24Работа с памятью• Для размещения матриц используется выделяемая впамяти область (Workspace)• Что будет, если мы всю её займём?ERROR: (execution) Unable to allocate sufficient memory.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.