SAS IML. Использование языка SAS IML. Основы IML (Лекции 2013)
Описание файла
Файл "SAS IML. Использование языка SAS IML. Основы IML" внутри архива находится в папке "Лекции 2013". PDF-файл из архива "Лекции 2013", который расположен в категории "". Всё это находится в предмете "(ппп соиад) (sas) пакеты прикладных программ для статистической обработки и анализа данных" из 10 семестр (2 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Использование языка 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.